胡洪坡,梁書劍,鄭振華,王鐵軍,楊華
(河北省張家口市宣化區(qū)總參通信訓練基地科研所,張家口 075100)
控制器局域網(wǎng)(Controller Area Network,CAN)是國際上應用最廣的工業(yè)級現(xiàn)場總線之一。CAN總線最開始應用在汽車控制系統(tǒng)中,后來由于其卓越的控制性能及較高的性價比被陸續(xù)應用在其他自動控制領(lǐng)域,如工業(yè)自動化、多種控制設(shè)備、交通工具、醫(yī)療儀器、建筑領(lǐng)域以及環(huán)境控制等。STM32F107VCT6是基于 ARM Cortex-M3內(nèi)核的高性能微控制器芯片,主頻72MHz,內(nèi)部含有256 KB的Flash和64KB的SRAM。該芯片外設(shè)資源豐富,具有定時器、RS-485、RS-232、I2C總線、SPI、PWM、CAN總線等多種I/O資源。STM32F107VCT6芯片的CAN總線是一種擴展的CAN總線,稱為bxCAN(Basic Extended CAN),它支持CAN協(xié)議2.0A和2.0B。它的設(shè)計目標是以最小的CPU負荷來高效處理大量收到的報文,也支持報文發(fā)送的優(yōu)先級要求(優(yōu)先級特性可軟件配置)。本文主要研究STM32F107VCT6芯片的bxCAN總線使用技術(shù)。
STM32F107VCT6芯片的bxCAN有2路CAN總線通道,分別是CAN0和CAN1,每個CAN通道都有一個發(fā)送端TX和一個接收端RX。CAN1RX和CAN1TX位于芯片的GPIO引腳PD0和PD1上,CAN2RX和CAN2 TX位于芯片的GPIO引腳PB5和PB6上。STM32F107VCT6芯片的GPIO端口具有多種復用功能,要想正常使用bxCAN的功能,須首先對總線端口進行配置,主要步驟如下:
(1)RCC初始化
由于節(jié)能的需要,在系統(tǒng)加電復位時GPIO引腳是不工作的,所以要想正常使用CAN總線,必須配置復位時鐘控制RCC,給引腳加電。配置代碼如下:
(2)GPIO初始化
對bxCAN對應的GPIO引腳進行初始化,主要是配置GPIOD的引腳、輸入輸出狀態(tài)、數(shù)據(jù)速率等,之后還要進行重映射。以CAN1的初始化為例,配置代碼如下:GPIO_InitTypeDef GPIO_InitStructure;
(3)NVIC初始化
如果使用CAN總線中斷,還要配置嵌套向量中斷控制器NVIC。初始化代碼如下:
在bxCAN總線端口配置好后,還要對CAN總線的一些傳輸特性參數(shù)進行設(shè)置。遵循以下步驟:
(1)CAN寄存器初始化
為了防止其他操作更改特定寄存器的內(nèi)容,在進行傳輸特性參數(shù)配置前一般會對CAN總線接口初始化,使與CAN總線有關(guān)的寄存器恢復到加電復位狀態(tài)。代碼如下:
(2)CAN單元初始化
CAN單元初始化涉及到的參數(shù)由CAN控制寄存器CAN_MCR控制,CAN_MCR控制寄存器是一個32位的寄存器,其中不同的位段控制不同的功能。主要的位段有時間觸發(fā)通信模式 TTCM、自動離線(Bus-Off)管理ABOM、自動喚醒模式AWUM、禁止報文自動重傳NART、接收FIFO鎖定模式RFLM、發(fā)送FIFO優(yōu)先級TXFP等,對不同的位段置1或置0會影響相應的功能。配置代碼如下:
此外,還要對CAN總線的操作模式MODE以及波特率特性SJW、BS1、BS2等參數(shù)進行相應設(shè)置。代碼如下:
(3)濾波器初始化
在CAN總線通信中,沒有地址的概念,即收發(fā)雙方不會像其他通信方式那樣在通信前需要指定收發(fā)雙方的地址,而是對每個發(fā)送的幀附加一個標識符,當發(fā)送方發(fā)出一個幀后,在總線上的用戶都能收到此發(fā)送幀,采用的通信方式是一點對多點的通信方式。如果接收方只對特定標識符的數(shù)據(jù)幀感興趣,而忽略其他標識符的幀,CAN總線協(xié)議提供了一種稱為“過濾器”的選擇方式來實現(xiàn)。STM32F107VCT6芯片的bxCAN提供28個位寬可變/可配置的標識符過濾器組,通過軟件對它們編程,從而在引腳收到的報文中選擇需要的報文,而把其他報文丟棄掉。在進行濾波器設(shè)置過程中,需要對濾波器號碼、濾波器初始化模式、過濾器位寬、過濾器標識符、過濾器屏蔽標識符、過濾器輸出FIFO、過濾器使能等參數(shù)進行配置。濾波器初始化代碼如下:
在對bxCAN總線的端口配置好并初始化傳輸參數(shù)后,就可以利用bxCAN總線傳送數(shù)據(jù)了。在收發(fā)數(shù)據(jù)前,我們先來看一下數(shù)據(jù)幀的幀結(jié)構(gòu)。
(1)bxCAN數(shù)據(jù)幀結(jié)構(gòu)
在bxCAN總線上傳送報文時以幀為單位傳送。bx-CAN總線的幀結(jié)構(gòu)與CAN總線的幀結(jié)構(gòu)基本一致。bx-CAN總線的幀主要有數(shù)據(jù)幀、遠程幀、錯誤幀和超載幀4種類型。數(shù)據(jù)幀的作用是從發(fā)送器向接收器攜帶數(shù)據(jù);遠程幀的作用是總線單元請求發(fā)送具有同一標識的數(shù)據(jù)幀;錯誤幀的作用是在總線上有錯誤時指示錯誤;超載幀的作用是在相鄰數(shù)據(jù)幀之間附加一定的延時。在bxCAN總線通信時主要使用的是數(shù)據(jù)幀,限于篇幅,只給出數(shù)據(jù)幀的幀結(jié)構(gòu),標準幀數(shù)據(jù)幀結(jié)構(gòu)如圖1所示。
圖1 標準幀數(shù)據(jù)幀結(jié)構(gòu)
由圖1可見,數(shù)據(jù)幀主要由7個不同的位場組成,分別是幀起始、仲裁場、控制場、數(shù)據(jù)場、CRC場、應答場、幀結(jié)束。幀起始SOF標志一個幀的起始,為一個顯性位(低電平0)。仲裁場由11位標識符ID和1位發(fā)送請求位RTR組成??刂茍鲇?位組成,分別是1位標識符IDE擴展位,用來表示是標準幀還是擴展幀;1位擴展位r0,待以后擴展使用;4位數(shù)據(jù)長度代碼DLC,表示幀攜帶數(shù)據(jù)的字節(jié)數(shù)。數(shù)據(jù)場由數(shù)據(jù)幀的發(fā)送數(shù)據(jù)組成,可以有0~8個字節(jié)數(shù)據(jù),共64位。CRC場進行幀的CRC校驗,包括運算得出的15位CRC序列和1個隱性(高電平1)的CRC界定符位。應答場為2位,包括1位應答間隙位和1位應答界定符位。幀結(jié)束由7位組成,7位數(shù)據(jù)全為隱性位。
在傳送數(shù)據(jù)時,需要對每個發(fā)送的數(shù)據(jù)包指定標識符ID、遠程幀、標準幀、數(shù)據(jù)長度和發(fā)送的數(shù)據(jù)等數(shù)據(jù)項,之后就可以利用bxCAN總線進行發(fā)送接收了。如果使用中斷接收的話,還要在中斷處理程序中對接收數(shù)據(jù)進行相應處理。
(2)bxCAN數(shù)據(jù)發(fā)送程序
(3)bxCAN中斷接收函數(shù)
本文主要研究了STM32F107VCT6芯片的bxCAN總線的使用技術(shù),使用bxCAN總線一般需要遵循bxCAN總線端口配置、傳輸參數(shù)配置、數(shù)據(jù)幀收發(fā)3個步驟。為了說明問題,在分析過程中還給出了MDK平臺下的bx-CAN總線使用程序,通過程序可以更加清晰地說明各個步驟需要配置的相關(guān)參數(shù),對嵌入式開發(fā)過程中使用bx-CAN總線收發(fā)數(shù)據(jù)具有一定的借鑒作用。
[1] 鄔寬明.CAN總線原理和應用系統(tǒng)設(shè)計[M].北京:北京航空航天大學出版社,2002.
[2] 瑞薩科技.CAN 入門書[EB/OL].[2012-05]http:www.renesas.com.
[3] 劉軍.例說STM32[M].北京:北京航空航天大學出版社,2011.