管理员
  
- 积分
- 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的操作.
你说的办法也是可以,但是可能存在和串口一样的问题,就是第一个字节会丢失.
|
|