CAN通訊物理層(取樣點、大端小端)
KEL15與KEL30存在電壓範圍的區別和功能上的區別:KEL30是指提供基本功能的供電電壓,功能很少:KEL15是指提供多功能的供電電壓。其中KEL15又稱:IG ON。
終端電阻:由於訊號傳輸會產生回波、反射(駐波)等干擾,終端電阻就是抵消干擾。大約120歐( 線束的阻抗是120歐,終端電阻120歐就跟導線一樣,這樣就沒有反射)。
ECU不等距離分佈也是為了減少駐波。(所以說懂硬體才6比,什麼是駐波???)。
資料幀
can幀:標準幀、遠端幀和資料幀,遠端幀沒有資料域。標準幀由11位識別符號,擴充套件幀有29位識別符號。
資料幀格式:
typedef struct { uint32_t StdId; //標準幀ID,如果您要傳送擴充套件幀。可以不管它 uint32_t ExtId; //擴充套件幀ID,如果您要傳送標準幀。可以不管它 uint8_t IDE; //您是想傳送標準幀還是擴充套件幀? uint8_t RTR; //您是想傳送資料幀還是遠端幀? uint8_t DLC; // 您想傳送資料的長度。 uint8_t Data[8]; //您想要傳送的資料。 } CanTxMsg;
在CAN網中是如何傳送資料給特定標準幀ID和擴充套件幀ID決定的節點?
首先知道STM32有14個過濾組,每個過濾組由2個32位可配置暫存器組成。每個節點會配置自己的過濾組,來過濾掉不想接收的標準幀ID和擴充套件幀ID,過濾方式有兩種:
- 遮蔽模式:CAN_FxR1和CAN_FxR2兩個暫存器最後一個位元組的1、2位(0開始)為11:CAN_FxR1用來設定想要的ID;CAN_FxR2用來設定要遮蔽的位。當CAN_FxR2中的某一位為1,表示收到ID與CAN_FxR1對應位要匹配才能防問到該節點,若CAN_FxR2中的某一位為0,表示收到ID與CAN_FxR1對應位不要求一定要匹配也可訪問該節點。
- 列表模式: CAN_FxR1和CAN_FxR2兩個暫存器最後一個位元組的1、2位(0開始)為00:CAN_FxR1、CAN_FxR2兩個暫存器分別表示兩個ID,這樣就只有含有這兩個ID的資料幀才能訪問到該節點。
CAN控制器:
用於將欲收發的資訊轉換為符合CAN規範的CAN幀訊號,其中轉換為CAN幀的步驟是由軟體來完成的,之後將訊號通過CAN收發器在CAN_bus上傳輸。
CAN收發器:
將CAN控制器的邏輯電平轉換為CAN匯流排的差分電平。
CAN總線上邏輯電平:
平時匯流排是隱性(邏輯1)。顯性優先順序高於隱性。
邏輯電平0、1不是對地而言的,是由兩線上電壓差決定的。邏輯0代表顯性,邏輯1代表隱性。
顯性(邏輯0)指:CAN_H3.5v/CAN_L1.5v。
隱性(邏輯1)指:CAN_H2.5v/CAN_L2.5v。
資料幀:由7個內容組成:1.幀開始SOF(低電平) 2.仲裁域 3.控制域 4.資料域 5.CRC域 6.ACK域 7.幀結束。其中仲裁域表示幀優先順序,RTR位為隱性電平;控制域(6bit)表示保留位長度和資料長度;ACK域(2bit)表示一幀訊號已被正常接受,傳送方傳送兩位低電平 ,接收方若正常接收則以slot位為高電平傳送一幀訊號;
錯誤幀:表示傳輸錯誤,由can硬體傳送;
過載幀:由節點發出表示沒準備號接受資料;
遙控幀:接收單元請求傳送單元傳送資訊,它的仲裁域中RTR位為顯性電平。
大小端:
大端(Motorola):高位元組或字位放在記憶體低地址。
小端(Intel):低位元組或字位排放在記憶體低地址。
對位上的處理是硬體處理的,而且在ram不分大小端,在flash才有大小端。
下面是大端和小端跨位元組的資料在記憶體的分佈圖:
大端:
小端:
CRC校驗:見計算機網路筆記-資料鏈路層。
CAN通訊傳輸方式:非同步傳輸。
CSMA/CD:載波監聽多點接入/衝突檢測,在計算機網路中介紹過這裡不重複,只介紹一種衝突的解決方法,解決方法不止一種,這裡說can線中“非破壞性仲裁 ”的方法,仲裁機制使用識別符號為判斷依據,識別符號二進位制數越小的優先順序越高,讓後就直接收優先順序高的報文資料。但是這裡有個疑問待以後解決:訊號衝突了訊號不就受損了嗎?上述解決方法的怎麼可行?。
CAN匯流排訊號同步方式(位外):
當資料出現多個連續的0或1時,按照波特率每秒鐘對訊號進行多次取樣,可能漏掉或者多幾個0或1出來, 使用資料鏈路層筆記裡有講到曼切斯特編碼,可以有效的得到正確使訊號,這叫作訊號同步。但在CAN傳輸中由於曼切斯特編碼會是傳輸速率變慢所以就使用了NRZ編碼。NRZ編碼(不歸零碼):0表示低電平,1表示低電平。它的缺點就是上述同步問題沒法解決,所以我們就想了一個辦法:傳送時每5位(位數多了就也可能會有上述現象,位數少了和資料碰巧一致的概率會很大)相同電平就插入一位相反電平,接受時就反其道而行之。
CAN匯流排訊號同步方式(位內):
首先得了解以下知識:接收端是按照約定波特率每秒鐘進行多次的取樣,也就是每隔一段時間取樣一次將取樣的結果作為當時狀態。接收時檢測每一位的時間是靈活的,在下文中說明。
位時序:每1秒可以傳送多位資料,是由波特率決定的。每一位由多個時間片(time quantum)組成,是由晶振除以波特率決定的。將一位中的時間片分為4個段,順序是:同步段(SS)、傳播延時段(PTS)、相位緩衝段1(PBS1)、相位緩衝段2(PBS2)。1__同步段(1Tq):傳送節點和接收節點都是從同步段開始,正常情況下該段一定是上升沿和下降沿所處位置。 2__傳播延時段:由於匯流排協議中的非破壞性仲裁機制以及幀內應答機制的規定,要求網路中的所有節點要同時接收到傳送過來的顯性位,但是由於每個節點到傳送節點的位置不同和接收器、傳送器的延時不同,導致不同的節點收到該顯性位的延時是不同的,所以需要人為的配置該位。 3__相位緩衝段1、2在後文重同步中說明。
1Bit接收時間:正常情況(上升沿或下降沿出現在同步段)每一位的接收時間是固定值。也就是一段時間後,接收器就認為這一位接受時間完了,立即開始下一位的接受。
取樣點:檢測到上升沿或下降沿之後1Bit接收時間的x%時間的邏輯電平值作為這一位的邏輯電平值。因為每個節點的晶振可能不同,導致時間片的長度不一致,如果約定的取樣時間不恰當可能導致取樣的結果與實際值不一致,約定的取樣點是經過多種實驗計算出來的。
進入正題!!!!!!!!!!!!!!!!!!!!!有兩種同步方式:硬體同步和重同步。
硬體同步: 硬同步只在匯流排空閒時通過一個下降沿(幀起始)來完成,此時不管有沒有相位誤差,所有節點的位時間重新開始。強迫引起硬同步的跳變沿位於重新開始的位時間的同步段之內。
重同步:正常情況 ->檢測該位的時間開始,上升沿或下降沿正常出現在同步段,不需要重同步處理,取樣點正常取樣。
非正常情況1 ->上升或下降沿出現在同步段和取樣點之間。若此時上升或下降沿與同步段相差x時間,接收器就會使相位緩衝段1增加同樣x時間,這使得接受一位的時間變長了,當然這個增加的x時間是有上限的,這個上限稱為重同步跳轉寬度SJW。
非正常情況2 ->上升或下降沿出現在取樣點之後,接收器就縮短相位緩衝段2到上升沿或下降沿出現的地方,相當於讓這一位的接收時間立即結束,認為下一位的接收時間才是才是這個訊號接收的正確值,使這個上升或下降位於下一位的同步段。
CAN矩陣中有很多報文是每一個節點都需接受,這些報文是用來檢測通訊丟失的。
TDiaEnable:從 KL15 開啟到 DTC 控制器能檢測到DTC的時間,該值只能取所有節點中的最大值
TCanAck:從接收到CAN初始化觸發事件到節點可以接收報文的時間
TCanInit:從接收到CAN初始化觸發事件到傳送第一幀報文的時間(此時,CAN硬體、軟體初始化完畢,可以傳送和接收報文)
TMsgStart:從接收到CAN初始化觸發事件到該節點所有的週期性報文至少被髮送一次的時間