OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 2966|回复: 4

SPI通讯代码的一些不解,请大神解答

[复制链接]

16

主题

75

帖子

0

精华

高级会员

Rank: 4

积分
572
金钱
572
注册时间
2018-4-16
在线时间
77 小时
发表于 2018-8-16 15:13:25 | 显示全部楼层 |阅读模式
1金钱
spi.c节选一个函数   spi读写函数
u8 SPI2_ReadWriteByte(u8 TxData)
{  
u8 retry=0;      
while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_TXE) == RESET) //检查指定的SPI标志位设置与否:发送缓存空标志位
  {
  retry++;
  if(retry>200)return 0;
  }     
SPI_I2S_SendData(SPI2, TxData); //通过外设SPIx发送一个数据
retry=0;
while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_RXNE) == RESET) //检查指定的SPI标志位设置与否:接受缓存非空标志位
  {
  retry++;
  if(retry>200)return 0;
  }            
return SPI_I2S_ReceiveData(SPI2); //返回通过SPIx最近接收的数据         
}

这是原子哥的代码。我有点不解。采用这种retry自增的方式超时退出的机制,一定程度上避免了死在等待上,假设没有retry,假设执行while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_RXNE) == RESET);到这一步恰好从机可能是坏的没有返回数据,那么就会死在这里;现在要是从机是好的但从机返回的数据刚好要是0x00,如何区分到底是读写失败返回的0还是读写成功后从机返回的0呢?还是说这样写是因为从机一定不会返回0x00?

最佳答案

查看完整内容[请看2#楼]

哇。。突然间懂了。。被我刚才上一楼回复你的那段话惊醒。根本不存在卡死在等待接收上。就算从机坏了始终是一个固定电平那么主机在发完数据的时候肯定同步收到数据。最多是数据线没有变动接收到0x00或者0xff。发完肯定能接收到。顶多接收的数据是没有点平变化的数据(0x00或者0xff),肯定不会卡在等待接收上。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

16

主题

75

帖子

0

精华

高级会员

Rank: 4

积分
572
金钱
572
注册时间
2018-4-16
在线时间
77 小时
 楼主| 发表于 2018-8-16 15:13:26 | 显示全部楼层
Dayfly 发表于 2018-8-16 16:40
正常情况下 从机应该绝对不会返回0  数据的传输就在于变化的电平  如果返回0  电平没有变化  跟故障没有区 ...

哇。。突然间懂了。。被我刚才上一楼回复你的那段话惊醒。根本不存在卡死在等待接收上。就算从机坏了始终是一个固定电平那么主机在发完数据的时候肯定同步收到数据。最多是数据线没有变动接收到0x00或者0xff。发完肯定能接收到。顶多接收的数据是没有点平变化的数据(0x00或者0xff),肯定不会卡在等待接收上。
回复

使用道具 举报

11

主题

87

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
493
金钱
493
注册时间
2013-11-26
在线时间
113 小时
发表于 2018-8-16 16:40:54 | 显示全部楼层
本帖最后由 Dayfly 于 2018-8-16 16:43 编辑

正常情况下 从机应该绝对不会返回0  数据的传输就在于变化的电平  如果返回0  电平没有变化  跟故障没有区别吧   各人理解  不知是否有错误另外SPI应该有固定的传输协议吧  可以看看协议的详细内容
回复

使用道具 举报

160

主题

967

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2097
金钱
2097
注册时间
2014-3-7
在线时间
491 小时
发表于 2018-8-16 17:26:03 | 显示全部楼层
这个函数不会死了吧!
回复

使用道具 举报

16

主题

75

帖子

0

精华

高级会员

Rank: 4

积分
572
金钱
572
注册时间
2018-4-16
在线时间
77 小时
 楼主| 发表于 2018-8-16 17:33:37 | 显示全部楼层
比如说我现在有一个SPI设备。我往0x55(我随便编的一个地址)寄存器中写入一个0x00,然后再从0x55寄存器中读取出来。这样来测试SPI总线工作是否正常。数据的传输是在于变化的电平。只要SCK在跳动 数据线在时钟对应边沿采集就行了。假设数据线传输出现了故障。SPI还是能读取到信息的吧。比如数据线被持续拉高那么返回数据就是0xFF。我只是在SCK对应边沿取得那一刻的状态。  回到刚才的问题我从0x55寄存器读到的值肯定是我先前写进去的0x00.如果读出来不是0x00那么SPI传输有问题。如果读出来是0x00那么让人分不清是读取失败的0x00还是读取正确的从机返回的0x00
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-18 15:05

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表