jinger0311 发表于 2020-4-23 13:54:04

stm32中使用CAN通信时,通信错误是怎么处理的?

最近在用CAN通信,看到错误管理和错误帧这一部分,不理解。
手册上说错误管理完全由硬件处理,是不是如果发生了错误,错误帧是由硬件自动发送的?
那么错误帧的接收呢?也是由硬件自动接收处理的?

还有stm32中的错误中断,是只要监测到总线上有错误就会触发中断吗?还是说只是有本机发送引起的错误才会触发中断呢?

aiherong 发表于 2020-4-25 05:08:34

建议再看一遍,读书百遍,其义自现

qq770211411 发表于 2020-6-15 13:12:19

:o:o:ohttp://blog.csdn.net/ppdyhappy/article/details/71473672
建议你看看这个文章,希望对你有所帮助

发表于 2020-6-15 22:08:11

错误中断我理解的是,can模块检测到错误后,会产生对应的标志位,当开启错误中断后,出发错误中断,通过读取错误寄存器来判断错误的原因。

深山明月 发表于 2020-6-15 22:50:19

学习了

任风吹吹 发表于 2020-6-16 17:38:03

错误帧的检测,发送和接收都是自动的,只不过对于应用层来说是没有对应接口的;
对于错误检测:当检测到错误时,如果错误中断打开,那么会产生错误中断,这个是应用层可以看到的;
发送错误帧:不管是本身引起,还是检测到总线上出现错误帧,都会导致发送错误标志,错误标志有两种,主动错误标志和被动错误标志,取决于节点当前的状态(主动错误状态,被动错误状态?);
错误帧的发送问题-> 比如,当节点发送一个数据帧时由于某种问题(比如位错误)导致发送失败,那么本身节点会检测到这个错误,从而导致发送错误标志(错误帧),同时错误发送计数器TEC+8 (参考ISO11898-1错误计数规则)

当其它节点收到这个错误帧后也会发送错误帧,你没有看错,多个节点会同时发送错误帧,叠加在一起;那么对于其它节点来说,这个就是检测到总线的出现错误帧,被动式的发送错误帧,且它发送的错误标志取决定其节点状态;因此,错误帧的error flag实际长度为6~12位,合成supeposition of error flags;这些都是在ISO11898-1中的内容;后面才是界定符8个隐性位;

节点收到错误帧后接收错误计算器REC-1; TEC和REC就ST MCU内的寄存器,应用层可以看到的;这些都是自动有硬件处理的;

任风吹吹 发表于 2020-6-16 17:40:53

这些是错误计数规则,ISO11898-1中的内容(自己多看文档啊):
1>当接收端检测到一个错误时 ->REC+1
   例外:当在发送主动错误标志和过载标志时检测到位错误
2>当接收端检测到一个错误时 ->REC+1
   例外:当在发送主动错误标志和过载标志时检测到位错误
3> 当发送端发送错误标志时 ->TEC+8
例外:
当发送端是被动错误节点,且由于应答错误而在发送被动错误标志期间未检测到任何显性位时
当发送端在仲裁域期间由于检测到位填充错误而发送错误标志时(如发送隐性位但检测到实际是显性位)
4> 当发送端检测到在发送主动错误标志或者过载标志时出现位错误->TEC+8
5> 当接收端检测到在发送主动错误标志或者过载标志时出现位错误->REC+8
6> 任何节点在发送主动错误标志,被动错误标志,过载标志之后都应该能够最大容忍7个连续显性位, 节点在主动错误标志或者过载标志检测到连接14个显性位,或者在被动错误标志后检测到连续8个显性位, 每次检测到连续8个显性位时, 发送端的TEC+8,接收端的REC+8.
7> 发送端每次在成功发送报文后TEC-1,直到为0
8> 当接收端的REC为0<REC<127时, 第次接收端成功接收报文后REC-1,直到减到0, 当接收端的REC>127时, 则当其成功接收报文后则直接设置REC为一固定值,此固定值为119~127.

任风吹吹 发表于 2020-6-16 17:44:30

关于错误检测(由MCU自动实现):
位错误
节点检测到的位与自身送出的位数值不同
仲裁域或应答域期间发出“隐性”位,而检测到“显性”位不导致位错误
节点发送被动错误标志,但检测到显性位时不视为位错误.
填充错误
在使用位填充编码的帧域内(帧起始至CRC序列),不允许出现六个连续相同的电平位
CRC错误
节点计算的CRC序列与接收到的CRC序列不同
格式错误
固定格式位场(如CRC界定符、ACK界定符、EOF等)含有一个或更多非法位
在EOF,错误帧定界符,过载帧定界符的最后一位检测到显性位时, 不视为格式错误.
应答错误(ACK错误)
发送节点在ACK域(ACK slot)期间未检测到“显性”位

butterflyspring 发表于 2020-6-19 17:31:40

学习啦:)
页: [1]
查看完整版本: stm32中使用CAN通信时,通信错误是怎么处理的?