引言
LPC11Cx系列是NXP公司的高性价比Cortex—M0构架ARM微控制器产品,内嵌CAN总线控制器。CAN总线位定时参数决定CAN总线能否按给定速率正常通信及其稳定性,但在实践中发现,原版用户手册及国内译本在CAN总线位定时参数配置寄存器的表述上有误,导致用户CAN总线无法正常通信。下面将校正错误,并给出CAN总线位定时参数具体计算实例。
1 位定时时序及参数
依据CAN总线规范,LPC11Cx系列的位时间被分成4个段:同步段、时间传播段、相位缓冲区段1和相位缓冲区段2,位时序如图1所示。
图1中,每一个段包含有一个指定的、可编程的时间量子数,如表1所列。
表1中,时间量子tq是位时间长度的基本时间单元,tq与CAN总线控制器的系统时钟fsys可确定参数BRP,即tq=BRP/fsys。同步段SYNC_SEG是位时间的第一部分,CAN总线的边沿电平会在这里发生。传播时间段PROP_SEG用于对CAN总线网络内的物理延迟时间进行补偿。
相位缓冲区段TSEG1和TSEG2包围着采样点。(重新)同步跳转宽度SJW实现对边沿相位误差作出补偿。
2 位定时寄存器描述校正
LPC11Cx系列CAN总线的位时间参数通过其内部的32位控制寄存器CANBT来定义及编程。CANBT寄存器的详细描述如表2所列。
请注意,表2中上标注*表示硬件把写入这些位的值理解为位值+1。NXP公司原版用户手册及国内译本还同时标注了SJW、TSEG2,说明这两项也需进行位值+1处理,但这么做得出的位定时参数无法使CAN总线正常通信。
3 位定时参数计算
根据表1各定时位段定义,设目标系统晶振频率为12 MHz,经过LPC11Cx内部PLL锁相环电路倍频后,系统时钟频率fsys为48 MHz。现要求CAN总线速率fc为500 kHz,则CAN总线时钟周期tc=1/fc=1/500 kHz=2μs,位定时参数计算如下。
首先,将系统时钟频率fsys进行6分频,即fsys/(BRP+1)=fsys/6=48 MHz/6=8 MHz,由此确定参数BRP=0x000101,而时间量子tq=1/8 MHz=0.125μs,CAN总线时钟周期tc包含的时间量子tq的个数为:tc/tq=2 μs/0.125 μs=16。
然后,根据CAN总线传输介质及应用场合的电磁干扰状况,适当确定CAN总线位定时寄存器CANBT的SJW、TSEG1、TSEG2的值,使这3项位值之和等于16。这里对3项位值取值为:SJW=0x11,TSEG1=0x0110,TSEG2=0x111,并满足:SJW+(TSEG1+1)+TSEG2=16。
最后,将上述位值组合,确定位定时参数值为0x76C5,这个值将被配置写入到位定时寄存器CANBT中。在Cortex—M0的CMSIS软件开发标准框架下,可很方便地调用LPC11Cx片上CAN API函数集来编程,如下语句即可实现寄存器CANBT的位定时参数配置:
/*CAN总线波特率与时钟初始化*/
INT32U CanApiClkInitTable[2]={
0x00000000UL,
/*CAN时钟分频寄存器CANCLKDIV分频值为1*/
0x000076C5UL/*配置定时寄存器CANBTR值为0x76C5*/
};
结语
实践表明,在改变系统时钟频率、CAN总线通信速率及CANBT寄存器的各项位值的情况下,校正之后的位定时参数计算方法所获得的参数值均能满足CAN总线正常通信的要求,消除了用户手册误导。如何提高CAN总线通信的可靠性,在位定时方面还需要根据CAN总线的具体工作状况不断进行实验,并对CANBT寄存器的各项位值仔细调整而得到最佳值。