1 FlexCAN 簡介
FlexCAN 控制器局域網(wǎng)模塊是符合 ISO 11898-1 標(biāo)準(zhǔn)和 CAN 2.0B 規(guī)范的通信控制器,支持 CAN 總線協(xié)議。FlexCAN 模塊框圖如 圖1 所示。FlexCAN 模塊包括 CAN 收發(fā)器(CAN Transceiver)、協(xié)議引擎(Protocol Engine)、控制接口(Controller Host Interface)、總線接口單元(Bus Interface Unit),以及多個支持獨立收發(fā)功能的信息緩沖區(qū)(Message Buffer)。其中 CAN 收發(fā)器負(fù)責(zé)將收發(fā)引腳的 TTL 信號轉(zhuǎn)換為 CAN 總線的電平信號,協(xié)議引擎負(fù)責(zé)處理對信息緩沖區(qū)的讀寫請求,控制接口負(fù)責(zé)傳輸幀的發(fā)送仲裁以及接收匹配,總線接口單元處理 FlexCAN 和內(nèi)部總線的交互,信息緩沖區(qū)用于存儲 FlexCAN 的傳輸幀。
MM32F0140 的 FlexCAN 模塊支持標(biāo)準(zhǔn)幀和擴展幀兩種幀格式,支持?jǐn)?shù)據(jù)幀和遠(yuǎn)程請求幀兩種幀類型,其中數(shù)據(jù)幀的最大有效數(shù)據(jù)長度可達(dá)8比特。FlexCAN 模塊支持最高可達(dá) 1Mps 的可編程比特率,支持對前 16 個信息緩沖區(qū)的中斷,支持局部和全局的接收幀過濾機制,支持可選擇的 FIFO 接收功能。
FlexCAN 模塊支持三種工作模式:回環(huán)模式、只聽模式和正常工作模式。因為在回環(huán)模式下,F(xiàn)lexCAN 的傳輸幀并不會通過其收發(fā)引腳發(fā)送到 CAN 總線,所以通常用于測試單塊芯片的 FlexCAN 模塊是否工作正常。只聽模式下,F(xiàn)lexCAN 模塊將只接收總線上的幀,而不能發(fā)送幀,并且也無法發(fā)送接收應(yīng)答。正常工作模式下,F(xiàn)lexCAN 模塊既可發(fā)送幀,也可接收幀。
2 FlexCAN 幀格式
FlexCAN 幀傳輸過程
圖2 是 CAN 幀的發(fā)送流程,首先是幀起始位 SOF,SOF 值規(guī)定為 1,標(biāo)識此幀的開始。在 CAN 總線協(xié)議中約定,值 0 為顯性位,值 1 為隱性位。FlexCAN 采取多主機、基于優(yōu)先級的總線傳輸方式,總線幀的收發(fā)順序在 Arbitration field 仲裁段確定。仲裁成功的節(jié)點會繼續(xù)發(fā)送幀,仲裁失敗的節(jié)點會轉(zhuǎn)為接收狀態(tài)。如果不設(shè)置使用幀的優(yōu)先級進行仲裁,則使用幀的 ID 號進行仲裁比較,越小優(yōu)先級越高。結(jié)合 圖2 CAN 幀發(fā)送流程 和 圖3 CAN 標(biāo)準(zhǔn)數(shù)據(jù)幀格式可知,Arbitration field 仲裁段存放 CAN 報文的 ID 號以及 RTR 標(biāo)識,RTR 用于表示幀類型,在下文講述 FlexCAN 使用信息緩沖區(qū)發(fā)送報文時,會進一步解釋其含義。Control filed 控制段在 MM32F0140 的 FlexCAN 中,主要涉及兩個部分,IDE 字段和 DLE 字段。IDE 字段用于標(biāo)識幀格式,為數(shù)據(jù)幀還是遠(yuǎn)程幀。DLC 字段用于標(biāo)識此幀的有效字節(jié)數(shù),DLC 字段值將影響后續(xù)的 Data field 字段長度。FDF 字段表示此幀是否為 CAN FD 幀,在MM32F0140 的 FlexCAN 模塊中暫時未使用到。Data field 有效傳輸數(shù)據(jù)負(fù)載段,如果此幀為遠(yuǎn)程幀,將不攜帶任何數(shù)據(jù),所以 DLC 字段對應(yīng)為 0;如果此幀為數(shù)據(jù)幀,此段長度由 DLC 字段控制。CRC field 循環(huán)冗余碼段,用于在發(fā)送和接收流程中檢查此幀是否出現(xiàn)比特錯誤。CRC 后,為 ACK field 檢測段,發(fā)送方會發(fā)送隱性位 1,然后在此段期間回讀總線上信號。如果讀到為顯性位 0,則說明有其他 CAN 接收器接收到此幀,發(fā)送方發(fā)送成功。最后是 EOF 結(jié)束位,標(biāo)識發(fā)送結(jié)束。
以下是 MM32F0140 FlexCAN 在上述 CAN 發(fā)送流程要求下,使用信息緩沖區(qū)寄存器進行 CAN 幀的收發(fā)的詳細(xì)操作流程。信息緩沖區(qū)寄存器的結(jié)構(gòu)如圖 4 所示。
FlexCAN 發(fā)送幀
FlexCAN 發(fā)送幀時,首先將幀相關(guān)信息寫入預(yù)計使用的信息緩沖區(qū)寄存器中。如果此幀的 ID 號可用 11 個比特位進行表示,則將此幀的 ID 號填入 ID 段,并將 IDE 位置 0,標(biāo)識為標(biāo)準(zhǔn)幀。如果此幀的 ID 號超過 11 位,則將剩余低位部分填入 ID(Extended) 段,并將 IDE 位置 1,標(biāo)識為擴展幀。FlexCAN 的幀 ID 長度不能超過 29 位。
然后根據(jù)此幀的幀類型,如果是攜帶數(shù)據(jù)的數(shù)據(jù)幀,則將 SRR 替代遠(yuǎn)程請求位和 RTR 遠(yuǎn)程請求位都設(shè)置為 0,并將對應(yīng)需要發(fā)送的數(shù)據(jù)寫入 DataByte 區(qū),將數(shù)據(jù)長度寫入 DLC 字段;如果是不攜帶數(shù)據(jù)的遠(yuǎn)程請求幀,則將上述的 SRR 位和 RTR 位都設(shè)置為 1。
如果 MCR[LPRIOEN] 位被設(shè)置為 1,則在發(fā)送前還需要將此幀的優(yōu)先級寫入 PRIO 位,PRIO 位值越小,優(yōu)先級越高。
當(dāng)上述各字段都填充完畢后,將 CODE 值 12 填入 CODE 區(qū),此 CODE 值表示將要發(fā)送此幀,發(fā)送完畢后 CODE 值變?yōu)?8,表示發(fā)送完畢?;刈x TIME STAMP 段,可以得到發(fā)送成功時的時間戳。
FlexCAN 接收幀
FlexCAN 接收幀前,需要設(shè)置此接收信息緩沖區(qū)的 ID 號、幀格式 IDE 和幀類型 SRR 和 RTR,參考上述發(fā)送過程的設(shè)置。然后將 CODE 區(qū)值設(shè)置為值 4,表示等待接收。如果需要幀過濾,還需要設(shè)置局部幀過濾器 RXIMR 和全局幀過濾器 RXMGMASK、RX14MASK和RX15MASK。當(dāng) CAN 總線上有其他 FlexCAN 模塊發(fā)送的幀時,信息緩沖區(qū)會將總線上的幀 ID 與自己的 ID 段以及掩碼值進行匹配,接收幀,此時 TIME STAMP 段的值為接收時的時間戳。
在傳輸中會常使用到的 CODE 值如下表 1 所示。
FlexCAN 功能測試流程
首先使用 FlexCAN 的回環(huán)模式測試開發(fā)板上的 FlexCAN 是否工作正常?;丨h(huán)測試成功以后可以進行 FlexCAN 正常工作模式的測試。如果使用的是兩塊開發(fā)板或使用 CAN 分析儀進行測試,需要注意總線兩端必須連接 120Ω 終端電阻。在配置 FlexCAN 過程中,要保證收發(fā)方的波特率都配置成相同值。測試 FlexCAN 正常工作模式下收發(fā)的實驗過程中,要確保至少有一個接收節(jié)點是正常工作模式,而非只聽模式。
3 FlexCAN 配置
配置時鐘
首先需要使能 FlexCAN 時鐘,根據(jù)所使用的外設(shè)對 RCC 的 RCC_APB1ENR 寄存器進行賦值,將對應(yīng)外設(shè)位置 1 即可使能時鐘,詳細(xì)外設(shè)如圖 5 所示。
使能并初始化模塊
使能 FlexCAN 模塊,通過配置 FLEXCAN_MCR[MDIS] 為 0,可以使能 FlexCAN 模塊。使能后,F(xiàn)lexCAN 模塊會自動進入凍結(jié)模式。在凍結(jié)模式下,設(shè)置 FLEXCAN_MCR_SOFTRST 為 1,軟件重置 FlexCAN 模塊寄存器。然后將所有的信息緩沖區(qū)的獨立掩碼寄存器和全局掩碼寄存器的掩碼值都設(shè)置為 1,表示接收信息緩沖區(qū)將只接收 ID 號和緩沖區(qū)提前配置的 ID 號完全相同的報文,同時將每個信息緩沖區(qū)寄存器也全部清 0。
配置工作模式
如果 FlexCAN 需要進入正常工作模式,僅需在使能 FlexCAN、初始化信息緩沖區(qū)后退出凍結(jié)模式即可進入,即將 FLEXCAN_MCR[FRZ] 設(shè)置為 0。因為退出凍結(jié)模式需要一定時間,通過輪詢 FLEXCAN_MCR[FRZACK] 是否等于 1 判斷是否退出成功。如果 FlexCAN 需要配置為只讀模式,則需要將 FLEXCAN_CTRL1[LOM] 置為 1;如果 FlexCAN 需要配置為回環(huán)模式,則需要將 FLEXCAN_CTRL1[LPB] 設(shè)置為 1。值得注意的是,當(dāng)配置為回環(huán)模式時,F(xiàn)lexCAN 的 FLEXCAN_MCR[SRXDIS] 不能被設(shè)置為 1,否則 FlexCAN 將無法收到回環(huán)報文。
配置波特率
首先通過設(shè)置 FLEXCAN_CTRL1[CLKSRC] 指定 FlexCAN 協(xié)議引擎的時鐘源,設(shè)置為 0 時使用振蕩器時鐘,設(shè)置為 1 時使用外設(shè)時鐘??稍斠妶D 6 FlexCAN 模塊協(xié)議引擎時鐘框圖。
對 FlexCAN 引擎時鐘頻率進行可編程分頻后得到 FlexCAN 串行時鐘頻率,F(xiàn)lexCAN 串行時鐘頻率的倒數(shù)被稱為時間份額Tq,用于衡量 FlexCAN 傳輸過程中各個階段所需的時間長度,詳見圖 7 1 bit time 下 FlexCAN 傳輸段。
SYNC_SEG 表示使用 1 個時間份額用于同步;Time Segment 1 段包括 PROPSEG 段和 PSEG1 段,前者用于補償實際網(wǎng)絡(luò)傳輸延時,后者和 PSEG2 都將用于補償在 FlexCAN 傳輸過程中潛在的邊緣相位誤差。上述三項可以分別通過 FLEXCAN_CTRL1[PROPSEG]、FLEXCAN_CTRL1[PSEG1] 和 FLEXCAN_CTRL1[PSEG2] 進行設(shè)置。下圖 8 是 Bosch CAN 2.0B 標(biāo)準(zhǔn)中對于 PSEG1 和PSEG2 的設(shè)置表。
在上述定義下,假定此時引擎時鐘源的時鐘頻率為 ClockFreqHz,PROPSEG 中指定值為 PropSegLen,PSEG1 和PSEG2 中指定值分別為 PhaSegLen1 和 PhaSegLen2,所需波特率為 BaudRate 時,我們可以得到預(yù)期的分頻數(shù)值 Div 為:
得到的 Div 值通過配置 FLEXCAN_CTRL1[PreDiv] 實現(xiàn)。這里尤其要注意各項和 ClockFreqHz 之間是否滿足整除關(guān)系。
配置發(fā)送幀
首先需要將發(fā)送幀的內(nèi)容填入等待發(fā)送的 i 號信息緩沖區(qū)的寄存器 FLEXCAN_MB[i] 的 CS、ID、WORD0 和WORD1 寄存器。然后將發(fā)送 CODE 值 (12) 填入 FLEXCAN_MB[i].CS[CODE] 中,即可發(fā)送。此時,如果將 FLEXCAN_ IMASK1 中對應(yīng)中斷位設(shè)置為 1,則發(fā)送成功后將會喚起中斷。
配置接收幀格式
接收匹配需要設(shè)置對應(yīng)的 i 號信息緩沖區(qū) FLEXCAN_MB[i].CS[CODE] 值為 4,表示當(dāng)前信息緩沖區(qū)接收為空,可以接收信息并安全存儲,配置 FLEXCAN_MB[i].ID 為預(yù)期接收的幀 ID 號。設(shè)置 FLEXCAN_MB[i].CS[IDE] 配置接收擴展幀或標(biāo)準(zhǔn)幀,接收擴展幀則配置為 1,接收標(biāo)準(zhǔn)幀則配置為 0。設(shè)置 FLEXCAN_MB[i].CS[RTR] 配置接收遠(yuǎn)程幀或數(shù)據(jù)幀,接收遠(yuǎn)程幀則此位配置為 1,否則配置為 0。
如果需要對幀進行過濾接收,則需額外考慮配置全局幀過濾器或局部幀過濾器。配置 FLEXCAN_MCR[IRMQ] 為 1 則采用局部幀過濾,配置為 0 則采用全局幀過濾。當(dāng)使用局部幀過濾方法時,掩碼需要通過 FLEXCAN_RXIMRN[i] 寄存器配置,全局則通過 FLEXCAN_RXMGMASK、FLEXCAN_RX14MASK 和FLEXCAN_RX15MASK 寄存器進行配置。
4 FlexCAN 實驗
在 SDK 中已有支持的 pokt-f0140 開發(fā)板上,在 driver example 下的 flexcan_loopback 樣例中,使用 FlexCAN 模塊進行回環(huán)測試,演示 FlexCAN 的初始化設(shè)置、接收和發(fā)送設(shè)置以及中斷處理。
初始化外設(shè)時鐘
FlexCAN 模塊在 APB1 總線上,因此對 RCC_ APB1ENR 寄存器的 FLEXCAN 對應(yīng)位設(shè)置為 1。
RCC_EnableAPB1Periphs(RCC_APB1_PERIPH_FLEXCAN, true);
初始化FlexCAN
使用外設(shè)時鐘作為 FlexCAN 的時鐘源,則 FlexCAN 的時鐘頻率為 pokt-f0140 上 APB1 總線時鐘頻率,為48MHz。此時將傳輸階段的時鐘配置 PhaseSegLen1,PhaseSegLen2,PropSegLen 分別配置為 2, 1, 1;將波特率APP_FLEXCAN_XFER_BAUDRATE 設(shè)置為 1MHz。則根據(jù)先前所述的波特率計算公式,可以滿足整除關(guān)系。在實際調(diào)整波特率,需要考慮傳輸段的時鐘設(shè)置是否滿足整除關(guān)系。
配置接收信息緩沖區(qū)
配置接收 MB 的接收幀類型為標(biāo)準(zhǔn)數(shù)據(jù)幀,ID 為 APP_FLEXCAN_XFER_ID。通過配置接收 MB 的 CODE 區(qū),將其配置為接收為空的狀態(tài)。
配置發(fā)送信息緩沖區(qū)
將發(fā)送 MB 的寄存器清空。通過設(shè)置該 MB 的 CODE 區(qū),將該 MB 設(shè)置為發(fā)送空閑。
配置接收中斷
使能 FlexCAN 的接收中斷,設(shè)置 NVIC。
/* Enable intterupts for rx mb. */FLEXCAN_EnableMbInterrupts(BOARD_FLEXCAN_PORT, BOARD_FLEXCAN_RX_MB_INT, true);NVIC_EnableIRQ(BOARD_FLEXCAN_IRQn);
中斷處理函數(shù)
中斷處理函數(shù)檢查接收中斷,設(shè)置接收全局標(biāo)志位為真。
發(fā)送數(shù)據(jù)
設(shè)置標(biāo)準(zhǔn)數(shù)據(jù)幀的 ID 號,幀類型和幀格式以及優(yōu)先級;然后填入數(shù)據(jù);設(shè)置數(shù)據(jù)長度。將上述配置寫入 MB 相關(guān)寄存器,然后修改 MB 的 CODE 區(qū)進行發(fā)送。
讀取數(shù)據(jù)
讀取對應(yīng)的 MB 寄存器,將幀數(shù)據(jù)段內(nèi)容解析出來。
main() 函數(shù)
主函數(shù)會在鍵入之后,準(zhǔn)備好數(shù)據(jù)并通過發(fā)送 MB 發(fā)送;等待中斷處理函數(shù)將全局標(biāo)志位設(shè)置為真后,解析接收MB 收到的幀,并打印。然后再等待下一次鍵入。
實驗結(jié)果
來源: 靈動MM32MCU
-
控制器
+關(guān)注
關(guān)注
114文章
17113瀏覽量
184336 -
靈動微電子
+關(guān)注
關(guān)注
7文章
129瀏覽量
20086 -
MM32
+關(guān)注
關(guān)注
1文章
108瀏覽量
1102
發(fā)布評論請先 登錄
評論