Re: [問卦] 玩過 CAN bus 的請進
在 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 的那幾個位元之後,就停止自己這個節點
: 的發送,直到其他節點傳送完資料,才會再次發送待傳送的資料,以避免上述情況發生?
: 蛤?
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 1.163.114.15 (臺灣)
※ 文章網址: https://www.ptt.cc/bbs/Gossiping/M.1671810952.A.9EB.html
→
12/23 23:57,
1年前
, 1F
12/23 23:57, 1F
噓
12/24 00:05,
1年前
, 2F
12/24 00:05, 2F
討論串 (同標題文章)