MCU微課堂
CKS32F107XX系列bxCAN介紹
第七十期 2026.01.19
bxCAN簡介
CKS32F107xx系列產(chǎn)品的bxCAN支持CAN協(xié)議2.0A和2.0B標(biāo)準(zhǔn)。 該CAN 控制器支持最高的通訊速率為1Mb/s;可以自動地接收和發(fā)送CAN報文,支持使用標(biāo)準(zhǔn)ID和擴展ID的報文;外設(shè)中具有3個發(fā)送郵箱,發(fā)送報文的優(yōu)先級可以使用軟件控制,還可以記錄發(fā)送的時間;具有2個3級深度的接收FIFO,可使用過濾功能只接收或不接收某些ID號的報文;可配置成自動重發(fā);不支持使用 DMA進(jìn)行數(shù)據(jù)收發(fā)。
圖1是CKS32F107系列芯片的CAN外設(shè)架構(gòu)圖,圖里具有2組CAN 控制器,其中CAN1是主設(shè)備,框圖中的“存儲訪問控制器”是由CAN1控制的,CAN2無法直接訪問存儲區(qū)域,所以使用CAN2的時候必須使能CAN1外設(shè)的時鐘??驁D中主要包含CAN控制內(nèi)核、發(fā)送郵箱、接收FIFO以及驗收篩選器。

圖1 CKS32F107系列CAN外設(shè)架構(gòu)圖
CAN控制內(nèi)核
CAN控制內(nèi)核包含了各種控制寄存器及狀態(tài)寄存器,我們主要講解其中的主控制寄存器CAN_MCR及位時序寄存器CAN_BTR。
主控制寄存器CAN_MCR負(fù)責(zé)管理CAN的工作模式,主要包括以下工作模式:
DBF調(diào)試凍結(jié)功能 DBF(Debug freeze):調(diào)試凍結(jié),使用它可設(shè)置CAN處于工作狀態(tài)或禁止收發(fā)的狀態(tài),禁止收發(fā)時仍可訪問接收FIFO中的數(shù)據(jù)。這兩種狀態(tài)是當(dāng)芯片處于程序調(diào)試模式時才使用的,平時使用并不影響。
TTCM 時間觸發(fā)模式 TTCM(Time triggered communication mode):時間觸發(fā)模式,它用于配置CAN的時間觸發(fā)通信模式,在此模式下,CAN使用它內(nèi)部定時器產(chǎn)生時間戳,利用它可以實現(xiàn)ISO 11898-4CAN標(biāo)準(zhǔn)的分時同步通信功能。 ABOM自動離線管理 ABOM(Automatic bus-o? management): 自動離線管理,它用于設(shè)置是否使用自動離線管理功能。當(dāng)節(jié)點檢測到它發(fā)送錯誤或接收錯誤超過一定值時,會自動進(jìn)入離線狀態(tài),在離線狀態(tài)中,CAN不能接收或發(fā)送報文。處于離線狀態(tài)的時候,可以軟件控制恢復(fù)或者直接使用這個自動離線管理功能,它會在適當(dāng)?shù)臅r候自動恢復(fù)。
AWUM 自動喚醒 AWUM(Automatic bus-o? management):自動喚醒功能,CAN 外設(shè)可以使用軟件進(jìn)入 低功耗的睡眠模式,如果使能了這個自動喚醒功能,當(dāng) CAN檢測到總線活動的時候,會自動喚醒。
NART 自動重傳NART(No automatic retransmission): 報文自動重傳功能,設(shè)置這個功能后,當(dāng)報文發(fā)送失敗時會自動重傳至成功為止。若不使用這個功能,無論發(fā)送結(jié)果如何,消息只發(fā)送一次。
RFLM鎖定模式RFLM(Receive FIFO locked mode):FIFO 鎖定模式,該功能用于鎖定接收FIFO。鎖定后,當(dāng)接收FIFO溢出時,會丟棄下一個接收的報文。若不鎖定,則下一個接收到的報文會覆蓋原報文。
TXFP報文發(fā)送優(yōu)先級的判定方法TXFP(Transmit FIFO priority):報文發(fā)送優(yōu)先級的判定方法,當(dāng)CAN外設(shè)的發(fā)送郵箱中有多個待發(fā)送報文時,本功能可以控制它是根據(jù)報文的ID優(yōu)先級還是報文存進(jìn)郵箱的順序來發(fā)送。
位時序寄存器(CAN_BTR)及波特率:CAN外設(shè)中的位時序寄存器CAN_BTR用于配置測試模式、波特率以及各種位內(nèi)的段參數(shù)。
正常模式:正常模式下就是一個正常的CAN節(jié)點,可以向總線發(fā)送數(shù)據(jù)和接收數(shù)據(jù)。
靜默模式:靜默模式下,它自己的輸出端的邏輯0數(shù)據(jù)會直接傳輸?shù)剿约旱妮斎攵耍壿?可以被發(fā)送到總線,所以它不能向總線發(fā)送顯性位(邏輯0),只能發(fā)送隱性位(邏輯1)。輸入端可以從總線接收內(nèi)容。由于它只可發(fā)送的隱性位不會強制影響總線的狀態(tài),所以把它稱為靜默模式。這種模式一般用于監(jiān)測,它可以用于分析總線上的流量,但又不會因為發(fā)送顯性位而影響總線。
回環(huán)模式:回環(huán)模式下,它自己的輸出端的所有內(nèi)容都直接傳輸?shù)阶约旱妮斎攵耍敵龆说膬?nèi)容同時也會被傳輸?shù)娇偩€上,即也可使用總線監(jiān)測它的發(fā)送內(nèi)容。輸入端只接收自己發(fā)送端的內(nèi)容,不接收來自總線上的內(nèi)容。使用回環(huán)模式可以進(jìn)行自檢。
回環(huán)靜默模式:該模式是以上兩種模式的結(jié)合,自己的輸出端的所有內(nèi)容都直接傳輸?shù)阶约旱妮斎攵?,并且不會向總線發(fā)送顯性位影響總線,不能通過總線監(jiān)測它的發(fā)送內(nèi)容。輸入端只接收自己發(fā)送端的內(nèi)容,不接收來自總線上的內(nèi)容。這種方式可以在“熱自檢”時使用,即自我檢查的時候,不會干擾總線。
位時序及波特率: CKS32F107中CAN的位時序如圖2所示。

