spi记录:master读写函数
uint32_t spi_rw(uint32_t data)
{
uint32_t temp;
//SPI_SET_SS_LOW(SPI0);
SET_SLAVE1_LOW; //这个是控制从机的GPIO
SPI_WRITE_TX(SPI0, data);
while(SPI_IS_BUSY(SPI0));
temp = SPI_READ_RX(SPI0);
SET_SLAVE1_HIGH;
return temp;
}
master读写过程:
s=spi_rw(0x1);
temp = spi_rw(0xff);
slave接收过程
if(temp == 1)//1表示自己标号,如果对,就回复1
{
//SPI_READ_RX(SPI0);
SPI_WRITE_TX(SPI0, 1); /* Write to TX FIFO */
break;
}
if(SPI_GET_RX_FIFO_EMPTY_FLAG(SPI0) == 0)
{
temp= SPI_READ_RX(SPI0);
}
总结 : 这样会多出一个数据,在master中,一对rx tx是一次传输,传输了两次,尝试解决这个问题:反正就是会多收一个数,我在这里尝试了几种方法:
slave://SPI_READ_RX(SPI0); //强行读,没用它本身就是同步通讯,放在while后面
//spi_rw(0xff); //毫无意义,
//I2S_CLR_RX_FIFO(SPI0); //这个也没办法
master:如果把master中两次读写改成一次,不行,这个可以理解,第一次读写,slave没有tx,所以master receive data is 0,
主机第二次读写的时候,slave里对应的是temp == 1 的括号里,把rx tx都写上,希望能把rx FIFO里的数据读出来,不要在后面的循环中再读。
这点是个问题:rx丝毫没有起到作用,
最后干脆把slave定义数组的大小相关宏定义从32-->33,这样也算是解决问题了。
|