1. 程式人生 > >CAN通訊物理層(取樣點、大端小端)

CAN通訊物理層(取樣點、大端小端)

        KEL15與KEL30存在電壓範圍的區別和功能上的區別:KEL30是指提供基本功能的供電電壓,功能很少:KEL15是指提供多功能的供電電壓。其中KEL15又稱:IG ON。

        終端電阻:由於訊號傳輸會產生回波、反射(駐波)等干擾,終端電阻就是抵消干擾。大約120歐( 線束的阻抗是120歐,終端電阻120歐就跟導線一樣,這樣就沒有反射)。

        ECU不等距離分佈也是為了減少駐波。(所以說懂硬體才6比,什麼是駐波???)。

        資料幀

要求為8個位元組,這是在CAN網中傳輸的資料的長度。

        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,過濾方式有兩種:

  1. 遮蔽模式: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對應位不要求一定要匹配也可訪問該節點。
  2. 列表模式: 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初始化觸發事件到該節點所有的週期性報文至少被髮送一次的時間