打印
[复制链接]
913|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 | 只看该作者
楼主用的哪个单片机?

使用特权

评论回复
5
heisexingqisi| | 2017-12-31 22:20 | 只看该作者
好方法

使用特权

评论回复
6
小明的同学| | 2017-12-31 22:48 | 只看该作者
莫非是头文件错了?

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

79

主题

230

帖子

2

粉丝