单片机串口通信。出错了。

baoyz 2016-11-30 04:55:29
单片机ATmega32。
串口通信给一个HART通信modem。
用了3种方案。
      
//方案1
UDR=SendData[CountI];
while ((UCSRA & 0x20)==0); //(1<<UDRE)
Delayms(10);

//方案2
while ((UCSRA & 0x20) == 0); //1 << UDRE
UDR = SendData[CountI];

//方案3
UDR = SendData[CountI];
while ((UCSRA & 0x40) == 0); //1<<TXC
UCSRA |= 0x40;

当使用6MHz晶振工作时,3种方案通信完全正常。
但是,当使用1MHz内部RC振荡工作时,方案2、3完全不能工作。输出的是“规则的乱码”。
求解。
...全文
295 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
of123 2016-12-02
  • 打赏
  • 举报
回复
发送连续的 0x55 或 0xAA 用示波器测量一下内部振荡器下的输出方波频率。可能是振荡器精度不够,你设置的分频后的时钟误差超过了 5%。
C_Rabbit 2016-12-02
  • 打赏
  • 举报
回复
我看了一下mega32的datasheet,发现有这么一处:

这里对照你的1M RC的初始化程序里,应该是有问题的,需要先把
UCSRC |= (1<<UPM1) | (1<<UPM0);
这一句增加(1<<URSEL)
另外,6M的程序里把UCSZ置成了11,这是设定了数据长度为9位,如果想保持一致,需要在1M的程序里也做同样设置
baoyz 2016-12-01
  • 打赏
  • 举报
回复
这是6MHZ晶振的串口初始化代码:
  UBRRH= 0x01;
  UBRRL= 0x37;
  UCSRB |= (1<<RXCIE)|(1<<RXEN)|(1<<TXEN);
  UCSRC = 0xB6;//1011 0110 (1<<URSEL)|(1<<UPM1)|(1<<UPM0)|(1<<UCSZ1)|(1<<UCSZ0)
这是1MHZ RC的串口初始化代码:
 UBRRH= 0x00;
  UBRRL= 0x33;
  UCSRB |= (1<<RXCIE)|(1<<RXEN)|(1<<TXEN);
  UCSRC |= (1<<UPM1)|(1<<UPM0);
请大家看一下,该改哪里呢? 6Mhz晶振时完全正常的程序,到了1MHZ时就死活不能用了。
C_Rabbit 2016-12-01
  • 打赏
  • 举报
回复
1200波特率下,单字节(1起始位+8数据位+1停止位+1校验位)共11位,发送一个字节需要1/1200*11=0.00917s,合9.17ms。所以1MHz频率下通过10ms延时可以保证发射完成。可以实验将延时缩短至5ms进行测试,看是否出现乱码,如果出现,说明问题就出在while等待语句没有发挥应有的作用上。 而6m晶振和1mRC的区别,就需要查看串口程序初始化代码里,对串口模块的寄存器设置,这里的频率发生器的选择是否出错了,各人猜测这里是问题根源。
zgl7903 2016-12-01
  • 打赏
  • 举报
回复
循环发 0x55 或 0xAA 示波器测量波形周期, 看看波特率是否对
baoyz 2016-12-01
  • 打赏
  • 举报
回复

我的方案2是按照数据手册里的标准样式写的。
6Mhz晶振时,完全正常。
1Mhz rc时,完全不能用。
波特率也计算过了。就是不行。
baoyz 2016-12-01
  • 打赏
  • 举报
回复
先谢谢大家了,请再帮我看看。 这个是ATMega32的串口设置。 我用1M rc振荡,串口开1200hz, UBRRH= 0x00; UBRRL= 0x33; 这样对吗?33,32我都试过,方案2、3都不行。 我用6M晶振,串口开1200hz UBRRH= 0x01 UBRRL= 0x37; 3种方案都成功了。同样的方案,就成功了。 请大家讨论还有什么可能性,导致我通不上?
uid123 2016-11-30
  • 打赏
  • 举报
回复
一个有延时,一个没延时。
C_Rabbit 2016-11-30
  • 打赏
  • 举报
回复
看3种方案的区别,第2、3方案的发送方式是几乎雷同的,而第1种方案则是在第3方案的基础上使用了delayms(10)函数。所以很明显出错的原因是2、3方案中单字节没有发送完成前就进行了下一个字节的装载。这就意味着很有可能你的发送完成标志位或中断标志没有起作用,这里应该检查一下。 然后分析6M晶振和1M rc为什么会不同,这里给的线索太少,uart的波特率设置参数影响很大,在不知道波特率设置的情况下,难以进一步判断。
zgl7903 2016-11-30
  • 打赏
  • 举报
回复
是否启动了看门狗 被复位了?

27,375

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 单片机/工控
社区管理员
  • 单片机/工控社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