引言
不同设备接口在传输数据时所要求的频率往往不同,而在一些仅使用一个晶振的系统上,如果一个接口的频率完全匹配,那么其他接口所使用的频率往往就不完全符合要求。例如,为了实现usb总线的48 mhz的传输频率,一般可以用12 mhz的晶振来倍频得到,而12 mhz的晶振在进行串口通信时由于与标准波特率不成倍数关系,因而期望波特率和实际波特率往往不同。
在波特率较低时,这种误差影响不大。例如,期望波特率为57 600 bps时,实际波特率为57 692 bps,传输正常;而当期望波特率高达115 200 bps时,则实际波特率为125 000 bps,误差较大。实验结果表明,此时如不对其进行修正,则无法进行正确传输。
笔者通过实验研究证明,通过使用小数波特率发生器,完全可以像低波特率时一样正确地传输,实现了多位小数的分数逼近法的算法,避免了人工计算过程,彻底实现了波特率计算和修正的自动化。
1 小数波特率发生器工作原理
当外部晶振或者vpb时钟值不是标准波特率的整数倍时,波特率的设定往往会出现偏差。通过小数波特率发生器则可减小或者消除这种偏差。
下面以lpc214x处理器的串口uart1为例阐述小数波特率发生器的工作原理。要使用小数波特率发生器,需要设置小数分频寄存器(u1fdr),该寄存器控制产生波特率的时钟分频器。
预分频器接收vpb时钟,并经过指定的小数要求产生一个输出时钟,小数由该寄存器的值决定。
在不使用小数波特率发生器时,uart1波特率由下式计算:
uart1baudrate = pclk/(16×(256×u1dlm+u1dll))
当使用小数波特率发生器时,则由下式计算:
uart1baudrate = [pclk/(16 ×(256 × u1dlm + u1dll))] ×(mulval / (mulval + divaddval)
其中pclk为vpb总线时钟,u1dlm和u1dll为标准的uart1波特率除数寄存器。可以看出,mulval / (mulval + divaddval)就是用来修正波特率的小数值,被称作校准系数。它由两个参数构成:divaddval(波特率生成欲分频除数值)和mulval(波特率预分频乘数值)。divaddval和mulval都必须为整数,且满足:
1 ≤ mulval≤ 15,0 ≤ divaddval ≤ 15。
根据以上公式很容易计算串口波特率,但是实际应用中,更多的是在使用非标准晶振时确定波特率校准系数,即设定u1fdr寄存器divaddval和mulval的值。确定波特率校准系数可以分如下3步进行:
① 确定除数锁存器的值: 根据需要的波特率bps,按照没有校准系数的波特率计算公式确定除数锁存器的值(dlm,dll)。由于采用非标准晶振,得到的结果通常为小数。无论小数值大小,均舍弃小数部分的值,对结果进行取整操作(不是四舍五入),得到除数锁存器的值。
② 确定校准前的波特率: 将①得到的除数值(dlm,dll)代入不带校准系数的串口波特率计算公式,得到未经过校准的波特率bps。
③ 确定校准系数p: p=bps/bps=mulval/(mulval+divaddval)
根据限制条件1≤mulval≤15和0≤divaddval≤15,寻找合适的值,使得到误差尽可能小的校准系数。
2 多位小数的分数逼近算法
(1) 传统获取mulval和divaddval整数值的方法
假设系统晶振为12 mhz,拟设定波特率bps为115 200 bps,根据前面所述校准系数的确定过程,12 000 000/(16×115 200)=6.51,取6为除数值,那么bps=12 000 000/[16×(256×0+6)]=125 000 bps,所以p=bps/bps=0.921 6。
传统获取mulval和divaddval整数值的方法大多依靠经验技巧或者反复试验。如参考文献2《深入浅出arm7lpc214x下》中,第77页描述的那样:
根据1 ≤ mulval ≤ 15和0 ≤ divaddval ≤ 15的限制,由于系数接近1,因而divaddval取尽可能小的整数。多次试验取值得到12 / (1 + 12) = 0.9231与期望的系数0.9216最接近,能够使波特率误差最小,因而最后确定mulval = 12, divaddval = 1。
显然,按照这种方法是无法完成程序自动化的,必须在每次编程之前根据波特率来人工推算出mulval和divaddval的值,并且还需要大量的误差对比和反复试验,导致工作效率的降低。
(2) 获取mulval和divaddval整数值的新方法
我们的问题在于寻找一个分数,它能够尽可能地接近校准系数。那么可以使用这样一种多位小数的分数逼近法,该算法认为:任何一个多位小数,无论是无理数还是有理数,均可以用一个分数来近似表示它,并可用一定的程序使其误差越来越小,直至达到所需的精确度。
根据该算法,可以通过程序来实现获取这两个参数的自动计算,该程序流程如图1所示。
图1 程序流程
初始化时要求找到a和b的值,使其满足b
利用1 ≤ mulval ≤ 15和0 ≤ divaddval ≤ 15的限制作为迭代退出条件,当a的分母超过16时,b就是最优解,b1即为mulval,而divaddval则等于b2-b1;同理,当b的分母超过16时,mulval=a1,divaddval=a2-a1。
本例中程序计算出来mulval=12,divaddval=1,与人工计算结果完全相同,所以使用这种算法,可以利用程序自动高效计算得出mulval和divaddval整数值,不仅节省人力,而且更加科学可靠。
结语
实现了由程序自动、正确、快速地获取设置寄存器参数值的目的,不仅提高了工作效率,更重要的是完全实现了自动化,无需再人工干预。
干货分享 | TSMaster小功能之如何在图形中监控某一条DBC报文发送周期?
绝缘导线型号用途
了解Vivado设计套件集成能力的九大理由分析
中国电信在终端技术和标准方面的成果介绍
为什么人脸识别在美国遭到抵制
计算机多设备接口波特率不匹配的研究
农兽药残留检测仪的检测项目及性能
QPA9903高效放大器
谁能说说M12连接器与普通连接器的区别
你知道造成电感值低的原因有哪些
TCL X10冰箱鲜纳生活百味 打造全空间新鲜养护
c语言之条件编译技巧与示例分析
WaveOptics与EVG的合作可以减小头显设备进入消费者市场的阻碍
常见漏洞的防御措施整理
深圳年底补贴:购买 5G 产品给予 10% 的每人最高 1000 元的补贴
通信行业2017年投资策略:大流量、新技术助力通信新增长
西门子PLC多重背景的使用规则与解决方法
如何认识电动机型号表示的名称和参数
什么是机器视觉?视觉系统组成部分
小米将在2020年第一季度推出LPDDR5手持设备