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; }