通过 SPI 读取 MCp23S17时出现问题
我无法从 MCP23S17 I/O 扩展器读取数据,并且写入 I/O 扩展器的操作正常。
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;
}