This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

TMS320F28335: SPI not working with MT25QL128ABA Nor Flash

Part Number: TMS320F28335

Hi there,

I have SPI code that work perfectly with MCP3202 (Microchip ADC), but it didn't work with MT25Q nor flash.

Schematics looks like this:

And here is the code:

void spi_init() {
    EALLOW;
    GpioCtrlRegs.GPAMUX1.bit.GPIO8 = 0; // GPIO8
    GpioCtrlRegs.GPADIR.bit.GPIO8 = 1; // direction is output
    GpioDataRegs.GPASET.bit.GPIO8 = 1; // output = 1
    GpioCtrlRegs.GPAMUX2.bit.GPIO19 = 0; // GPIO19
    GpioCtrlRegs.GPADIR.bit.GPIO19 = 1; // direction is output
    GpioDataRegs.GPASET.bit.GPIO19 = 1; // output = 1
    EDIS;

    SpiaRegs.SPICCR.bit.SPISWRESET = 0; // SW reset
    SpiaRegs.SPICCR.bit.SPICHAR = 7; // 8 bits words
    SpiaRegs.SPICCR.bit.CLKPOLARITY = 0; // rising edge
    SpiaRegs.SPICCR.bit.SPILBK = 0; // disable loop back

    SpiaRegs.SPISTS.all = 0xFF; // clear INT bits

    SpiaRegs.SPICTL.bit.MASTER_SLAVE = 1; // DSP is master
    SpiaRegs.SPICTL.bit.CLK_PHASE = 0; // rising edge without delay
    SpiaRegs.SPICTL.bit.TALK = 1; // enable TX
    SpiaRegs.SPICTL.bit.SPIINTENA = 0; // disable interrupts
    SpiaRegs.SPICTL.bit.OVERRUNINTENA = 0; // disable over run int

    SpiaRegs.SPIBRR = 127; // LSPCLK / (SPIBRR + 1) = 120 / (127 + 1) = approximate 1 Mhz

    SpiaRegs.SPIFFTX.bit.SPIRST = 0; // reset tx & rx
    SpiaRegs.SPIFFTX.bit.SPIFFENA = 1; // enable fifo enhanced op
    SpiaRegs.SPIFFTX.bit.TXFIFO = 0; // reset fifo ptr to zero
    SpiaRegs.SPIFFTX.bit.TXFFIENA = 0; // disable TX fifo interrupts

    SpiaRegs.SPIFFRX.bit.RXFIFORESET = 0; // reset FIFO
    SpiaRegs.SPIFFRX.bit.RXFFIENA = 1; // enable RX fifo interrupts
    SpiaRegs.SPICTL.bit.SPIINTENA = 1; // enable generating interrupts
    SpiaRegs.SPIFFRX.bit.RXFIFORESET = 1; // stop reset FIFO

    SpiaRegs.SPIFFCT.all = 10; // 10 bit delay between 2 words

    SpiaRegs.SPIPRI.bit.FREE = 0;
    SpiaRegs.SPIPRI.bit.SOFT = 0; // stop on emulation

    SpiaRegs.SPIFFTX.bit.SPIRST = 1; // enable tx & rx
    SpiaRegs.SPIFFTX.bit.TXFIFO = 1; // enable fifo operation
    SpiaRegs.SPICCR.bit.SPISWRESET = 1; // stop SW reset
}

int read_ps_voltage(void) {
    Uint16 i, send[3], recv[3], volt;
    GpioDataRegs.GPACLEAR.bit.GPIO8 = 1; // CS for MSP3202, set to 0
    send[0] = 0x0100;
    send[1] = 0xA000;
    send[2] = 0x0000;

    for (i = 0; i < 3; i++) {
        SpiaRegs.SPITXBUF = send[i];
        while (SpiaRegs.SPIFFRX.bit.RXFFST != 1);
        recv[i] = SpiaRegs.SPIRXBUF;
    }

    volt = (recv[1] << 8) & 0x0F00;
    volt = volt | recv[2];
    GpioDataRegs.GPASET.bit.GPIO8 = 1; // CS for MSP3202, set to 1

    return volt;
}

int read_flash_id() {
    Uint16 i, send[2], recv[2];
    GpioDataRegs.GPACLEAR.bit.GPIO19 = 1; // CS for MT25Q, set to 0
    send[0] = 0x9E00;
    send[1] = 0x0000;

    for (i = 0; i < 2; i++) {
        SpiaRegs.SPITXBUF = send[i];
        while (SpiaRegs.SPIFFRX.bit.RXFFST != 1);
        recv[i] = SpiaRegs.SPIRXBUF;
    }

    GpioDataRegs.GPASET.bit.GPIO19 = 1; // CS for MT25Q, set to 1
    return recv[1];
}

Uint16 ps_volt = 0;
Uint16 flash_id = 0;

void main() {
    /* do some inits here */
    spi_init();
    ps_volt = read_ps_voltage(); // read from mcp3202
    flash_id = read_flash_id(); // read from mt25q
    /* do other stuff... */
}

Beside, I probed the all 4 signals (CS*, CLK, DQ0, DQ1) on MT25Q pin, and all looks just fine except DQ1 (connected to C2000 MISO) did not have any signal output (which expected to get a byte of ID - 20h), which I get low signal all the way for this pin.

Attached with MT25Q datasheet.

mt25q_qlhs_l_128_aba_0.pdf

Please advise.