CAN协议有四种帧类型:
- 数据帧:数据帧携带数据从发送器至接收器。
SOF帧起始:帧起始由1个显性位组成。总线空闲时,发送节点发送帧起始,其他接收节点同步于该帧起始位。
仲裁段:仲裁段用于写明需要发送到目的CAN节点的地址、确定发送的帧类型(当前发送的是数据帧还是遥控帧),并确定发送的帧格式是标准帧还是扩展帧。
仲裁段在标准格式帧和扩展格式帧中有所不同。标准格式帧的仲裁段由11位标识符和远程发送请求位RTR组成,扩展格式帧的仲裁场由29位标识符和远程发送请求位RTR组成。
仲裁场的总线竞争规划,当总线不同节点同时发送消息时,总裁段会把节点按位相与 显性电平(0)优先级更高 当发现隐性电平(1)时B节点退出总线竞争转换为监听状态等待总线空闲
特别注意由于标准帧 的ide为显性电平 扩展帧的ide为隐性电平 当出现id相同的标准帧和扩展帧总裁时 标准帧优先级更高!
RTR位 为0表示当前帧为数据帧
为1表示当前帧为远程帧
SRR位是扩展帧格式中的一个特殊数据位,全称为“替代远程请求(Substitute Remote Request)”。 由于在扩展帧中不再使用RTR位,因此SRR位被用来替代标准格式中的RTR位。 SRR位的存在使得在扩展帧中仍然能够区分数据帧和远程帧
控制段由6个位组成,包括数据长度代码和两个将来作为扩展用的保留位,标准格式和扩展格式的构成有所不同
数据段由数据帧中的发送数据组成,它可以为0~8字节,每字节包含了8位,首先发送最高有效位MSB,依次发送至最低有效位LSB
CRC段是检查帧传输错误的帧,包括:15 个位的 CRC序列(CRC SEQUENCE)和1 个位的CRC界定符(CRC DELIMITER)构成。
CRC序列是根据多项式生成的 CRC 值,CRC 的计算范围包括:帧起始、仲裁段、控制段、数据 段。 接收方以同样的算法计算 CRC 值并进行比较,不一致时会通报错误。
ACK段用来确认是否正常接收。由 ACK 槽(ACK SLOT)和 ACK 界定符(ACK DELIMITER)2 个位构成。发送单元在 ACK 段发送 2 个位的隐性位。当接收器正确地接收到有效的报文时,接收器就会在应答间隙(ACK SLOT)期间(发送ACK 信号)向发送器发送一个“显性”的位以示应答,通知发送单元正常接收结束,这称作“发送 ACK”或者“返回 ACK”。发送 ACK/返回 ACK是在既不处于总线关闭态也不处于休眠态的所有接收单元中,接收到正常消息的单元 (发送单元不发送 ACK)。所谓正常消息是指不含填充错误、格式错误、CRC 错误的消息。
帧结束:是由每一个数据帧和远程帧的标志序列界定的,这个标志序列由7个“隐性”位组成
2. 远程帧:总线单元发出远程帧,请求发送具有同一识别符的数据帧。
3. 错误帧:任何单元检测到一总线错误时就发送错误帧。
错误帧由错误标志(Error Flag)和错误界定符(Error Delimiter)组成。
接收节点发现总线上的报文有错误时,将自动发出活动错误标志,它是6个连续的显性位。其他节点检测到活动错误标志后发送错误认可标志,它由6个连续的隐性位组成。由于各个接收节点发现错误的时间可能不同,所以总线上实际的错误标志可能由6~12个显性位组成。
错误界定符由 8 个位的隐性位构成。当错误标志发生后,每一个CAN 节点监视总线,直至检测到一个显性电平的跳变。此时表示所有的节点已经完成了错误标志的发送,并开始发送8个隐性电平的界定符。
- 超载帧: 过载帧是用于接收单元通知其尚未完成接收准备的帧,过载帧由过载标志和过载界定符构成。
5过载界定符由8个位的隐性位组成,过载界定符的构成与错误界定符的构成相同。过载标志发送完毕后,每个节点都对总线进行监察,直到检测到一个隐性位为止。此时,每个节点均已发送完各自的过载标志,接着所有节点还要同时开始发送7个隐性位,配齐长达8位的过载界定符