LPC2294内置CAN模块通讯波特率的计算
1、LPC2294内置CAN模块一旦错误累加进入BusOff态将永远不能起死回生,除非硬件复位。Philips在随后的ErrataSheet中也清清楚楚的说了这一点,并提出了两种“曲线救国”的方法:1的大意是在退出复位态(RM位清零)发送一个ID为0的虚拟帧,并且置位SRR、AT位发送;2是退出复位后将TDx引脚切换为GPIO脚,接着用0x12写命令字,该单次发送的数据帧必须被接收中断捕获,然后TDx引脚切换回TD功能以恢复正常通讯。
2、本人尝试了第一种方法,莫成;第二种方法就不想再试了。
3、花了一整个晚上的时间凑波特率,终于苦心人,皇天不负,俺在绝望的时候一不小心将80k给拧了出来,编译调试运行,观察发送、接收通畅,发送错误计数器持续保持冰点(0),俺窃喜,心想以后就盯着80K不放可以在柏油马路上轰隆隆轰隆隆的开拖拉机呐.
4、本人的穷举法凑CAN波特率如下:
√ 拧住自己想要的波特率,比如本人的80K,Fpclk/80K=184.32,(Fpclk为VPB时钟频率,这里为14.7456MHz);
√ 对计算结果四舍五入取整为184,Fpclk/184=80.139K,和80K不相上下,就拧住这个不放咯(如果误差相差太大,就再揪一个出来试;再不成,就再试;再再不成,也得不停的试.);
√ 下面确定分频因子BRP、Tseg1、Tseg2的值,SyncSeg必须为常数1,计算式:BRP×(1+Tseg1+Tseg2)=184=23×2×2×2,于是初步确定BRP=8,Tseg1+Tseg2=22,必须注意Tseg1的值为1~16,Tseg1的值为1~8,一般将采样点设置为0.7左右,这样可取Tseg1=16、Tseg2=6;
√ 一般Tseg2>=5,可取SJW=4,否则SJW=Tseg2 - 1,这里SJW=4;
√ 最终CAN1BTR的值就确定为:0x005FC007;