在KE06驱动库中提供了CAN的使用例程,但是在使用过程中了发现几个比较典型的问题,并且这几个问题在论坛和community中也有很多网友问到,此处总结分享出来,希望能够对大家有所帮助。 硬件平台:FRDM-KE06 + ZLG USB CAN 软件平台:CW10.6 + KEXX_DRIVERS_V1.2.1_DEVD中CAN_Node1_demo 问题背景:KE06 CAN_Node1_demo的目的是使用两块FRDM-KE06板互连,对发数据,程序运行正常。当客户的需求是验证同时使用KE06的三个发送FIFO会不会出现丢包的状况,于是只能使用USBCAN去抓数据,于是发现如下几个问题。
问题1. USBCAN无法接收数据以及波特率设置计算的误解 在CAN_Node1_demo中,尽管两块板收发正常,但是如果用户使用USBCAN去调试,却发现无法接收数据,从示波器查看TX引脚,所以判断原因就应该在于波特率的设置。 程序默认波特率设置如下,但是其波特率具体是多少呢,从注释中看到Baud_RATE被定义为: BAUD_RATE_CLOCK/(BAUD_RATE_BRP+1)/ (BAUD_RATE_SJW+1)/(3 + BAUD_RATE_TSEG1+ BAUD_RATE_TSEG2)
但事实上这个计算公式错误的,正确的计算应该如下。Baud_RATE的计算和BAUD_RATE_SJW没有关系,具体原因可以参考CAN的技术手册,这个注释对用户产生了很大的误解,导致波特率总是设置不正确。 Baud_RATE=BAUD_RATE_CLOCK/(BAUD_RATE_BRP+1)/(3 + BAUD_RATE_TSEG1+ BAUD_RATE_TSEG2) 按照这个公式计算,得到Baud_RATE=20000000/1/(3+9+6)=555555,所以USBCAN无法接收到任何数据。
Demo默认波特率设置代码: define BAUD_RATE_SJW SJW_3TQ /*!< 1 set Synchronization Jump Width. */
#define BAUD_RATE_BRP 0 /*!< 1 Baud Rate Prescaler */
#define BAUD_RATE_SAMP 0 /*!< 0-One sample per bit, 1-three sample per bit. */
#define BAUD_RATE_TSEG1 TSEG_10 /*!< Time Segment 1*/
#define BAUD_RATE_TSEG2 TSEG_7 /*!< Time Segment 2*/
#define BAUD_RATE_CLOCK 2000000L/*!< clock source for MSCAN*/
#define Baud_RATE BAUD_RATE_CLOCK/(BAUD_RATE_BRP+1)/ (BAUD_RATE_SJW+1)/(3 + BAUD_RATE_TSEG1+ BAUD_RATE_TSEG2) //易引起误解段
|