CAN(Controller Area Network)总线是一种广泛应用于汽车电子、工业控制等领域的串行通信协议,它采用差分信号传输技术,可以实现高速、可靠的数据传输。
在CAN总线工作中,数据是以帧的形式进行传输的。每一帧由ID、数据、控制位等部分组成,其中ID表示消息的优先级,数据部分最大长度为8字节。
当一个节点想要向总线上发送数据时,需要先通过总线接口电路发送一组仲裁信息(包含ID),以便与其他节点竞争总线的控制权。如果该节点竞争成功,则负责把数据发送到总线上。
接收方会对数据进行检验,如果数据正确则响应ACK信号,并进行处理。
CAN控制器会在发送或接收数据时产生中断请求,在中断服务程序中对数据进行处理。CAN中断分为FIFO中断和错误中断,其中FIFO中断用于处理数据到达CAN控制器的情况,错误中断用于处理CAN数据传输过程中出现错误的情况。一个数据帧在收到之后,可能会产生多次FIFO中断,因为CAN控制器会自动将数据进行缓存,等待主机处理完后再将数据送入下一级缓存。
当一个节点发送一个CAN数据帧时,CAN控制器会将数据帧保存在发送缓存区中,并启动发送操作。在帧传输过程中,如果CAN总线上有其他节点发来了更高优先级的帧,CAN控制器会停止当前的发送操作,保存当前状态,并响应仲裁请求竞争总线控制权。当CAN总线上无更高优先级帧时,CAN控制器再恢复当前的发送操作,直至成功将数据帧发送出去。
因此,在数据帧发送过程中可能会出现中断,而CAN控制器会将已保存的数据状态保留,等待重新发送。这就是CAN发一次数据进两次中断的原因。