Getting wrong data from SPI Flash SST25VF010A

flashspi

I'm trying to interface an mcu (tm4c123) with external SPI flash memory SST25VF010A.
I execute the Read-ID instruction, but instead of gettting BF and 49 (manufacturer and device ids) – I get BC and 41.

Reading the status register also gives weird results – on startup I get 0x8 and after executing the write enable instruction, I get 0xC.
Looking at the datasheet and boot up values, I would expect it to be more like the opposite – 0xC on startup and perhaps 0x0 after write enable…

Here is my code:

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
}

Any idea what I'm doing wrong?
Thanks!

Best Answer

It turns out that my cheap junky logic analyzer was putting some noise on the MISO line, so the received data gets slightly shifted. When I unplugged its MISO line - the data is now fine. Truly unbelievable...

Related Topic