現場工業總線CAN的認識

二.CAN總線的使用

2.1 CAN總線報文格式說明。

   說起CAN總線通信,就不得不說明一下CAN設備之間通信的報文格式。如同我們通常接觸的RS-232串口通信,當我們通過串口嘗試發送“Hello world”的時候,其實串口線上幀組成由起始位+數據位(這裏的例子就是"Hello world"的ASSIC碼)+奇偶校驗位以及停止位。我們的CAN總線上的報文格式比串口的上的幀格式要複雜的多,BOSCH 公司《CAN Specification V2.0》文檔分爲A、B兩個部分來介紹兩種在CAN總線上會出現的幀格式。A部分按照CAN1.2規範的定義,說明了CAN的報文格式,也有人稱爲CAN2.0A協議。B部分對比A部分定義的標準幀格式,介紹擴展幀以及擴展幀與標準幀的兼容設計。總得來說,符合B部分定義的CAN控制器可以不適用擴展幀,依舊通過標準幀與根據A部分設計的CAN控制器進行通信。

    在這兩種報文的格式下,CAN總線上的報文(幀)種類又分爲下面的四種:

    數據幀:數據幀攜帶數據,由發送器傳送至接收器。下圖簡單說明了數據幀所包含的場空間有那些。


    數據幀根據遵循協議的不同,分爲標準格式幀和擴展格式幀,他們的區別在於仲裁場以及控制場,具體的內容分佈如下:

            


         RTR爲遠程發送請求位,數據幀爲顯性,遙控幀爲隱性位。

         SRR是一隱性位。它在擴展格式的標準幀RTR位的位置,因此,標準幀與擴展幀的衝突是通過標準幀優先於擴展幀這一途徑得以解決的,擴展幀的基本ID如同標準幀的識別符。

         IDE:標準幀格式裏的IDE爲“顯性”,而擴展格式裏的IDE爲隱性。

遠程幀:遠程幀用以請求總線上的相關單元發送具有相同標示的數據幀。

出錯幀:由檢測出總線錯誤的單元發送。

超載幀:超載幀用於提供當前和後續的數據幀的附加延遲。


