航順芯片HK32F103CAN的驅(qū)動應(yīng)用
航順芯片HK32F103系列是一款功能強大的32bit MCU,內(nèi)部集成多個通信模塊,其中CAN模塊支持CAN協(xié)議2.0A和2.0B。目前廣泛應(yīng)用的是CAN 2.0B協(xié)議,其收發(fā)數(shù)據(jù)速度高達1Mbps,有兩種不同長度的ID標識符,分別是11位和29位的。
HK32F103系列CAN接口協(xié)議的主要特點:
(1) 多主控制:
總線空閑時,所有的單元均可開始發(fā)送消息。
(2) 消息的發(fā)送:
在 CAN 協(xié)議中,所有的消息都以固定的格式發(fā)送,總線空閑時,所有與總線相連的單元都可以開始發(fā)送新消息。兩個以上的單元同時開始發(fā)送消息時,根據(jù)標識符( Identifier 以下稱為 ID)決定優(yōu)先級。 ID 并不是表示發(fā)送的目的地址,而是表示訪問總線的消息的優(yōu)先級。兩個以上的單元同時開始發(fā)送消息時,對各消息ID的每個位進行逐個仲裁比較。仲裁獲勝(被判定為優(yōu)先級最高)的單元可繼續(xù)發(fā)送消息,仲裁失利的單元則立刻停止發(fā)送而進行接收工作。即多個單元同時開始發(fā)送時,發(fā)送高優(yōu)先級 ID 消息的單元可獲得發(fā)送權(quán)。
(3) 系統(tǒng)的柔軟性:
與總線相連的CAN節(jié)點沒有類似于“地址”的信息。因此在總線上增加CAN節(jié)點時,連接在總線上的其它CAN節(jié)點的軟硬件及應(yīng)用層都不需要改變。
(4) 通信速度:
根據(jù)整個網(wǎng)絡(luò)的規(guī)模,可設(shè)定適合的通信速度。在同一網(wǎng)絡(luò)中,所有CAN節(jié)點必須設(shè)定成統(tǒng)一的通信速度。即使有一個CAN節(jié)點的通信速度與其它的不一樣,此CAN節(jié)點也會輸出錯誤信號,妨礙整個網(wǎng)絡(luò)的通信。不同網(wǎng)絡(luò)間則可以有不同的通信速度。
(5) 錯誤檢測功能·錯誤通知功能·錯誤恢復(fù)功能:
所有的CAN節(jié)點都可以檢測錯誤(錯誤檢測功能)
(6) 遠程數(shù)據(jù)請求:
所有的CAN節(jié)點都可以檢測錯誤(錯誤檢測功能)
檢測出錯誤的CAN節(jié)點會立即同時通知其他所有CAN節(jié)點(錯誤通知功能)
正在發(fā)送消息的CAN節(jié)點一旦檢測出錯誤,會強制結(jié)束當(dāng)前的發(fā)送。強制結(jié)束發(fā)送的CAN節(jié)點會不斷反復(fù)重新發(fā)送此消息直到成功發(fā)送為止(錯誤恢復(fù)功能)。
(7) 故障封閉:
CAN 可以判斷出錯誤的類型是總線上暫時的數(shù)據(jù)錯誤(如外部噪聲等)還是持續(xù)的數(shù)據(jù)錯誤(如單元內(nèi)部故障、驅(qū)動器故障、斷線等)。由此功能,當(dāng)總線上發(fā)生持續(xù)數(shù)據(jù)錯誤時,可將引起此故障的CAN節(jié)點從總線上隔離出去。
(8) 位填充: CAN通信的同步信息包含于傳輸數(shù)據(jù)中,電平的跳轉(zhuǎn)提供了同步信息,如果連續(xù)多個相同的總線值出現(xiàn),這將影響到同步信息的提取。為此CAN采用位填充規(guī)則,即在一幀中的幀起始,仲裁場,控制場,數(shù)據(jù)場和CRC場部分( CRC界定符,應(yīng)答幀和幀結(jié)束除外),當(dāng)發(fā)送器檢測到5個具有相同數(shù)值的連續(xù)位時,將自動插入一個補碼位。接收節(jié)點收到5個連續(xù)位后下一位自動刪除。
(9) 連接:
CAN 總線是可同時連接多個CAN節(jié)點的總線。可連接的節(jié)點總數(shù)理論上是沒有限制的。但實際上可連接的節(jié)點數(shù)受總線上的時間延遲及電氣負載的限制。降低通信速度,可連接的CAN節(jié)點數(shù)增加;提高通信速度,則可連接的CAN節(jié)點數(shù)減少。如下是CAN通信速度和距離對應(yīng)圖:
(9) CAN總線物理框架可以抽象為:
MCU(微處理器) <--> CAN控制器 <--> CAN收發(fā)器 <--> CAN數(shù)據(jù)傳輸總線(CAN-H,CAN-L)。如下所示:
CAN總線的數(shù)據(jù)傳輸線——>兩條雙向數(shù)據(jù)線,分為高位﹝CAN-H﹞和低位﹝CAN-L﹞數(shù)據(jù)線, 為了防止外界電磁波干擾和向外輻射,兩條數(shù)據(jù)線纏繞在一起,要求至少每 2.5cm 就要扭絞一次,兩條線上的電位是相反的,電壓的和總等于常值。
CAN總線的終端電阻——>防止數(shù)據(jù)在到達線路終端后象回聲一樣返回,并因此而干擾原始數(shù)據(jù),從而保證了數(shù)據(jù)的正確傳送,終端電阻裝在控制單元內(nèi)。
CAN總線幀類型:
數(shù)據(jù)幀-Data frame
攜帶數(shù)據(jù)從發(fā)送節(jié)點到接收節(jié)點。
分為標準幀(11位標識符)和擴展幀(29位標識符)。
遠程幀-Remote frame
向其他節(jié)點請求發(fā)送具有同一標識符的數(shù)據(jù)幀, 遠程幀也有標準幀和擴展幀兩種格式。
例如CAN節(jié)點A需要知道CAN節(jié)點B的油溫溫度,CAN節(jié)點A發(fā)送一個遠程幀給節(jié)點B,節(jié)點B收到該遠程幀后發(fā)送一個帶油溫數(shù)據(jù)的數(shù)據(jù)幀給節(jié)點A。
錯誤幀-Error frame
節(jié)點檢測到錯誤之后發(fā)送錯誤幀。
錯誤標志: 主動錯誤標志(000000)和被動錯誤標志(111111)。
錯誤界定符:11111111。
過載幀-Overload frame
接收節(jié)點通知其尚未做好接收準備, 過載標志(過載標志重疊部分)+過載標志界定符。
以下是關(guān)于CAN幀/報文中各個部分的說明:
幀起始:SOF
0,占用1位。當(dāng)總線空閑時發(fā)送,用于CAN總線上的每個節(jié)點的信息同步。
仲裁段:ID+RTR
ID:
表示數(shù)據(jù)幀的優(yōu)先級,先發(fā)送高位再發(fā)送低位。 11位或29位長度。
RTR(Remote Transmit Request):
0: 表示該CAN幀是數(shù)據(jù)幀。
1: 表示該CAN幀是遠程幀。
控制段:IDE+r0+DLC
IDE(IDentifier Extension):
0: 標準格式。
1: 擴展格式。
保留位r0:
0。
保留位r1:
0。
DLC(Data Length Code):
表示數(shù)據(jù)域中的字節(jié)數(shù),范圍0~8.
數(shù)據(jù)段:Data
CRC段:CRC Sequence+CRC界定符
CRC polynomial:
x15+x14+x10+x8+x7+x4+x3+1
CRC界定符:
1.
ACK段:ACK Slot+ACK界定符
接收到匹配CRC序列的節(jié)點會在應(yīng)答位期間,寫0在發(fā)送器的隱性位作為回應(yīng)。
ACK界定符:
1.
幀結(jié)束:EOF
1111111,表示數(shù)據(jù)幀或遠程幀的結(jié)束。
SRR(Substitute Remote Request):
1, 擴展幀中代替RTR位.
CAN總線通信機制—報文發(fā)送
-載波偵聽和帶沖突檢測協(xié)議的多路訪問( CSMA/CD)
-發(fā)送節(jié)點:回讀;
接收節(jié)點:監(jiān)聽
-線與機制:
所有節(jié)點發(fā)送1,總線上才是1;有一個節(jié)點發(fā)送0,總線上就是0,即高電平是隱性位,低電平是顯性位。
-總線仲裁:如果有兩個或兩個以上的節(jié)點同時向總線上發(fā)送數(shù)據(jù),標識符小的獲得仲裁,標識符大的退出仲裁(回讀和線與)。
例如:
ID1:00000000010
ID2:00000000001
CAN總線通信機制—報文接收
如果總線上有數(shù)據(jù)正在發(fā)送,所有節(jié)點都會接收總線數(shù)據(jù),只有通過接收節(jié)點的報文過濾規(guī)則才能被節(jié)點接收進控制器。
CAN的錯誤狀態(tài):
主動錯誤狀態(tài):主動錯誤狀態(tài)是可以正常參加總線通信的狀態(tài)。處于主動錯誤狀態(tài)的單元檢測出錯誤時,輸出主動錯誤標志。
被動錯誤狀態(tài): 被動錯誤狀態(tài)是易引起錯誤的狀態(tài)。 處于被動錯誤狀態(tài)的單元檢測出錯誤時,輸出被動錯誤標志。處于被動錯誤狀態(tài)的單元即使檢測出錯誤,而其它處于主動錯誤狀態(tài)的單元如果沒發(fā)現(xiàn)錯誤,整個總線也被認為是沒有錯誤的。
總線關(guān)閉狀態(tài):總線關(guān)閉態(tài)是不能參加總線上通信的狀態(tài)。信息的接收和發(fā)送均被禁止。
錯誤類型:
現(xiàn)在以航順芯片的HK32F103VET6(LQFP-100)為例來說明CAN通信的驅(qū)動實現(xiàn)。HK32F103VET6是航順芯片的一款功能強大的32位MCU,內(nèi)部集成CAN控制器,因此進行CAN通信時,只需要外接一個CAN收發(fā)器。
由HK32F103芯片的datasheet,如下截圖我們得知,CAN的發(fā)送引腳為PA12,接收引腳為PA11。
由HK32F103芯片的用戶手冊,如下截圖,得知需要把CAN的發(fā)送引腳PA12設(shè)置為推挽復(fù)用輸出,CAN的接收引腳PA11設(shè)置為浮空輸入或上拉輸入。
詳細的GPIO配置,依據(jù)該芯片的用戶手冊的表8-1:
因此,軟件中對引腳的設(shè)置如下:
這里,我們使用TJA1050作為CAN收發(fā)器,原理示意圖如下:
將CAN_D連接HK32F103VET6芯片的引腳PA12,CAN_R連接HK32F103VET6芯片的引腳PA11,CANL和CANH接外部CAN總線(即前文提到的CAN-L和CAN-H)。
軟件驅(qū)動方面,首先應(yīng)該使能CAN模塊的時鐘,如下:
HK32F103VET6芯片CAN模塊(后續(xù)我們簡稱其為bxCAN)有3個主要的工作模式:初始化、正常和睡眠模式。在硬件復(fù)位后,bxCAN 工作在睡眠模式以節(jié)省電能,同時 CANTX 引腳的內(nèi)部上拉電阻被激活。軟件通過對 CAN_MCR 寄存器的INRQ或SLEEP 位置’1’,可以請求 bxCAN 進入初始化或睡眠模式。一旦進入了初始化或睡眠模式,bxCAN 就對 CAN_MSR 寄存器的 INAK 或 SLAK 位置’1’來進行確認,同時內(nèi)部上拉電阻被禁用。當(dāng)INAK 和 SLAK 位都為’0’時,bxCAN 就處于正常模式。在進入正常模式前,bxCAN 必須跟 CAN 總線取得同步;為取得同步,bxCAN 要等待 CAN 總線達到空閑狀態(tài),即在 CANRX 引腳上監(jiān)測到 11 個連續(xù)的隱性位。
因此我們需要把CAN模塊設(shè)置為初始化模式,如下:
在初始化模式設(shè)置成功之后,根據(jù)具體應(yīng)用的要求,設(shè)置自動離線(Bus-Off)管理、自動喚醒模式、是否禁止報文自動重傳、接收FIFO鎖定模式、發(fā)送 FIFO 優(yōu)先級等,如下示例:
CAN通信過程中,很重要的一點是設(shè)置通信速率,bxCAN的通信速率設(shè)置依據(jù)HK32F103VET6用戶手冊中的:
我們現(xiàn)在要設(shè)置500Kbps的通信速度,那么需要設(shè)置APB時鐘頻率為36MHz,還需要設(shè)置位BRP=3,TS1=8,TS2=7,如下:
至此,CAN初始化中幾個重要特性已經(jīng)設(shè)置好,可以把CAN模塊設(shè)置位正常模式,以便正常地發(fā)送報文。從初始化模式切換為正常模式的設(shè)置,如下:
報文的發(fā)送,其核心在于正確操作CAN_TIxR、CAN_TDTxR、CAN_TDLxR、CAN_TDHxR寄存器,如下為例,發(fā)送標準格式的ID=0x12的8字節(jié)長度的CAN數(shù)據(jù)幀報文。
并通過對應(yīng)的狀態(tài)寄存器檢查發(fā)送成功與否:
某個CAN節(jié)點要接收哪些CAN報文,由其CAN接收規(guī)則(或者稱為接收過濾器)設(shè)定。在接收到有效的報文之前,應(yīng)該先設(shè)置好其接收規(guī)則。為此,HK32F103VET6的bxCAN 控制器為應(yīng)用程序提供了 14 個位寬可變的、可配置的過濾器組(13~0),以便只接收那些軟件需要的報文。硬件過濾的做法節(jié)省了 CPU 開銷,否則就必須由軟件過濾從而占用很大的 CPU開銷。每個過濾器組x由2個32位寄存器,CAN_FiR1和CAN_FiR2【(CAN_FiRx) (i=0..13; x=1..2)】,組成。
每個過濾器組的位寬都可以獨立配置,以滿足應(yīng)用程序的不同需求。根據(jù)位寬的不同,每個過濾器組可提供:
• 1 個 32 位過濾器,包括:STDID[10:0]、EXTID[17:0]、IDE 和 RTR 位
• 2 個 16 位過濾器,包括:STDID[10:0]、IDE、RTR 和 EXTID[17:15]位
此外過濾器可配置為,屏蔽位模式和標識符列表模式。
在屏蔽位模式下,標識符寄存器和屏蔽寄存器一起,指定報文標識符的任何一位,應(yīng)該按照“必須匹配”或“不用關(guān)心”處理。
在標識符列表模式下,屏蔽寄存器也被當(dāng)作標識符寄存器用。因此,不是采用一個標識符加一個屏蔽位的方式,而是使用 2 個標識符寄存器。接收報文標識符的每一位都必須跟過濾器標識符相同。
過濾器組可以通過相應(yīng)的 CAN_FM1R 寄存器配置。在配置一個過濾器組前,必須通過清除 CAN_FAR寄存器的 FACT 位,把它設(shè)置為禁用狀態(tài)。通過設(shè)置 CAN_FS1R 的相應(yīng) FSCx 位,可以配置一個過濾器組的位寬,請參見下圖。通過 CAN_FM1R 的 FBMx 位,可以配置對應(yīng)的屏蔽/標識符寄存器的標識符列表模式或屏蔽位模式。
我們以常用的一個32位過濾器+標識符屏蔽的方式為例進行說明。
如上圖,“映像”行中,RTR對應(yīng)CAN_FiRx的bit1,IDE對應(yīng)CAN_FiRx的bit2,EXID對應(yīng)CAN_FiRx的bit3-bit20,STID對應(yīng)CAN_FiRx的bit21-bit31。結(jié)合前文仲裁段和控制段所述,RTR為0時表示該CAN幀是數(shù)據(jù)幀,為1時表示該CAN幀是遠程幀;IDE為0時表示該CAN幀是標準格式,為1時表示該CAN幀是擴展格式。標準格式下只用到STID位,擴展格式下還會用到EXID位。在32位過濾器+標識符屏蔽的方式應(yīng)用中,“ID”行中,即CAN_FiR1寄存器用于設(shè)置CAN報文的ID、IDE、RTR。“屏蔽”行中,即CAN_FiR2寄存器用于設(shè)置接收報文過程中,是否比較ID、IDE、RTR這些對應(yīng)的各個位,為0時表示“不用關(guān)心”,為1時表示“必須匹配”。以RTR為例,當(dāng)設(shè)置CAN_FiR2的RTR為1“必須匹配”,且CAN_FiR1時RTR為0時,表示只接收數(shù)據(jù)幀,不接收遠程幀;而當(dāng)設(shè)置CAN_FiR2的RTR為0時“不用關(guān)心”,表示無論是數(shù)據(jù)幀還是遠程幀,都會進行接收。
下面,我們開始說明過濾器的具體設(shè)置。
首先應(yīng)該設(shè)置過濾器組工作在初始化模式并暫時禁用過濾器,如下:
接著設(shè)置過濾器的位寬是單個32位,及工作在標識符屏蔽位模式下,如下:
假設(shè)我們現(xiàn)在只需要接收兩條CAN標準數(shù)據(jù)幀,且其ID分別為00000000000和00000000001,那么應(yīng)該設(shè)置IDE為0,RTR為0,CAN_FiR1為0,CAN_FiR2為0xFFC00006,如下:
接著設(shè)置接收到的報文存放于哪個FIFO,這里我們存放到FIFO 0,如下:
最后重新激活過濾器和設(shè)置過濾器工作在正常模式:
編輯:zzy 最后修改時間:2022-04-15