OpenEdv-开源电子网

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

请教 u8 SPIx_ReadWriteByte(u8 TxData) 函数

[复制链接]

10

主题

19

帖子

1

精华

中级会员

Rank: 3Rank: 3

积分
229
金钱
229
注册时间
2010-12-14
在线时间
0 小时
发表于 2011-1-6 16:12:29 | 显示全部楼层 |阅读模式
u8 SPIx_ReadWriteByte(u8 TxData)
{  
     u8 retry=0;     
     while((SPI1->SR&1<<1)==0)//等待发送区空 
     {       
          retry++;
          if(retry>200)return 0; 
     }     
     SPI1->DR=TxData;     //发送一个byte  
     retry=0;
     while((SPI1->SR&1<<0)==0) //等待接收完一个byte  
     {        
          retry++;
          if(retry>200)return 0;
     }             
     return SPI1->DR;          //返回收到的数据       
}

这个函数是在无线通信实验里的SPI.C文件里的最后一个函数,看得很迷惑呀!
我认为SPI1->DR=TxData;这句话应该放到第一个while循环前面才合适;
理解如下:
先往DR里写一个待发送的数据:SPI1->DR=TxData;
然后执行第一个while循环,等待发送缓冲区里面的数据发完。不知道对不?初学,不要见笑!

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2011-1-6 18:28:47 | 显示全部楼层
你这个问题,引出了我现有例程的一个小bug,就是串口发送数据(使用printf)的时候,第一个字节会收错误.
为什么呢?
现有串口printf的发送执行函数fputc函数如下:
int fputc(int ch, FILE *f)
{      
USART1->DR = (u8) ch;      
while((USART1->SR&0X40)==0);//循环发送,直到发送完毕   
return ch;
}
这就是你说的,要先给USART1->DR写入一个数据,然后等待发送完成.
但事实上,这样的做法,往往导致第一个字节接收错误.原因就是USART1->SR的第六位清除序列为先读USART1->SR再写USART1->DR,而我们的做法相反,所以导致了第一个字节的发送错误.
正确的写法应该为:
int fputc(int ch, FILE *f)
{      
while((USART1->SR&0X40)==0);//循环发送,直到发送完毕   
USART1->DR = (u8) ch;      
return ch;
}

实际上,这种做法才是可靠的,在写之前,你必须先判断这个地方能不能写?
所以你的SPI操作,也就是先要判断SPI1->SR,然后再执行写 SPI1->DR的操作.

你说的办法也是可以,但是可能存在和串口一样的问题,就是第一个字节会丢失.



我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

10

主题

19

帖子

1

精华

中级会员

Rank: 3Rank: 3

积分
229
金钱
229
注册时间
2010-12-14
在线时间
0 小时
 楼主| 发表于 2011-1-7 09:30:01 | 显示全部楼层
多谢指点!讲的很清楚!
回复 支持 反对

使用道具 举报

8

主题

27

帖子

0

精华

初级会员

Rank: 2

积分
79
金钱
79
注册时间
2012-9-4
在线时间
0 小时
发表于 2012-11-20 16:53:26 | 显示全部楼层
正在学SPI····,启发了。
回复 支持 反对

使用道具 举报

4

主题

70

帖子

0

精华

初级会员

Rank: 2

积分
110
金钱
110
注册时间
2013-3-21
在线时间
0 小时
发表于 2013-12-11 15:58:32 | 显示全部楼层
我跟楼主一个想法,被原子普及知识了!
等待就是浪费时间!
回复 支持 反对

使用道具 举报

0

主题

23

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
402
金钱
402
注册时间
2014-3-17
在线时间
106 小时
发表于 2014-5-23 15:07:57 | 显示全部楼层
这个问题困扰我很久,终于找到原因了!
回复 支持 反对

使用道具 举报

3

主题

14

帖子

0

精华

初级会员

Rank: 2

积分
94
金钱
94
注册时间
2012-12-13
在线时间
13 小时
发表于 2015-4-14 14:26:43 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
详细,菜鸟支持下!
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-23 15:01

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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