2.2 一種CAN主控制器的實際寄存器組成。

    我們以NXP公司的LPC21xx處理器的CAN控制器爲例說明。

    因爲CAN控制有一個比較特殊的“濾波功能”,所有我們把CAN控制器的寄存器組成分爲“濾波功能”相關以及接收發送數據相關寄存器和其他類寄存器。


        2.2.1 針對這個其他類寄存器。咱們首先討論配置類寄存器,包括CAN模式配置寄存器,總線時序寄存器,錯誤警告閾值寄存器等。

        CAN模式配置寄存器能夠配置的內容主要包括CAN控制器的使能以及相關的運行模式,模式包括偵聽模式(Can控制器不會發送ACK在CAN總線上,即使完整的收到一個幀,並且節點處於被動錯誤模式,這個偵聽模式是爲了波特率的監測以及熱插拔。)、自檢測模式(發送幀不需要收到ACK即算髮送成功)、睡眠模式以及迴環測試模式。其中自測試的模式分爲全局自測試和局部自測試,全局自測試設置自接收請求位(控制器在發送的時候並不停止接收功能,所以如果發送的幀滿足幀過濾的要求,即被接收)就可以,這樣不僅能接收到自己發送的報文,還能接收到遠端發送的報文, 局部自測試爲測試模式+自接收模式,這樣就不需要總線上掛接其他的CAN設備,只需要轉發器就可以了。我們常用的模式一般爲迴環測試模式,用於測定CAN控制器初始化正常。

   總線時序寄存器。首先介紹一個基本概念,對於總線上傳輸的數,一位有效的數據(1或者0)由四個段構成,同步段(SS)、傳播時間段(PTS)、相位緩衝段1(PBS1)、相位緩衝段2(PBS2)這些段又由稱之爲Time Quantum(以下稱Tq最小時間單位構成。1位分爲4個段,每個段由若干個Tq構成,這稱爲位時序。

        同步段SS:隱形電平到顯性電平的變化邊沿被期望出現在本段。

        傳輸時間段PTS:用於吸收網絡上的物理延遲的段。

        PBS1與PBS2:當信號邊沿不能出現在SS 段時,此段用來矯正誤差。由於各單元以各自獨立的時鐘來工作,細微的時鐘誤差都會累積起來,PBS 段可用於吸收此誤差。爲了吸收一個時鐘誤差,在SJW設置的範圍內增減PBS1和PBS2,PBS1和PBS2越大,允許誤差越大,但是通訊速度會降低。

    總線時序寄存器配置包括預分頻,以及四段相關的參數,針對NXP 的LPC21XX的Can通信的位時間等於位TESG1+TESG2+3。

    中斷使能寄存器,包括CAN控制器能發出的中斷(接收中斷,發送中斷,總線錯誤中斷等)。

    錯誤警告閾值寄存器,在CAN工作時,這個值將一直跟TX和RX的錯誤計數值進行比較,如果有一致的情況,則發送錯誤警告。當發生CAN錯誤的時候,控制器遞增接收錯誤計數器或者發送錯誤計數器,當沒有檢測到錯誤的時候遞減。如果發送錯誤計數器計數到了255並且又有一個錯誤發生,則CAN控制器被強制置爲Bus-Off狀態。並且這個時候的發送錯誤計數爲127,並且接收錯誤計數器爲0.軟件必須清除RM這一位。在那之後錯誤計數器會從128往下遞減證明是否在總線的空閒狀態下(11個連續的隱形位)。BS置位的時候,往其寫入任意的0到254的數據清除BUS-OFF狀態,當軟件在清除BUS-OFF狀態時,則只需要檢測一個數據總線空閒即可以繼續。RM置位並且Can控制器被禁能大部分的功能,並且發送總線錯誤中斷。總線上的設備根據TX和RX的錯誤計數值會進入不同的狀態,如下圖所示:

       


        主動錯誤模式當檢測到總線發生錯誤的時候,會發送錯誤幀,而被動錯誤模式作爲一種過渡模式,其不能主動向其他設備發送錯誤幀,並且在發送正常的報文的時候還需要在間隔幀期間內必須插入“暫停發送期”(由8個位的隱性位組成)。

        

        2.2.2 下一類寄存器介紹接收相關類寄存器。

         發送命令寄存器,包含三個發送緩存寄存器的選擇,控制發送,並且停止發送,釋放BUFF,發送寄存器的作用就是當準備好發送數據寫入相應寄存器之後,操作這個寄存器完成發送操作。

        接收幀數據寄存器,包含接收幀是否爲旁路模式接收的數據,以及包含如果不是旁路模式,匹配AF中的過濾條目的index。包含接收幀是數據幀還是遙控幀。如果是遙控幀,則包含期待以相同ID發送的數據幀包含的數據個數,如果是數據幀則包含接收數據的字節數。同時還包含接收幀是標準幀還是擴展幀的信息。

        接收ID寄存器,包含接收幀的ID信息,標準幀爲11位,擴展幀爲29位。

        接收數據寄存器A,接收到的低32位,4字節數據寄存器。

        接收數據寄存器B,接收到的高32位,4字節數據寄存器。

        發送幀信息寄存器(三個,每個發送緩存區一個),包括髮送幀是遙控幀還是數據幀,如果是遙控幀則包含發送的遙控幀期待以相同ID發送的數據幀包含的數據個數,如果是數據幀,則包含發送數據的字節數。以及發送數據爲標準幀還是擴展幀,以及發送緩存區的優先級。

        發送幀的ID寄存器(三個),標準幀11位,擴展幀爲29位。

        發送寄存器TDA和TDB:存儲需要發送的8字節數據。

        發送狀態寄存器CANTxSR:表徵所有CAN控制器是正在發送數據,還是發送buff可以寫入,還是發送已經完成。

        接收狀態寄存器CANRxSR:表徵所有CAN控制器是正在接收一個數據,還是完整的接收了一個數據,還是出現了接收數據溢出的情況。

        綜合狀態寄存器:表徵TX與RX的錯誤值是否超出了設定的閾值,或者總線處在busoff狀態。

        

        2.2.3 “濾波功能”相關寄存器。

        首先介紹一下NXP的芯片特殊的一種概念“Full CAN”模式,類似STM的DMA,NXP將一個特殊的過濾表匹配的報文直接放到了RAM空間,程序能夠隨機存取。所以NXP的過濾表由4+2部分組成,分別爲1.FullCAN ID'S  2.獨立11bit ID匹配  3.組11bit ID匹配 4.獨立29bit ID匹配 5.組29bit ID匹配 6.FullCAN 接收數據,每種的數據組成如下圖。

        

FullCAN 過濾表的條目組成如下圖,若CAN控制器接收到匹配其中條目的CAN ID,則放至FullCAN 接收數據表中:

         

          

        獨立11bit ID匹配條目,若接收到的標準幀匹配條目中的CAN ID 就將其接收,否則過濾掉:

        

        組11Bit ID匹配條目,若接收到的標準幀在條目指示的ID範圍內,將接收報文,否則報文被過濾掉。

    


         獨立29bit ID匹配條目,若接收到的擴展幀與條目匹配,則接收。

        

        組29bit ID匹配條目,若接收到的擴展幀在兩個條目指示的ID範圍之間,則接收,否則就會被過濾掉。

        

        


        驗收濾波模式寄存器,包含了能夠關閉所有接收操作的控制位(只有在關閉CAN控制器的接收操作,才能修改過濾相關的寄存器),同時包含了旁路模式控制位(旁路模式下不進行過濾),是否使能FullCAN的控制。

        獨立標準幀的過濾表起始地址寄存器,AF Lookup RAM中,獨立的標準幀起始的地址。如果這個表爲空,則將這個值與組標準幀過濾表起始地址中的值寫成一樣。若使用Fullcan,則這一位也能指示Fullcan表的大小。

        組標準幀過濾表起始地址寄存器,如果此表爲空,則這個寄存的值與獨立擴展幀寄存器地址的值一樣。這個最大的值爲0x800,此時爲後邊的表都爲空。

        獨立擴展幀寄存器地址寄存器,獨立擴展幀過濾表起始地址。如果爲空,則寫入與組擴展幀過濾表表起始地址一樣的值。最大值爲0x800。

        組擴展幀過濾表表起始地址寄存器,如果這個表爲空,則將其與ENDofTable寄存器的值寫成一樣的。

        過濾表RAM結束地址寄存器,這個地址的上面是最後一個AF表。如果fullCAN沒有使用,這個值最大值爲0x800。如果Fullcan得以使用,這個地址代表了AF將符合第一個fullcan表中的數據保存在這個地址的後邊。

        還有一些FullCan的中斷控制寄存器,以及過濾表訪問錯誤的寄存器,這裏就不多做介紹了     

        下一期針對一個實際的應用場景,來說明一下針對CAN總線的驅動部分代碼(CAN寄存器的配置),以及在實際應用過程中會遇到的一些問題

        

   


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章