最近在做一个液晶电视项目,客户要求RS232通迅,波特率为38400.项目本来使用12M晶振,但达到38400的波特率,12M计算出的T1的定时值不能整除,所以改用14.7456M(所用方案的芯片晶振为12M~15M)。但换了晶振之后,传输的数据都是乱码,也就是说不能正常通讯。
原来使用12M晶振时,最高波特率能达到9600,14.7456M的能达到19200,但却达不到38400.按正常的计算公式计算T1的值,结果是整数;但是为什么实际上却达到不38400的波特率呢。
最后没有办法,试了一下用模拟串口看行不行。修改了两天的程序,输出可以达到38400的波特率,但接收时误码很大,无法达到精度要求。头疼!
在网上查找了很多相关资料,有的说最高只能达到19200的波特率,更高以上只能用模拟串口来实现。到最后,无意中发现说T1装载时也会有一个机器周期的时间误差,那是不是因为到38400的波特率时,正是由于这个误差,导至波特率的误差很大呢。于是试一试,T1的时间值-1,果然成功了。
最初的计算公式为:
TL1 = 256-(2*2*OSCRate/384/BaudRate);
TH1 = 256-(2*2*OSCRate/384/BaudRate);
(PCON = 0x80并且芯片有倍频功能,即使用的频率为晶振*2)
后来修改的公式为:
TL1 = 256-(2*2*OSCRate/384/BaudRate)-1;
TH1 = 256-(2*2*OSCRate/384/BaudRate)-1;
也就是说把定时的时间延长了。那就是说原来的定时时间有点快了,导致了波特率误差大于了可接受误差。但是为什么定时器T1的定时时间的误差是快一个值而不是慢呢?以后再研究吧。
阅读(5753) | 评论(0) | 转发(0) |