Re: [问卦] 玩过 CAN bus 的请进

楼主: hydralee (LCM)   2022-12-23 23:55:50
在 Controller Area Network (CAN) 中,当一个节点发送一个 frame 时,它会先发送
header,然后是 payload,最后是结尾的 CRC 和 ACK 讯号。如果在这个节点发送
header 的过程中,其他节点也开始发送资料,则这个节点会暂停发送,直到其他节点发
送完资料为止。这是因为 CAN 使用了优先序制度,当系统中有多个节点同时发送资料时
,只有优先序最高的节点才能继续发送,其他节点必须暂停发送,等待其他节点传送完资
料之后再重新尝试发送。
在 CAN 中,优先序是由 CAN ID(也称为标题)决定的。CAN ID 是一个 11 位二进制数
,优先序越高的 frame 会有较小的 CAN ID。当多个节点同时发送资料时,接收器会先接
收优先序最高的 frame,然后再接收其他 frame。因此,如果一个节点在传送 header 的
过程中,其他节点也开始发送资料,则这个节点会暂停发送,直到其他节点发送完资料为
止。
在 CAN 中,transceiver 的主要职责是在物理层和通信层之间传递资料。它会在接收到资料后将资料转换为物理信号,并在收到物理信号时将资料转换回
通信层。Transceiver 不会直接参与传送资料的过程,而是接收到资料后将资料转换为物
理信号,并在收到物理信号时将资料转换回通信层。因此,如果一个节点在传送 header
的过程中,其他节点也开始发送资料,则这个节点会暂停发送,直到其他节点发送完资料
为止。
ChatGPT 说的,看不懂也不要问我.....
※ 引述《dces4212 ()》之铭言:
: 内葛阿
: 我在研究 CAN 的规格的时候遇到个想不通的点,
: 我们知道,在 CAN bus 里面,当一个 sender 收到与自己正在传输的位元不一样的准位
: 的信号时,也就是它原本正在送 1,结果收到 0,它会知道发生碰撞,并且让出 bus 给
: 正在传输的节点。
: 问题来了!
: 如果 header 已经传完了,当下正在传输的是 payload,并且正在传送 1 的资料,这时
: 刚好其他节点开始说话了,并且发送 0。这样不就造成即便 can_id 是最小的 frame,
: 也就是优先序最高的 frame,也会失去这次发送资料的机会?!?!
: 还是说,transceiver 的实做会在收完 header 的那几个位元之后,就停止自己这个节点
: 的发送,直到其他节点传送完资料,才会再次发送待传送的资料,以避免上述情况发生?
: 蛤?

Links booklink

Contact Us: admin [ a t ] ucptt.com