前两天,帮一个客户调试
CAN总线,他的板子发数,USBCAN接收,但是总是调试不成。我接上
示波器,量一下CANH与CANL之间的波形,发现他板子不连接USBCAN接口卡时,波形是正确的;可是一旦连接上USBCAN以后,波形就成了以下这个样子:
就是刚发了第一个显性位之后,就有个阶梯的电压下降,然后保持几个位后,恢复到隐性电平,过了一会,才有正常的波形出来,可是这个帧只剩下一半了,肯定不可能发送成功。
我开始以为是收发器不匹配,换了几个收发器都是一样的。突然我想到这个很像错误帧。既然有错误帧,那就说明可能波特率不对。仔细看了程序,发现波特率是12M下算出来的,而晶振却用了16M。立马调整波特率,OK。通讯成功。那个阶梯的波形也没有了。
所以可以肯定,那就是一个错误帧。但为什么有个阶梯呢?答案很简单,因为CAN通讯的两个节点的收发器的电源不同,比如,发送节点的电压稍微高点,那么其CANH被拉高时电压也高,故显性位输出时,差分电压也高。所以当发送节点发送的显性位被接收节点接收后,接收节点发现波特率不匹配,则马上发出错误帧(6个位的显性电平),但是接收节点电压稍微低,故差分电压也小一点,所以产生了一个“阶梯”。
下面为错误帧的定义:
错误帧是节点收到信息,被认为错误时,而向总线广播的一种帧。比如前面这个错误帧的作用就是:接收节点通知发送节点:你的发送有主动错误,你的发送错误计数器要加8;同时接收节点的接收错误计数器要加1。
这样,不同波特率的总线下,少数不同波特率的发送节点总是先退出总线(错误计数器达256时,进入总线关闭状态),保证了其他节点的正常通讯。