[技术问答] spi

[复制链接]
1268|5
 楼主| shen_hao 发表于 2017-12-19 14:00 | 显示全部楼层 |阅读模式
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,这样也算是解决问题了。

               
       


antusheng 发表于 2017-12-19 15:07 | 显示全部楼层
噢?是因为接收方的问题?
xuanhuanzi 发表于 2017-12-19 15:23 | 显示全部楼层
SPI在众多接口里面应该是最简单的一种了
xinxianshi 发表于 2017-12-19 16:46 | 显示全部楼层
楼主用的哪个单片机?
heisexingqisi 发表于 2017-12-31 22:20 来自手机 | 显示全部楼层
好方法
小明的同学 发表于 2017-12-31 22:48 来自手机 | 显示全部楼层
莫非是头文件错了?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

79

主题

230

帖子

2

粉丝
快速回复 在线客服 返回列表 返回顶部