最近项目中遇到CAN的物理层测试问题,主芯片S32K144,CAN芯片TJA1043:
单帧唤醒,出现收到第一帧时TXD出现一个12us的下拉波形,如下图:
正确图形:
分析如下:
未接其它ECU的情况下,单帧唤醒,由于CAN还没有初始化,CANOE发送出去的报文收不到ACK,CANOE会一直自动重发,如下图所示;
从收到第一帧唤醒报文,开始运行其它应用初始化程序(如EEPROM),先初始化CAN控制器,再设置CAN收发器,当收发器设置进入Normal Mode时,有可能会处于重发帧的中间或者结束和起始。
a.当处于重发帧的中间时,收发器开始解释后半帧数据,并将数据传到RXD上,按照帧结构(帧起始+仲裁段+控制段+数据段+CRC段+ACK段+帧结束)解析接收到的后半部分帧数据,会检测到错误一般会是STUFF错误,所以会在最后给出主动错误帧。
错误帧结构如下图:
出现12us的下拉波形,就是连续6个显性电平位(速率500Kbit,算下来每一个bit位的时间是2us);
b.当处于重发帧的结尾或者开始时,收发器能够解析到完成的一帧CAN报文,并且在ACK段,TXD给出一个2us的ACK应答。
通过多次测试,无法让每次唤醒都能接收一帧完整的报文,即不出现12us的下拉波形(错误帧)。而且,将唤醒帧的内容进行修改,测试的结果不同;因为从收到唤醒帧到设置CAN控制的STB、EN脚,几乎是固定的;但是唤醒帧中的内容因为CAN总线位填充的规则存在,导致没一帧唤醒帧的长度不一样。
调整CAN控制器和CAN收发器的初始化顺序之后,即先打开收发器再初始化CAN控制器,测试结果如下图:
图中,初始化收发器之后,就能正确的转化CANH和CANL收到的报文了,只有在CAN控制器初始化完成之后会给出ACK应答,否则无法应答。