can線上,這裏只談論can而不是canfd。 can線上,只能發送一幀數據。而後再發送下一幀數據。 ide
什麼是一幀數據?
就是有108個bit位。 假如是500K的位速率,則108個bit,則至少含義216us的時間,在示波器上,若是抓取數據,那麼會發現有時候不單單有216us。 翻譯
先回答第一個問題,爲何是108個bit?
由於有起始位1 bit,
11位id,佔兩個比特。
數據長度,佔4個bit。
rtr位,Exd位,r0保留位。
64個比特的數據。
校驗位16位。
兩個比特的ack位.
還有7個比特的結束位。調試
爲何至少是108個bit,有時候多是109,或者更多的比特呢?
由於:專業術語,叫作位填充。 can線上,接收端須要比特定時,根據若是是連續5個相同的邏輯0,那麼就插入一個邏輯1,而後牢牢跟着後面的信息。我有次用示波器觀察信號,由於我發送的8個字節的數據都是00 。而後觀察到的信號,居然有毛刺,很規則的毛刺,這個毛刺就是脈衝。我一看,不對啊,我發送的都是0,在示波器上應該看到一段時間的低電平纔對,爲何這麼有規律,每一個脈衝之間的間隔還很均勻。後來通過搜索,才知道這些就是位填充致使的。it
用示波器,調試的時候,canH要接示波器的信號線,canL要接示波器的地。 這樣的目的是, 方便查看數據。 會看到第一個負脈衝老是起始位。而後後面跟着的就是11位id(若是是iso15765), 直接讀便可,高電平,翻譯成1 ,低電平翻譯成0 ,就獲得了這幀數據上面的全部信息。class
調試can程序,通常不須要示波器,經常用到CAN總線監控儀。 這個也沒多少錢,估計網上賣的就是好幾百塊錢,的樣子。USBCAN不知道哪一個廠家出的,比較好用,它能夠監控can總線行的全部ECU發出的幀。 並且發出的時間點也能清晰的記錄下來,單位是毫秒。 能反應先後幀之間的間隔。由於can總線是串行總線,它不是發的幀早了點,就是晚了點,能夠調節幀發送的間隔,來達到兩個節點通信的目的。尤爲是流控幀,有的流控幀發送的是30 00 0A這表示幀間隔是10毫秒,若是你不按照這個10毫秒的間隔時間,來發送幀。而是5毫秒,那麼對方是不會接收。你發的多幀的信息的,所以也不可能接收到對方節點的正常響應。流控也是容易出錯的地方。監控