Obtención de datos erróneos desde SPI Flash SST25VF010A

0

Estoy intentando conectar un mcu (tm4c123) con la memoria flash externa SPI SST25VF010A. Ejecuto la instrucción Read-ID, pero en lugar de obtener BF y 49 (ID de fabricante y dispositivo), obtengo BC y 41.

La lectura del registro de estado también proporciona resultados extraños: en el inicio obtengo 0x8 y después de ejecutar la instrucción de habilitación de escritura, obtengo 0xC. Mirando la hoja de datos y los valores de arranque, esperaría que fuera más bien lo contrario: 0xC en el inicio y quizás 0x0 después de habilitar la escritura ...

Aquí está mi código:

void ConfigureSPIFlash()
{
    MAP_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOD);
    MAP_SysCtlPeripheralEnable(SYSCTL_PERIPH_SSI1);

    // Enable pin PD2 for SSI1 SSI1RX
    MAP_GPIOPinConfigure(GPIO_PD2_SSI1RX);
    MAP_GPIOPinTypeSSI(GPIO_PORTD_BASE, GPIO_PIN_2);

    // Enable pin PD0 for SSI1 SSI1CLK
    MAP_GPIOPinConfigure(GPIO_PD0_SSI1CLK);
    MAP_GPIOPinTypeSSI(GPIO_PORTD_BASE, GPIO_PIN_0);

    // Enable pin PD1 for Chip Enable
    MAP_GPIOPinTypeGPIOOutput(GPIO_PORTD_BASE, GPIO_PIN_1);
    MAP_GPIOPinWrite(GPIO_PORTD_BASE, GPIO_PIN_1, GPIO_PIN_1);

    // Enable pin PD3 for SSI1 SSI1TX
    MAP_GPIOPinConfigure(GPIO_PD3_SSI1TX);
    MAP_GPIOPinTypeSSI(GPIO_PORTD_BASE, GPIO_PIN_3);

    MAP_SSIConfigSetExpClk(SSI1_BASE, MAP_SysCtlClockGet(), SSI_FRF_MOTO_MODE_0, SSI_MODE_MASTER, 125000, 8);

    MAP_SSIEnable(SSI1_BASE);

    uint32_t r;
    while(SSIDataGetNonBlocking(SSI1_BASE, &r)){}
}


unsigned char SPI_transmit(unsigned char data)
{
    SSIDataPut(SSI1_BASE, data);
    uint32_t r;
    SSIDataGet(SSI1_BASE, &r);

    return (unsigned char)r;
}

void main(void)
{
    ROM_FPUEnable();
    ROM_FPULazyStackingEnable();

    SysCtlClockSet(SYSCTL_SYSDIV_4| SYSCTL_USE_PLL | SYSCTL_XTAL_16MHZ |SYSCTL_OSC_MAIN);

    ConfigureUART();

    ConfigureSPIFlash();
    UARTprintf("spi flash ready\n");

    uint8_t res;

    // send Read-ID command
    GPIOPinWrite(GPIO_PORTD_BASE, GPIO_PIN_1, ~GPIO_PIN_1); // CE low
    SPI_transmit(0x90);
    SPI_transmit(0x00);
    SPI_transmit(0x00);
    SPI_transmit(0x01);

    // get response
    res = SPI_transmit(0xff);
    UARTprintf("received: 0x%x\n", res);

    GPIOPinWrite(GPIO_PORTD_BASE, GPIO_PIN_1, GPIO_PIN_1);  // CE high
}

¿Alguna idea de lo que estoy haciendo mal? Gracias!

    
pregunta Lacho Tomov

1 respuesta

1

Resulta que mi analizador de lógica de chatarra barato estaba poniendo algo de ruido en la línea MISO, por lo que los datos recibidos se modifican ligeramente. Cuando desenchufé su línea MISO, los datos ahora están bien. Realmente increíble ...

    
respondido por el Lacho Tomov

Lea otras preguntas en las etiquetas