欢迎来到天天文库
浏览记录
ID:13422606
大小:258.00 KB
页数:10页
时间:2018-07-22
《lpc2148串口高波特率通信解决方案》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、第一章问题提出由于LPC214xUSB使用的晶振频率必须为48MHz(经过倍频以后),对外接晶振有特殊要求,不能使用标准的11.0592MHz晶振。因而在使用USB时,一般采用12MHz晶振。而12MHz这样的晶振和标准波特率不成倍数关系,实际波特率和期望波特率往往不同。。下表是低波特率时期望波特率和实际波特率的对比可以看出低波特率时,实际波特率的误差比较小,对传输影响不大。而当期望波特率高达115200时,通过计算得到实际波特率为125000,误差较大,同时实验结果也表明如果此时不对其进行修正,则根本无法进行正确传输。网上大多数说法是不要使用过高的波特率传输,避免其造成的丢码
2、率太高,而作者通过实验研究证明,通过使用小数波特率发生器,完全可以像低波特率时一样的正确传输,并且在其设定过程中,实现并应用了多位小数的分数逼近法的算法,从而科学地避免了其他人一直以来根据经验或者反复试验得出参数的人工计算过程,彻底实现波特率计算和修正的自动化。第二章小数波特率发生器第一节简介UART1小数分频寄存器(U1FDR)控制产生波特率的时钟欲分频器,用户可根据需要进行读写。该预分频器接受VPB时钟,并经过指定的小数要求产生一个输出时钟,小数由该寄存器的值决定。UART1小数分频寄存器(U1FDR)位描述该寄存器控制波特率生成的始终预分频器。该寄存器的复位值为UART1
3、禁能小数功能,以确保UART1的软件和硬件与没有该特性的UART完全兼容。故而代码中使用如下序列if(bps>=115200){Uart0SetFDR(bps);}Uart0SetDLML(bps);可保证程序在高波特率时会设置小数波特率发生器,且低速率时也能正常工作。下面的等式用于计算UART1波特率:UART1baudrate=PCLK/(16*(256*U1DLM+U1DLL))*(MulVal/MulVal+DivAddVal)其中PCLK为VPB总线时钟,U1DLM和U1DLL为标准的UART1波特率除数寄存器,DivAddVal和MulVal为UART1小数波特率发
4、生器特定的参数。DivAddVal和MulVal的值应遵循以下的条件:1.1<=MulVal<=152.0<=DivAddVal<=153.如果U1FDR寄存器值不遵循这两个要求,那么小数分频输出未定义。如果DivAddVal为0,那么小数分频禁止且时钟将不会分频。第二节使用小数波特率发生器——校准系数的确定根据以上公式很容易计算串口波特率,但是实际应用中,更多的是在使用非标准晶振的时候确定波特率校准系数,即设定U1FDR寄存器DivAddVal和MulVal的值。确定波特率校准系数可以分如下3步进行:(1)确定除数锁存器的值:根据需要的波特率bps,按照没有校准系数的波特率计
5、算公式确定除数锁存器的值(DLM,DLL)。由于采用非标准晶振,得到的结果通常为小数。无论小数值大小,均舍弃小数部分的值,对结果进行取整操作(不是四舍五入),得到除数锁存器的值。(2)确定校准前的波特率:将(1)得到的除数值(DLM,DLL)代入不带校准系数的串口波特率计算公式,得到不经过校准的波特率BPS(1)确定校准系数p:p=bps/BPS=MulVal /(MulVal + DivAddVal)根据限制条件1<=MulVal<=15和0<=DivAddVal<=15,寻找合适的值,使得到误差尽可能小的校准系数。第三节具体实例作者采用的实验CPU为LPC2148,晶振为1
6、2MHz,拟设定波特率bps为115200,使用UART0,根据前面所述的校准系数的确定过程,第一步得到除数锁存器的值:12000000/(16*115200)=6.51,取整后得到除数为6.将6代入没有校准系数的波特率计算公式,得到没有校准的波特率BPS=12000000/(16*(256*0+6))=12500.那么校准系数p=bps/BPS=115200/125000=0.9216,即MulVal/(MulVal+DivAddVal)=0.9216现在问题转化成为如何在限制的范围内找到两个整数,使得上式最贴近0.9216第四节传统获取MulVal和DivAddVal整数值
7、的方法传统获取MulVal和DivAddVal整数值的方法大多依靠经验技巧或者反复试验的手段。如参考文献二《深入浅出ARM7–LPC214x下》中,第77页描述的那样:根据1<=MulVal<=15和0<=DivAddVal<=15的限制,由于系数接近1,因而DivAddVal取尽可能小的整数,多次试验取值得到12/(1+12)=0.9231与期望的系数0.9216最接近,能够使波特率误差最小,因而最后确定MulVal=12,DivAddVal=1.显然,按照这种方法是无法完成程序自动化的,
此文档下载收益归作者所有