CAN总线控制器配置说明
文章首先介紹了CAN鏈路層報(bào)文的格式,然后針對NXP芯片的CAN控制器實(shí)現(xiàn)寄存器配置進(jìn)行了相關(guān)說明,能夠幫助讀者能夠快速調(diào)通新板卡上的CAN總線。
目錄
CAN鏈路層報(bào)文格式
CAN主控制器的寄存器組成。
控制類寄存器
收發(fā)相關(guān)寄存器
?“濾波功能”相關(guān)寄存器。
CAN鏈路層報(bào)文格式
? ?說起CAN總線通信,就不得不說明一下CAN設(shè)備之間通信的報(bào)文格式。如同我們通常接觸的RS-232串口通信,當(dāng)我們通過串口嘗試發(fā)送“Hello world”的時(shí)候,其實(shí)串口線上幀組成由起始位+數(shù)據(jù)位(這里的例子就是"Hello world"的ASSIC碼)+奇偶校驗(yàn)位以及停止位。我們的CAN總線上的報(bào)文格式比串口的上的幀格式要復(fù)雜的多,BOSCH 公司《CAN Specification V2.0》文檔分為A、B兩個(gè)部分來介紹兩種在CAN總線上會出現(xiàn)的幀格式。A部分按照CAN1.2規(guī)范的定義,說明了CAN的報(bào)文格式,也有人稱為CAN2.0A協(xié)議。B部分對比A部分定義的標(biāo)準(zhǔn)幀格式,介紹擴(kuò)展幀以及擴(kuò)展幀與標(biāo)準(zhǔn)幀的兼容設(shè)計(jì)。總得來說,符合B部分定義的CAN控制器可以不適用擴(kuò)展幀,依舊通過標(biāo)準(zhǔn)幀與根據(jù)A部分設(shè)計(jì)的CAN控制器進(jìn)行通信。
? ? 在這兩種報(bào)文的格式下,CAN總線上的報(bào)文(幀)種類又分為下面的四種:
? ? 1.數(shù)據(jù)幀:數(shù)據(jù)幀攜帶數(shù)據(jù),由發(fā)送器傳送至接收器。下圖簡單說明了數(shù)據(jù)幀所包含的場空間有那些。
????數(shù)據(jù)幀根據(jù)遵循協(xié)議的不同,分為標(biāo)準(zhǔn)格式幀和擴(kuò)展格式幀,他們的區(qū)別在于仲裁場以及控制場,具體的內(nèi)容分布如下:
? ??????? ??
- RTR為遠(yuǎn)程發(fā)送請求位,數(shù)據(jù)幀為顯性,遙控幀為隱性位。
- SRR是一隱性位。它在擴(kuò)展格式的標(biāo)準(zhǔn)幀RTR位的位置,因此,標(biāo)準(zhǔn)幀與擴(kuò)展幀的沖突是通過標(biāo)準(zhǔn)幀優(yōu)先于擴(kuò)展幀這一途徑得以解決的,擴(kuò)展幀的基本ID如同標(biāo)準(zhǔn)幀的識別符。
- IDE:標(biāo)準(zhǔn)幀格式里的IDE為“顯性”,而擴(kuò)展格式里的IDE為隱性。
2.遠(yuǎn)程幀:遠(yuǎn)程幀用以請求總線上的相關(guān)單元發(fā)送具有相同標(biāo)示的數(shù)據(jù)幀。
3.出錯(cuò)幀:由檢測出總線錯(cuò)誤的單元發(fā)送。
4.超載幀:超載幀用于提供當(dāng)前和后續(xù)的數(shù)據(jù)幀的附加延遲。
CAN主控制器的寄存器組成。
? ? 我們以NXP公司的LPC21xx處理器的CAN控制器為例說明。
? ? 因?yàn)镃AN控制有一個(gè)比較特殊的“濾波功能”,所有我們把CAN控制器的寄存器組成分為“濾波功能”相關(guān)以及接收發(fā)送數(shù)據(jù)相關(guān)寄存器和控制類寄存器。
控制類寄存器
? ? ? ?針對其他類寄存器。咱們首先討論配置類寄存器,包括CAN模式配置寄存器,總線時(shí)序寄存器,錯(cuò)誤警告閾值寄存器等。
????? ? CAN模式配置寄存器能夠配置的內(nèi)容主要包括CAN控制器的使能以及相關(guān)的運(yùn)行模式,模式包括偵聽模式(Can控制器不會發(fā)送ACK在CAN總線上,即使完整的收到一個(gè)幀,并且節(jié)點(diǎn)處于被動(dòng)錯(cuò)誤模式,這個(gè)偵聽模式是為了波特率的監(jiān)測以及熱插拔。)、自檢測模式(發(fā)送幀不需要收到ACK即算發(fā)送成功)、睡眠模式以及回環(huán)測試模式。其中自測試的模式分為全局自測試和局部自測試,全局自測試設(shè)置自接收請求位(控制器在發(fā)送的時(shí)候并不停止接收功能,所以如果發(fā)送的幀滿足幀過濾的要求,即被接收)就可以,這樣不僅能接收到自己發(fā)送的報(bào)文,還能接收到遠(yuǎn)端發(fā)送的報(bào)文, 局部自測試為測試模式+自接收模式,這樣就不需要總線上掛接其他的CAN設(shè)備,只需要轉(zhuǎn)發(fā)器就可以了。我們常用的模式一般為回環(huán)測試模式,用于測定CAN控制器初始化正常。
? ?總線時(shí)序寄存器。首先介紹一個(gè)基本概念,對于總線上傳輸?shù)臄?shù),一位有效的數(shù)據(jù)(1或者0)由四個(gè)段構(gòu)成,同步段(SS)、傳播時(shí)間段(PTS)、相位緩沖段1(PBS1)、相位緩沖段2(PBS2)這些段又由稱之為Time Quantum(以下稱Tq最小時(shí)間單位構(gòu)成。1位分為4個(gè)段,每個(gè)段由若干個(gè)Tq構(gòu)成,這稱為位時(shí)序。
????????同步段SS:隱形電平到顯性電平的變化邊沿被期望出現(xiàn)在本段。
????????傳輸時(shí)間段PTS:用于吸收網(wǎng)絡(luò)上的物理延遲的段。
????????PBS1與PBS2:當(dāng)信號邊沿不能出現(xiàn)在SS 段時(shí),此段用來矯正誤差。由于各單元以各自獨(dú)立的時(shí)鐘來工作,細(xì)微的時(shí)鐘誤差都會累積起來,PBS 段可用于吸收此誤差。為了吸收一個(gè)時(shí)鐘誤差,在SJW設(shè)置的范圍內(nèi)增減PBS1和PBS2,PBS1和PBS2越大,允許誤差越大,但是通訊速度會降低。
? ??總線時(shí)序寄存器配置包括預(yù)分頻,以及四段相關(guān)的參數(shù),針對NXP 的LPC21XX的Can通信的位時(shí)間等于位TESG1+TESG2+3。
? ? 中斷使能寄存器,包括CAN控制器能發(fā)出的中斷(接收中斷,發(fā)送中斷,總線錯(cuò)誤中斷等)。
? ? 錯(cuò)誤警告閾值寄存器,在CAN工作時(shí),這個(gè)值將一直跟TX和RX的錯(cuò)誤計(jì)數(shù)值進(jìn)行比較,如果有一致的情況,則發(fā)送錯(cuò)誤警告。當(dāng)發(fā)生CAN錯(cuò)誤的時(shí)候,控制器遞增接收錯(cuò)誤計(jì)數(shù)器或者發(fā)送錯(cuò)誤計(jì)數(shù)器,當(dāng)沒有檢測到錯(cuò)誤的時(shí)候遞減。如果發(fā)送錯(cuò)誤計(jì)數(shù)器計(jì)數(shù)到了255并且又有一個(gè)錯(cuò)誤發(fā)生,則CAN控制器被強(qiáng)制置為Bus-Off狀態(tài)。并且這個(gè)時(shí)候的發(fā)送錯(cuò)誤計(jì)數(shù)為127,并且接收錯(cuò)誤計(jì)數(shù)器為0.軟件必須清除RM這一位。在那之后錯(cuò)誤計(jì)數(shù)器會從128往下遞減證明是否在總線的空閑狀態(tài)下(11個(gè)連續(xù)的隱形位)。BS置位的時(shí)候,往其寫入任意的0到254的數(shù)據(jù)清除BUS-OFF狀態(tài),當(dāng)軟件在清除BUS-OFF狀態(tài)時(shí),則只需要檢測一個(gè)數(shù)據(jù)總線空閑即可以繼續(xù)。RM置位并且Can控制器被禁能大部分的功能,并且發(fā)送總線錯(cuò)誤中斷。總線上的設(shè)備根據(jù)TX和RX的錯(cuò)誤計(jì)數(shù)值會進(jìn)入不同的狀態(tài),如下圖所示:
????? ?
????? ? 主動(dòng)錯(cuò)誤模式當(dāng)檢測到總線發(fā)生錯(cuò)誤的時(shí)候,會發(fā)送錯(cuò)誤幀,而被動(dòng)錯(cuò)誤模式作為一種過渡模式,其不能主動(dòng)向其他設(shè)備發(fā)送錯(cuò)誤幀,并且在發(fā)送正常的報(bào)文的時(shí)候還需要在間隔幀期間內(nèi)必須插入“暫停發(fā)送期”(由8個(gè)位的隱性位組成)。
收發(fā)相關(guān)寄存器
?????????發(fā)送命令寄存器,包含三個(gè)發(fā)送緩存寄存器的選擇,控制發(fā)送,并且停止發(fā)送,釋放BUFF,發(fā)送寄存器的作用就是當(dāng)準(zhǔn)備好發(fā)送數(shù)據(jù)寫入相應(yīng)寄存器之后,操作這個(gè)寄存器完成發(fā)送操作。
????? ? 接收幀數(shù)據(jù)寄存器,包含接收幀是否為旁路模式接收的數(shù)據(jù),以及包含如果不是旁路模式,匹配AF中的過濾條目的index。包含接收幀是數(shù)據(jù)幀還是遙控幀。如果是遙控幀,則包含期待以相同ID發(fā)送的數(shù)據(jù)幀包含的數(shù)據(jù)個(gè)數(shù),如果是數(shù)據(jù)幀則包含接收數(shù)據(jù)的字節(jié)數(shù)。同時(shí)還包含接收幀是標(biāo)準(zhǔn)幀還是擴(kuò)展幀的信息。
????? ? 接收ID寄存器,包含接收幀的ID信息,標(biāo)準(zhǔn)幀為11位,擴(kuò)展幀為29位。
? ? ? ? 接收數(shù)據(jù)寄存器A,接收到的低32位,4字節(jié)數(shù)據(jù)寄存器。
????????接收數(shù)據(jù)寄存器B,接收到的高32位,4字節(jié)數(shù)據(jù)寄存器。
????? ? 發(fā)送幀信息寄存器(三個(gè),每個(gè)發(fā)送緩存區(qū)一個(gè)),包括發(fā)送幀是遙控幀還是數(shù)據(jù)幀,如果是遙控幀則包含發(fā)送的遙控幀期待以相同ID發(fā)送的數(shù)據(jù)幀包含的數(shù)據(jù)個(gè)數(shù),如果是數(shù)據(jù)幀,則包含發(fā)送數(shù)據(jù)的字節(jié)數(shù)。以及發(fā)送數(shù)據(jù)為標(biāo)準(zhǔn)幀還是擴(kuò)展幀,以及發(fā)送緩存區(qū)的優(yōu)先級。
????? ? 發(fā)送幀的ID寄存器(三個(gè)),標(biāo)準(zhǔn)幀11位,擴(kuò)展幀為29位。
????? ? 發(fā)送寄存器TDA和TDB:存儲需要發(fā)送的8字節(jié)數(shù)據(jù)。
????? ? 發(fā)送狀態(tài)寄存器CANTxSR:表征所有CAN控制器是正在發(fā)送數(shù)據(jù),還是發(fā)送buff可以寫入,還是發(fā)送已經(jīng)完成。
????? ? 接收狀態(tài)寄存器CANRxSR:表征所有CAN控制器是正在接收一個(gè)數(shù)據(jù),還是完整的接收了一個(gè)數(shù)據(jù),還是出現(xiàn)了接收數(shù)據(jù)溢出的情況。
????? ? 綜合狀態(tài)寄存器:表征TX與RX的錯(cuò)誤值是否超出了設(shè)定的閾值,或者總線處在busoff狀態(tài)。
?“濾波功能”相關(guān)寄存器。
????? ? 首先介紹一下NXP的芯片特殊的一種概念“Full CAN”模式,類似STM的DMA,NXP將一個(gè)特殊的過濾表匹配的報(bào)文直接放到了RAM空間,程序能夠隨機(jī)存取。所以NXP的過濾表由4+2部分組成,分別為:
FullCAN 過濾表的條目組成如下圖,若CAN控制器接收到匹配其中條目的CAN ID,則放至FullCAN 接收數(shù)據(jù)表中:
?????????
? ? ??????
? ? ? ? 獨(dú)立11bit ID匹配條目,若接收到的標(biāo)準(zhǔn)幀匹配條目中的CAN ID 就將其接收,否則過濾掉:
????????
????? ? 組11Bit ID匹配條目,若接收到的標(biāo)準(zhǔn)幀在條目指示的ID范圍內(nèi),將接收報(bào)文,否則報(bào)文被過濾掉。
????
? ? ?? ? 獨(dú)立29bit ID匹配條目,若接收到的擴(kuò)展幀與條目匹配,則接收。
????????
????? ? 組29bit ID匹配條目,若接收到的擴(kuò)展幀在兩個(gè)條目指示的ID范圍之間,則接收,否則就會被過濾掉。
????????
????? ? 驗(yàn)收濾波模式寄存器,包含了能夠關(guān)閉所有接收操作的控制位(只有在關(guān)閉CAN控制器的接收操作,才能修改過濾相關(guān)的寄存器),同時(shí)包含了旁路模式控制位(旁路模式下不進(jìn)行過濾),是否使能FullCAN的控制。
????????獨(dú)立標(biāo)準(zhǔn)幀的過濾表起始地址寄存器,AF Lookup RAM中,獨(dú)立的標(biāo)準(zhǔn)幀起始的地址。如果這個(gè)表為空,則將這個(gè)值與組標(biāo)準(zhǔn)幀過濾表起始地址中的值寫成一樣。若使用Fullcan,則這一位也能指示Fullcan表的大小。
????????組標(biāo)準(zhǔn)幀過濾表起始地址寄存器,如果此表為空,則這個(gè)寄存的值與獨(dú)立擴(kuò)展幀寄存器地址的值一樣。這個(gè)最大的值為0x800,此時(shí)為后邊的表都為空。
????????獨(dú)立擴(kuò)展幀寄存器地址寄存器,獨(dú)立擴(kuò)展幀過濾表起始地址。如果為空,則寫入與組擴(kuò)展幀過濾表表起始地址一樣的值。最大值為0x800。
????????組擴(kuò)展幀過濾表表起始地址寄存器,如果這個(gè)表為空,則將其與ENDofTable寄存器的值寫成一樣的。
????? ? 過濾表RAM結(jié)束地址寄存器,這個(gè)地址的上面是最后一個(gè)AF表。如果fullCAN沒有使用,這個(gè)值最大值為0x800。如果Fullcan得以使用,這個(gè)地址代表了AF將符合第一個(gè)fullcan表中的數(shù)據(jù)保存在這個(gè)地址的后邊。
????? ? 還有一些FullCan的中斷控制寄存器,以及過濾表訪問錯(cuò)誤的寄存器,這里就不多做介紹了,各位讀者可在芯片手冊中看到相關(guān)的介紹,有什么看不明白的可以評論區(qū)留言討論。
?十六宿舍 原創(chuàng)作品,轉(zhuǎn)載必須標(biāo)注原文鏈接。
?2023 Yang Li. ?All rights reserved.
歡迎關(guān)注『十六宿舍』,大家喜歡的話,給個(gè)👍,更多關(guān)于嵌入式相關(guān)技術(shù)的內(nèi)容持續(xù)更新中。
總結(jié)
以上是生活随笔為你收集整理的CAN总线控制器配置说明的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Office Tool Plus软件运行
- 下一篇: vs2017旗舰版_2017年的所有旗舰