圖2 CAN位時序圖
CKS32F107的CAN外設(shè)位時序中只包含3段,分別是同步段SYNC_SEG、位段 BS1及位段BS2,采樣點位于BS1及BS2段的交界處。其中SYNC_SEG段固定長度為1Tq,而BS1及BS2段可以在位時序寄存器CAN_BTR設(shè)置它們的時間長度,它們可以在重新同步期間增長或縮短,該長度SJW也可在位時序寄存器中配置。因此通過配置位時序寄存器CAN_BTR的TS1[3:0]及TS2[2:0]寄存器位設(shè)定BS1及 BS2段的長度后,我們就可以確定每個CAN數(shù)據(jù)位的時間:
T1bit =1Tq+TBS1+TBS2=NTq
其中單個時間片的長度Tq與CAN外設(shè)的所掛載的時鐘總線及分頻器配置有關(guān),CAN1和CAN2外設(shè)都是掛載在APB1總線上的,而位時序寄存器CAN_BTR中的BRP[9:0]寄存器位可以設(shè)置CAN外設(shè)時鐘的分頻值,所以:
Tq=(BRP[9:0]+1) x TPCLK
其中的PCLK指APB1時鐘,默認(rèn)值為36MHz。
最終可以計算出CAN通訊的波特率:BaudRate=1/NTq
CAN發(fā)送郵箱
它一共有3個發(fā)送郵箱,即最多可以緩存3個待發(fā)送的報文。每個發(fā)送郵箱中包含有標(biāo)識符寄存器CAN_TIxR、數(shù)據(jù)長度控制寄存器CAN_TDTxR及2個數(shù)據(jù) 寄存器CAN_TDLxR、CAN_TDHxR,它們的功能如下表所示,當(dāng)我們要使用CAN外設(shè)發(fā)送報文時,把報文的各個段分解,按位置寫入到這些寄存器中,并對標(biāo)識符寄存器CAN_TIxR中的發(fā)送請求寄存器位TMIDxR_TXRQ置1,即可把數(shù)據(jù)發(fā)送出去。

CAN接受FIFO
CKS32F107系列一共有2個接收FIFO,每個FIFO中有3個郵箱,即最多可以緩存6個接收到的報文。當(dāng)接收到報文時,F(xiàn)IFO的報文計數(shù)器會自增,而CKS32F107內(nèi)部讀取FIFO數(shù)據(jù)之后,報文計數(shù)器會自減,我們通過狀態(tài)寄存器可獲知報文計數(shù)器的值,而通過前面主控制寄存器的RFLM位,可設(shè)置鎖定模式,鎖定模式下FIFO溢出時會丟棄新報文,非鎖定模式下FIFO溢出時新報文會覆蓋舊報文。跟發(fā)送郵箱類似,每個接收FIFO中包含有標(biāo)識符寄存器CAN_RIxR、數(shù)據(jù)長度控制寄存器CAN_RDTxR及2個數(shù)據(jù)寄存器CAN_RDLxR、CAN_RDHxR,它們的功能見表發(fā)送郵箱的寄存器。通過中斷或狀態(tài)寄存器知道接收FIFO有數(shù)據(jù)后,我們再讀取這些寄存器的值即可把接收到的報文加載到MCU的內(nèi)存中。

