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.

TMS320F28069: MCP23S17

Part Number: TMS320F28069

Reading MCp23S17 Over SPI Problem

I am unable to read from MCP23S17 I/O Expander and Writing to the I/O Expander works fine.

Uint16 SPI0_Write(Uint16 data)
{
Uint16 rdata=0;
SpibRegs.SPITXBUF=(data<<8);

while(SpibRegs.SPISTS.bit.INT_FLAG ==0) {} // Wait until data received

rdata = SpibRegs.SPIRXBUF;

return rdata;

}


unsigned char SPI0_Read()
{
unsigned int rxdata;
SpibRegs.SPITXBUF = 0x00; // Master transmits data
while(SpibRegs.SPISTS.bit.INT_FLAG ==0) {} // Wait until data received
rxdata = SpibRegs.SPIRXBUF; // dummy read to clear INT flag

return (rxdata);

}


void SPI_Init(void)
{

        SpibRegs.SPIPRI.bit.TRIWIRE =1;//3-wire Mode
        SpibRegs.SPICCR.bit.SPICHAR = 0x7; // 16-bit char bits
        SpibRegs.SPICCR.bit.CLKPOLARITY = 1;
        SpibRegs.SPICTL.bit.CLK_PHASE = 1;
        SpibRegs.SPICTL.bit.MASTER_SLAVE = 1;
        SpibRegs.SPICTL.bit.TALK = 1; // Enable master mode, normal phase,
        // enable talk, and SPI int disabled.

        SpibRegs.SPIBRR = 63; // 15 -> 1Mbps
        SpibRegs.SPICCR.bit.SPISWRESET = 1; // Relinquish SPI from Reset
        SpibRegs.SPIPRI.bit.FREE = 1; // Set so breakpoints don't disturb xmission


}


void MCP23S17_write(unsigned char address, unsigned char value)
{
    GpioDataRegs.GPADAT.bit.GPIO21=0;//CS ENABLE
    SPI0_Write(IO_DEVICE_ADDRESS_WRITE);
    SPI0_Write(address);
    SPI0_Write(value);
    GpioDataRegs.GPADAT.bit.GPIO21=1;//CS DISABLE
}


unsigned char MCP23S17_read(unsigned char address)
{
    unsigned char received_data = 0;
    GpioDataRegs.GPADAT.bit.GPIO21=0;//CS ENABLE
    SPI0_Write(IO_DEVICE_ADDRESS_READ);
    SPI0_Write(address);
    SPI0_Write(0x00);
    received_data = SpibRegs.SPIRXBUF;
    GpioDataRegs.GPADAT.bit.GPIO21=1;//CS DISABLE
    return received_data;
}