※ 引述《dces4212 ()》之銘言:
: 內葛阿
: 我在研究 CAN 的規格的時候遇到個想不通的點,
: 我們知道,在 CAN bus 裡面,當一個 sender 收到與自己正在傳輸的位元不一樣的準位
: 的信號時,也就是它原本正在送 1,結果收到 0,它會知道發生碰撞,並且讓出 bus 給
: 正在傳輸的節點。
: 問題來了!
: 如果 header 已經傳完了,當下正在傳輸的是 payload,並且正在傳送 1 的資料,這時
: 剛好其他節點開始說話了,並且發送 0。這樣不就造成即便 can_id 是最小的 frame,
: 也就是優先序最高的 frame,也會失去這次發送資料的機會?!?!
: 還是說,transceiver 的實做會在收完 header 的那幾個位元之後,就停止自己這個節點
: 的發送,直到其他節點傳送完資料,才會再次發送待傳送的資料,以避免上述情況發生?
: 蛤?
自己回一下,
後來發現是,當 arbitration field (我所謂的 header) 已經傳完,並且正在傳送後續
payload 等內容時,其他節點在這個時間是不會說話的,因為這時 bus 不是 idle 狀態
。
什麼時候才可以說話呢?答案是等這個 frame 傳完,並且已經過了 intermission field
(frame 之間的間隔,由 3 個 intermission bit 以及 1 個 recessive bit 構成) 之後
,其他節點才可說話。
如此一來,我們就解開了上述問題:payload 在傳送時是不會被打斷的。
參考資料:
- http://wiki.csie.ncku.edu.tw/embedded/CAN
- https://copperhilltech.com/blog/controller-area-network-can-bus-bus-
arbitration/
成大 wiki 應該接近第一手資料了吧!?jserv 別搥我R