驗收篩選器
CAN 外設(shè)的驗收篩選器,一共有28個篩選器組,每個篩選器組有2個寄存器,CAN1和CAN2共用篩選器。在CAN協(xié)議中,消息的標(biāo)識符與節(jié)點地址無關(guān),但與消息內(nèi)容有關(guān)。因此,發(fā)送節(jié)點將報文廣播給所有接收器時,接收節(jié)點會根據(jù)報文標(biāo)識符的值來確定軟件是否需要該消息,為了簡化軟件的工作,CAN外設(shè)接收報文前會先使用驗收篩選器檢查,只接收需要的報文到FIFO中。
初始化結(jié)構(gòu)體
從CKS32F107的CAN外設(shè)我們了解到它的功能非常多,控制涉及的寄存器也非常豐富,而使用標(biāo)準(zhǔn)庫提供的各種結(jié)構(gòu)體及庫函數(shù)可以簡化這些控制過程。跟其它外設(shè)一樣,標(biāo)準(zhǔn)庫提供了CAN初始化結(jié)構(gòu)體及初始化函數(shù)來控制CAN的工作方式,提供了收發(fā)報文使用的結(jié)構(gòu)體及收發(fā)函數(shù),還有配置控制篩選器模式及ID 的結(jié)構(gòu)體。
列表1: 代碼清單:CAN初始化結(jié)構(gòu)體
typedef struct{
uint16_tCAN_Prescaler;
uint8_tCAN_Mode;
uint8_tCAN_SJW;
uint8_tCAN_BS1;
uint8_tCAN_BS2;
FunctionalState CAN_TTCM;
FunctionalState CAN_ABOM;
FunctionalState CAN_AWUM;
FunctionalState CAN_NART;
FunctionalState CAN_RFLM;
FunctionalState CAN_TXFP;
} CAN_InitTypeDef;
(1) CAN_Prescaler
本成員設(shè)置CAN外設(shè)的時鐘分頻,它可控制時間片Tq的時間長度,這里設(shè)置的值最終會減1后再寫入BRP寄存器位,即前面介紹的Tq計算公式:
Tq = (BRP[9:0]+1) x TPCLK
等效于:Tq = CAN_Prescaler x TPCLK
(2) CAN_Mode
本成員設(shè)置CAN的工作模式,可設(shè)置為正常模式(CAN_Mode_Normal)、回環(huán) 模式(CAN_Mode_LoopBack)、靜默模式(CAN_Mode_Silent)以及回環(huán)靜默模式 (CAN_Mode_Silent_LoopBack)。
(3) CAN_SJW
本成員可以配置SJW的極限長度,即CAN重新同步時單次可增加或縮短的最大長度,它可以被配置為1-4Tq(CAN_SJW_1/2/3/4tq)。
(4) CAN_BS1
本成員用于設(shè)置 CAN 位時序中的 BS1 段的長度,它可以被配置為 1-16 個 Tq 長度 (CAN_BS1_1/2/3…16tq)。
(5) CAN_BS2
本成員用于設(shè)置CAN位時序中的BS2段的長度,它可以被配置為1-8個Tq 長度(CAN_BS2_1/2/3…8tq)。 SYNC_SEG、BS1段及BS2段的長度加起來即一個數(shù)據(jù)位的長度,即前面介紹的原來計算公式:T1bit =1Tq+TS1+TS2 =1+ (TS1[3:0] +1)+ (TS2[2:0]+1) 等效于:T1bit = 1Tq+CAN_BS1+CAN_BS2
(6) CAN_TTCM
本成員用于設(shè)置是否使用時間觸發(fā)功能 (ENABLE/DISABLE),時間觸發(fā)功能在某些 CAN 標(biāo)準(zhǔn)中會使用到。
(7) CAN_ABOM
本成員用于設(shè)置是否使用自動離線管理 (ENABLE/DISABLE),使用自動離線管理可以 在節(jié)點出錯離線后適時自動恢復(fù),不需要軟件干預(yù)。
(8) CAN_ AWUM
本成員用于設(shè)置是否使用自動喚醒功能 (ENABLE/DISABLE),使能自動喚醒功能后它 會在監(jiān)測到總線活動后自動喚醒。
(9) CAN_ABOM
本成員用于設(shè)置是否使用自動離線管理功能 (ENABLE/DISABLE),使用自動離線管理 可以在出錯時離線后適時自動恢復(fù),不需要軟件干預(yù)。
(10)CAN_NART
本成員用于設(shè)置是否使用自動重傳功能 (ENABLE/DISABLE),使用自動重傳功能時, 會一直發(fā)送報文直到成功為止。
(11)CAN_RFLM
本成員用于設(shè)置是否使用鎖定接收 FIFO(ENABLE/DISABLE),鎖定接收 FIFO 后,若 FIFO 溢出時會丟棄新數(shù)據(jù),否則在 FIFO 溢出時以新數(shù)據(jù)覆蓋舊數(shù)據(jù)。
(12)CAN_TXFP
本成員用于設(shè)置發(fā)送報文的優(yōu)先級判定方法 (ENABLE/DISABLE),使能時,以報文存 入發(fā)送郵箱的先后順序來發(fā)送,否則按照報文 ID 的優(yōu)先級來發(fā)送。 配置完這些結(jié)構(gòu)體成員后,我們調(diào)用庫函數(shù) CAN_Init 即可把這些參數(shù)寫入到 CAN 控制寄存器 中,實現(xiàn) CAN 的初始化。
CAN發(fā)送及接受結(jié)構(gòu)體
列表2:代碼清單:CAN發(fā)送及接收結(jié)構(gòu)體
typedef struct
{
uint32_t StdId;
uint32_t ExtId;
uint8_t IDE;
uint8_t RTR;
uint8_t DLC;
uint8_t Data[8];
} CanTxMsg;
typedef struct
{
uint32_t StdId;
uint32_t ExtId;
uint8_t IDE;
uint8_t RTR;
uint8_t DLC;
uint8_t Data[8];
uint8_t FMI;
} CanRxMsg;
(1) StdId
本成員存儲的是報文的11位標(biāo)準(zhǔn)標(biāo)識符,范圍是0-0x7FF。
(2) ExtId
本成員存儲的是報文的29位擴展標(biāo)識符,范圍是0-0x1FFFFFFF。ExtId 與 StdId這兩個成員根據(jù)下面的IDE位配置,只有一個是有效的。
(3) IDE
本成員存儲的是擴展標(biāo)志IDE位,當(dāng)它的值為宏CAN_ID_STD時表示本報文是標(biāo)準(zhǔn)幀,使用StdId成員存儲報文ID;當(dāng)它的值為宏CAN_ID_EXT 時表示本報文是擴展幀,使用ExtId成員存儲報文ID。
(4) RTR
本成員存儲的是報文類型標(biāo)志RTR位,當(dāng)它的值為宏CAN_RTR_Data 時表示本報文是數(shù)據(jù)幀;當(dāng)它的值為宏CAN_RTR_Remote時表示本報文是遙控幀,由于遙控幀沒有數(shù)據(jù)段,所以當(dāng)報文是遙控幀時,下面的Data[8]成員的內(nèi)容是無效的。
(5)DLC
本成員存儲的是數(shù)據(jù)幀數(shù)據(jù)段的長度,它的值的范圍是0-8,當(dāng)報文是遙控幀時DLC值為0。
(6) Data[8]
本成員存儲的就是數(shù)據(jù)幀中數(shù)據(jù)段的數(shù)據(jù)。
(7)FMI
本成員只存在于接收結(jié)構(gòu)體,它存儲了篩選器的編號,表示本報文是經(jīng)過哪個篩選器存儲進(jìn)接收FIFO的,可以用它簡化軟件處理。當(dāng)需要使用CAN發(fā)送報文時,先定義一個上面發(fā)送類型的結(jié)構(gòu)體,然后把報文的內(nèi)容按成員賦值到該結(jié)構(gòu)體中,最后調(diào)用庫函數(shù)CAN_Transmit把這些內(nèi)容寫入到發(fā)送郵箱即可把報文發(fā)送出去。 接收報文時,通過檢測標(biāo)志位獲知接收FIFO的狀態(tài),若收到報文,可調(diào)用庫函數(shù)CAN_Receive把接收FIFO中的內(nèi)容讀取到預(yù)先定義的接收類型結(jié)構(gòu)體中,然后再訪問該結(jié)構(gòu)體即可利用報文了。
CAN篩選器結(jié)構(gòu)體
列表3: 代碼清單:CAN篩選器結(jié)構(gòu)體
typedef struct
{
uint16_t CAN_FilterIdHigh;
uint16_t CAN_FilterIdLow;
uint16_t CAN_FilterMaskIdHigh;
uint16_t CAN_FilterMaskIdLow;
uint16_t CAN_FilterFIFOAssignment;
uint8_t CAN_FilterNumber;
uint8_t CAN_FilterMode;
uint8_t CAN_FilterScale;
FunctionalState CAN_FilterActivation;
} CAN_FilterInitTypeDef;
(1) CAN_FilterIdHigh
CAN_FilterIdHigh成員用于存儲要篩選的ID,若篩選器工作在32位模式,它存儲的是所篩選ID的高16位;若篩選器工作在16位模式,它存儲的就是一個完整的要篩選的ID。
(2) CAN_FilterIdLow
類似地,CAN_FilterIdLow 成員也是用于存儲要篩選的ID,若篩選器工作在32位模式,它存儲的是所篩選ID的低16位;若篩選器工作在16位模式,它存儲的就是一個完整的要篩選的ID。
(3) CAN_FilterMaskIdHigh
CAN_FilterMaskIdHigh存儲的內(nèi)容分兩種情況,當(dāng)篩選器工作在標(biāo)識符列表模式時,它的功能與CAN_FilterIdHigh相同,都是存儲要篩選的ID;而當(dāng)篩選器工作在掩碼模式時,它存儲的是CAN_FilterIdHigh成員對應(yīng)的掩碼,與CAN_FilterIdLow組成一組篩選器。
(4) CAN_FilterMaskIdLow
類似地,CAN_FilterMaskIdLow存儲的內(nèi)容也分兩種情況,當(dāng)篩選器工作在標(biāo)識符列表模式時,它的功能與CAN_FilterIdLow 相同,都是存儲要篩選的ID;而當(dāng)篩選器工作在掩碼模式時,它存儲的是 CAN_FilterIdLow 成員對應(yīng)的掩碼,與 CAN_FilterIdLow 組成一組篩選器。
(5) CAN_FilterFIFOAssignment
本成員用于設(shè)置當(dāng)報文通過篩選器的匹配后,該報文會被存儲到哪一個接收 FIFO,它的可選值為 FIFO0或FIFO1(宏CAN_Filter_FIFO0/1)。
(6) CAN_FilterNumber
本成員用于設(shè)置篩選器的編號,即本過濾器結(jié)構(gòu)體配置的是哪一組篩選器,CAN一共有28個篩選器,所以它的可輸入?yún)?shù)范圍為0-27。
(7) CAN_FilterMode
本成員用于設(shè)置篩選器的工作模式,可以設(shè)置為列表模式(宏 CAN_FilterMode_IdList)及掩碼模式(宏 CAN_FilterMode_IdMask)
(8) CAN_FilterScale
本成員用于設(shè)置篩選器的尺度,可以設(shè)置為32位長(宏 CAN_FilterScale_32bit) 及16位長 (宏 CAN_FilterScale_16bit)
(9) CAN_FilterActivation
本成員用于設(shè)置是否激活這個篩選器 (宏 ENABLE/DISABLE)。 配置完這些結(jié)構(gòu)體成員后,我們調(diào)用庫函數(shù)CAN_FilterInit 即可把這些參數(shù)寫入到篩選控制寄存器中,從而使用篩選器。
-
mcu
+關(guān)注
關(guān)注
147文章
18916瀏覽量
397845 -
控制器
+關(guān)注
關(guān)注
114文章
17786瀏覽量
192988 -
寄存器
+關(guān)注
關(guān)注
31文章
5608瀏覽量
129943 -
CAN
+關(guān)注
關(guān)注
59文章
3065瀏覽量
472715
原文標(biāo)題:MCU微課堂|CKS32F107XX系列bxCAN介紹
文章出處:【微信號:中科芯MCU,微信公眾號:中科芯MCU】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
中科芯CKS32F107XX系列MCU的獨立看門狗介紹
中科芯CKS32F107XX系列MCU的窗口看門狗介紹
MCU微課堂|CKS32F4xx系列產(chǎn)品時鐘配置
中科芯CKS32F107XX系列MCU的串行外設(shè)接口介紹
中科芯推出面向CKS32位MCU的編程調(diào)試工具
CKS32F4xx系列產(chǎn)品串口DMA傳輸
CKS32F107xx系列時鐘系統(tǒng)具體配置方法講解
CKS32F107xx系列MCU中ADC介紹
CKS32F107xx系列MCU的GPIO內(nèi)部硬件結(jié)構(gòu)和工作模式
詳解CKS32F107xx系列的定時器同步功能
中科芯CKS32F107XX系列MCU的bxCAN介紹
評論