目錄
一、bxCan簡介
二、bxCAN總體描述
2.1概述
?2.2CAN框圖
?三、bxCA的工作模式
3.1初始化模式
3.2正常模式
3.3睡眠模式(低功耗)
四、測試模式
4.1靜默模式
?4.2環回模式
?五、bxCAN功能描述
5.1 發送處理
?編輯
5.2接收管理?
5.2.1 標識符過濾:
5.2.2?過濾器匹配序號與優先級規則
5.2.3 STM32尋址范圍
5.2.3SRAM?
六、位時序描述
6.1CAN標準幀格式
6.2發送與接收的工作流程
七、bxCAN中斷
?八、CAN自回環
一、bxCan簡介
????????波特率最高可達1兆位/秒,3個發送郵箱,發送報文的優先級特性可軟件配置,3級深度的2個接收FIFO,可變的過濾器組:
????????─ 在互聯型產品中,CAN1和CAN2分享28個過濾器組
????????─ 其它STM32F103xx系列產品中有14個過濾器組
雙CAN:
????????● CAN1:是主bxCAN,它負責管理在從bxCAN和512字節的SRAM存儲器之間的通信
????????● CAN2:是從bxCAN,它不能直接訪問SRAM存儲器
? ? ? ? 使用差分信號進行數據傳輸,CAN_H和CAN_L的電位差,顯性電平為邏輯0,隱形電平為邏輯1。
? ? ? ? CAN總線以“幀”形式進行通信,分為數據幀、遙控幀、錯誤幀、過載幀、間隔幀。
? ? ? ? 數據幀分為標準幀和擴展幀。,一幀可以發送0-8個字節數據(0~64bit)。
? ? ? ? 幀起始—仲裁段(ID)—控制段—數據段—CRC(檢查幀的傳輸錯誤段)—ACK(表示確認正常接收的段)—幀結束
應答位(ACK)用來表示節點已經收到有效的幀。
任何節點如果準確無誤地接收到幀,則要向總線上發送顯性位,該顯性位將掩蓋發送節點輸出的隱性位,使總線上表現為顯性。
如果發送節點檢測應答位為隱性,那么說明沒有節點收到有效幀。
? ? ? ? 發送報文:
?
?
二、bxCAN總體描述
2.1概述
? ? ? ?CAN空閑時,最開始發送消息的單元獲得發送權,多個單元同時進行發送時,從仲裁段(報文ID)的第1位開始進行仲裁。連續輸出顯性電平最多的單元可繼續發送,即首先出現隱性電平的單元失去對總線的占有權變為接收(競爭失敗的單元會自動檢測總線的空閑)。
? ? ? ? 當有效報文通過過濾器就會存放在FIFO,我們就可以在FIFO中讀取報文了。(有28個過濾組用于篩選有效報文)
? ? ? ? 有效報文是指數據幀直到EDF段最后一位都沒有錯誤,且通過濾波器組對標識符進行過濾。
? ? ? ?CAN網絡拓撲結構:多主控線性拓撲結構,在CAN總線上,每個節點都有發送消息的能力,而消息的發送不必遵從任何預先設定的時序,通信是事件驅動的,只有當新的消息傳遞時,CAN總線才能處于忙碌狀態,這使得節點接入總線速度非常快,CAN總線理論上最高傳輸速率為1Mbps,對于異步事件反應迅速,基于對ms級別的實時應用沒有任何問題。
????????bxCAN模塊可以完全自動地接收和發送CAN報文;且完全支持標準標識符(11位)和擴展標識符(29位)。
????????共有3個發送郵箱供軟件來發送報文。發送調度器根據優先級決定哪個郵箱的報文先被發送。
????????在互聯型產品中,bxCAN提供28個位寬可變/可配置的標識符過濾器組,軟件通過對它們編程,從而在引腳收到的報文中選擇它需要的報文,而把其它報文丟棄掉。在其它STM32F103xx系列產品中有14個位寬可變/可配置的標識符過濾器組。
????????共有2個接收FIFO,每個FIFO都可以存放3個完整的報文。它們完全由硬件來管理。
什么是FIFO?
FIFO是英文First In First Out 的縮寫,是一種先進先出的數據緩存器,他與普通存儲器的區別是沒有外部讀寫地址線,這樣使用起來非常簡單,但缺點就是只能順序寫入數據,順序的讀出數據,其數據地址由內部讀寫指針自動加1完成,不能像普通存儲器那樣可以由地址線決定讀取或寫入某個指定的地址。
?
? ? ? ?所以, CAN的尋址機制不同于其他類型的總線,CAN總線不設定節點的地址,而是通過消息的標識符來區別消息。
?2.2CAN框圖
????????郵箱是軟件和硬件之間傳遞報文的接口。郵箱包含了所有跟報文有關的信息:標識符、數據、控制、狀態和時間戳信息。
????????軟件需要在一個空的發送郵箱中,把待發送報文的各種信息設置好(然后再發出發送的請求)。發送的狀態可通過查詢CAN_TSR寄存器獲知。
????????接收郵箱(FIFO)
????????在接收到一個報文后,軟件就可以訪問接收FIFO的輸出郵箱來讀取它。一旦軟件處理了報文(如把它讀出來),軟件就應該對CAN_RFxR寄存器的RFOM位進行置’1’,來釋放該報文,以便為后面收到的報文留出存儲空間。過濾器匹配序號存放在CAN_RDTxR寄存器的FMI域中。16位的時間戳存放在CAN_RDTxR寄存器的TIME[15:0]域中。
?三、bxCA的工作模式
????????bxCAN有3個主要的工作模式:初始化、正常和睡眠模式。在硬件復位后,bxCAN工作在睡眠模式以節省電能,同時CANTX引腳的內部上拉電阻被激活。
3.1初始化模式
????????當bxCAN處于初始化模式時,禁止報文的接收和發送,并且CANTX引腳輸出隱性位(高電平)。初始化模式的進入,不會改變配置寄存器。在對bxCAN的過濾器組(模式、位寬、FIFO關聯、激活和過濾器值)進行初始化前,軟件要對CAN_FMR寄存器的FINIT位設置’1’。對過濾器的初始化可以在非初始化模式下進行。
3.2正常模式
????????在初始化完成后,軟件應該讓硬件進入正常模式,以便正常接收和發送報文。軟件可以通過對CAN_MCR寄存器的INRQ位清’0’,來請求從初始化模式進入正常模式,然后要等待硬件對CAN_MSR寄存器的INAK位置’1’的確認。在跟CAN總線取得同步,即在CANRX引腳上監測到11個連續的隱性位(等效于總線空閑)后,bxCAN才能正常接收和發送報文。
3.3睡眠模式(低功耗)
????????bxCAN可工作在低功耗的睡眠模式。軟件通過對CAN_MCR寄存器的SLEEP位置’1’,來請求進入這一模式。在該模式下,bxCAN的時鐘停止了,但軟件仍然可以訪問郵箱寄存器。
? ? ? ? CAN主狀態寄存器:(CAN_MSR)
四、測試模式
4.1靜默模式
?????????在靜默模式下,bxCAN可以正常地接收數據幀和遠程幀,但只能發出隱性位,而不能真正發送報文。如果bxCAN需要發出顯性位(確認位、過載標志、主動錯誤標志),那么這樣的顯性位在內部被接回來從而可以被CAN內核檢測到,同時CAN總線不會受到影響而仍然維持在隱性位狀態。因此,靜默模式通常用于分析CAN總線的活動,而不會對總線造成影響-顯性位(確認位、錯誤幀)不會真正發送到總線上。
?4.2環回模式
????????通過對CAN_BTR寄存器的LBKM位置’1’,來選擇環回模式。在環回模式下,bxCAN把發送的報文當作接收的報文并保存(如果可以通過接收過濾)在接收郵箱里。
void can_loopback_init(void){rcu_periph_clock_enable(RCU_CAN0);/* 初始化can0的通信屬性 */can_parameter_struct can_parameter;can_struct_para_init(CAN_INIT_STRUCT, &can_parameter); // 將can_parameter設置為默認值can_parameter.working_mode = CAN_LOOPBACK_MODE;can_parameter.prescaler = 48;can_init(CAN0, &can_parameter);can_filter_parameter_struct can_filter;can_struct_para_init(CAN_FILTER_STRUCT, &can_filter);can_filter.filter_enable = ENABLE;can_filter.filter_fifo_number = CAN_FIFO1;can_filter_init(&can_filter);
}
?五、bxCAN功能描述
5.1 發送處理
????????發送報文的流程為:應用程序選擇1個空置的發送郵箱;設置標識符,數據長度和待發送數據;
/* 發送數據 */can_trasnmit_message_struct transmit_message;can_struct_para_init(CAN_TX_MESSAGE_STRUCT, &transmit_message);transmit_message.tx_sfid = 0x11;transmit_message.tx_dlen = 2;transmit_message.tx_data[0] = 0xAB;transmit_message.tx_data[1] = 0xCD;transmit_message.tx_ff = CAN_FF_STANDARD;transmit_mailbox_number = can_message_transmit(CAN0, &transmit_message);
?????????然后對CAN_TIxR寄存器的TXRQ位置’1’,來請求發送。TXRQ位置’1’后,郵箱就不再是空郵箱;而一旦郵箱不再為空置,軟件對郵箱寄存器就不再有寫的權限。
????????TXRQ位置1后,郵箱馬上進入掛號狀態,并等待成為最高優先級的郵箱。
????????一旦郵箱成為最高優先級的郵箱,其狀態就變為預定發送狀態。一旦CAN總線進入空閑狀態,預定發送郵箱中的報文就馬上被發送(進入發送狀態)。一旦郵箱中的報文被成功發送后,它馬上變為空置郵箱;硬件相應地對CAN_TSR寄存器的RQCP和TXOK位置1,來表明一次成功發送。
發送優先級
1. 由標識符決定
????????當有超過1個發送郵箱在掛號時,發送順序由郵箱中報文的標識符決定。根據CAN協議,標識符數值最低的報文具有最高的優先級。如果標識符的值相等,那么郵箱號小的報文先被發送。
2.?由發送請求次序決定
????????通過對CAN_MCR寄存器的TXFP位置’1’,可以把發送郵箱配置為發送FIFO。在該模式下,發送的優先級由發送請求次序決定。
一文讀懂CAN系統架構和幀結構 - 知乎 (zhihu.com)https://zhuanlan.zhihu.com/p/642685125
- 沖突檢測:節點在發送數據時,要不停的檢測發送的數據,確定是否與其他節點數據發送沖突,如果有沖突,則保證優先級高的報文先發送。
- 非破壞性仲裁機制:通過ID仲裁,ID數值越小,報文優先級越高。
?
????????發送低優先級報文的節點退出仲裁后,在下次總線空閑時自動重發報文。
?????????高優先級的報文不能中斷低優先級報文的發送。
?
?
5.2接收管理?
????????接收到的報文,被存儲在3級郵箱深度的FIFO中。FIFO完全由硬件來管理,從而節省了CPU的處理負荷,簡化了軟件并保證了數據的一致性。應用程序只能通過讀取FIFO輸出郵箱,來讀取FIFO中最先收到的報文。
????????有效報文
????????根據CAN協議,當報文被正確接收(直到EOF域的最后一位都沒有錯誤),且通過了標識符過濾,那么該報文被認為是有效報文。
????????FIFO從空狀態開始,在接收到第一個有效的報文后,FIFO狀態變為掛號_1(pending_1),如果在釋放郵箱的同時,又收到了一個有效的報文,那么FIFO仍然保留在掛號_1狀態,軟件可以讀取FIFO輸出郵箱來讀出新收到的報文。如果應用程序不釋放郵箱,在接收到下一個有效的報文后,FIFO狀態變為掛號_2(pending_2),重復上面的過程,第三個有效的報文把FIFO變為掛號_3狀態(FMP[1:0]=11b)。此時,軟件必須對RFOM位設置1來釋放郵箱,以便FIFO可以有空間來存放下一個有效的報文;否則,下一個有效的報文到來時就會導致一個報文的丟失。
5.2.1 標識符過濾:
????????在CAN協議里,報文的標識符不代表節點的地址,而是跟報文的內容相關的。因此,發送者乙廣播的形式把報文發送給所有的接收者。節點在接收報文時-根據標識符的值-決定軟件是否需要該報文;如果需要,就拷貝到SRAM里;如果不需要,報文就被丟棄且無需軟件的干預。
????????為滿足這一需求,在互聯型產品中,bxCAN控制器為應用程序提供了28個位寬可變的、可配置的過濾器組(27~0);在其它產品中,bxCAN控制器為應用程序提供了14個位寬可變的、可配置的過濾器組(13~0),以便只接收那些軟件需要的報文。硬件過濾的做法節省了CPU開銷,否則就必須由軟件過濾從而占用一定的CPU開銷。每個過濾器組x由2個32位寄存器,CAN_FxR0和CAN_FxR1組成。
????????可變的位寬
????????每個過濾器組的位寬都可以獨立配置,以滿足應用程序的不同需求。根據位寬的不同,每個過濾器組可提供:
????????● 1個32位過濾器,包括:STDID[10:0]、EXTID[17:0]、IDE和RTR位
????????● 2個16位過濾器,包括:STDID[10:0]、IDE、RTR和EXTID[17:15]位
????????通過CAN_FMR的FBMx位,可以配置對應的屏蔽/標識符寄存器的標識符列表模式或屏蔽位模式。
????????為了過濾出一組標識符,應該設置過濾器組工作在屏蔽位模式。
????????為了過濾出一個標識符,應該設置過濾器組工作在標識符列表模式。
????????應用程序不用的過濾器組,應該保持在禁用狀態。
????????過濾器組中的每個過濾器,都被編號為(叫做過濾器號)從0開始,到某個最大數值-取決于過濾器組的模式和位寬的設置。
????????節點通過控制器中過濾碼(Filter Code)和掩碼(Mask Code),再檢驗總線上消息的標識符,來判斷是否接收該消息(Message Filtering)。
對于掩碼,“1”表示該位與本節點相關,“0”表示該位與本節點不相關。舉例如下:
例1:僅接收消息標識符為00001567(十六進制)的幀設置過濾碼為00001567
設置掩碼為1FFFFFFF
節點檢測消息的標識符的所有位(29位),如果標識符為00001567接收,否則舍棄。例2:接收消息標識符為00001567 到 0000156F 的幀設置過濾碼為00001560
設置掩碼為1FFFFFF0
節點檢測消息的標識符的高25位,最低的4位則不care。如果標識符最高25位相同則接收,否則舍棄。例3:接收消息標識符為00001560 到 00001567 的幀設置過濾碼為00001560
設置掩碼為1FFFFFF8
節點檢測消息的標識符的高26位,最低的3位則不care。如果標識符最高26位相同則接收,否則舍棄。例4:接收所有消息幀幀設置過濾碼為0
設置掩碼為0
節點接收總線上所有消息。
can_filter_parameter_struct can_filter;can_struct_para_init(CAN_FILTER_STRUCT, &can_filter);can_filter.filter_enable = ENABLE;can_filter.filter_fifo_number = CAN_FIFO1;can_filter_init(&can_filter);
5.2.2?過濾器匹配序號與優先級規則
? ? ? ? 一旦收到的報文被存入FIFO,就可被應用程序訪問。通常情況下,報文中的數據被拷貝到SRAM中;為了把數據拷貝到合適的位置,應用程序需要根據報文的標識符來辨別不同的數據。bxCAN提供了過濾器匹配序號,以簡化這一辨別過程。
????????根據過濾器優先級規則,過濾器匹配序號和報文一起,被存入郵箱中。因此每個收到的報文,都有與它相關聯的過濾器匹配序號。
????????過濾器優先級規則
????????根據過濾器的不同配置,有可能一個報文標識符能通過多個過濾器的過濾;在這種情況下,存放在接收郵箱中的過濾器匹配序號,根據下列優先級規則來確定:
● 位寬為32位的過濾器,優先級高于位寬為16位的過濾器
● 對于位寬相同的過濾器,標識符列表模式的優先級高于屏蔽位模式
● 位寬和模式都相同的過濾器,優先級由過濾器號決定,過濾器號小的優先級高
can_filter_parameter_struct can_filter;can_struct_para_init(CAN_FILTER_STRUCT, &can_filter);can_filter.filter_enable = ENABLE;can_filter.filter_fifo_number = CAN_FIFO1;can_filter_init(&can_filter);
5.2.3 STM32尋址范圍
STM32深入系列01——內存簡述(Flash和SRAM)_stm32內存-CSDN博客https://blog.csdn.net/weixin_46253745/article/details/130032941????????STM32是一個32位的單片機,因此,它有32根地址線,每個地址線有兩種狀態:導通 或 不導通。
????????單片機內存的地址訪問存儲單元是按照字節編址的。按照字節編址,也就是說,訪問一個地址上存儲的數據,得到的是一個字節的數據。
根據上述兩條,可以得出結論:
????????STM32的尋址(內存)大小為:2^32(字節) = 4G(字節)
????????STM32的尋址范圍為:0X0000 0000 ~ 0XFFFF FFFF
5.2.3SRAM?
?????????其中對于STM32而言,SRAM就是內存;Flash就是硬盤。對于STM32103C8T6它有64K字節的Flash、20K字節的RAM。
- RAM:讀寫速度快、掉電數據丟失;類比于電腦內存的作用。
- ROM:讀寫速度相對慢、掉電數據仍在;類比于電腦硬盤的作用。
? ? ? ? ?stm32f1c03c8t6它的內置ROM起始地址為0X0800 0000,大小為0X10000,也就是FLASH的大小為:???????
?????????0X10000個字節 = 65536個字節 = 64k個字節 = 64kBytes。
????????它的內置RAM起始地址為0X2000 0000,大小為0X5000,也就是RAM的大小為:
????????0X5000個字節 = 20480個字節 = 20k個字節 = 20kBytes。
????????MCU——SRAM和Flash-CSDN博客https://blog.csdn.net/qq_36749906/article/details/114867475
????????由于SRAM用于存儲程序運行過程當中產生的臨時數據,因此在程序中定義大批量數據時候必須考慮到SRAM的容量大小,特別是實時數據采集時,一旦需要采集大量數據,考慮到SRAM容量時,需要分批采集。
??雖然現在單片機的容量一般都足夠,但在極端情況下還是會出現由于程序過大超過Flash容量的報錯。這時候需要對所使用的單片機Flash容量了解詳細,若程序過大,則選擇深度優化編譯或者刪減程序。
分類 | SRAM | Flash |
---|---|---|
容量 | 容量小 | 容量大 |
讀寫速度 | 快 | 慢 |
掉電易失 | 掉電易失 | 掉電不易失 |
價格 | 高昂 | 低廉 |
應用場合 | 程序運行中數據變量的運算 | 存儲代碼或者常量數據 |
六、位時序描述
????????CAN空閑時,最開始發送消息的單元獲得發送權,多個單元同時進行發送時,從仲裁段(報文ID)的第1位開始進行仲裁。連續輸出顯性電平最多的單元可繼續發送,即首先出現隱性電平的單元失去對總線的占有權變為接收(競爭失敗的單元會自動檢測總線的空閑)。????????
6.1CAN標準幀格式
CAN通信標準幀和擴展幀(全網最透徹解答)_can標準幀和擴展幀的區別-CSDN博客https://blog.csdn.net/weixin_37787043/article/details/81533908
????????CAN 標準幀信息為11個字節(3 + 8),包括兩部分:信息和數據部分。前3個字節為信息部分。
字節1為幀信息。
????????第7位(FF)表示幀格式,在標準幀中,FF=0;(顯性電平)
????????第6位(RTR)表示幀的類型,RTR=0表示為數據幀,RTR=1表示為遠程幀;
????????DLC表示在數據幀時實際的數據長度
????????字節2、3為報文識別碼,11位有效。
????????字節4~11為數據幀的實際數據,遠程幀時無效。
關于CAN通訊中的遠程幀(遙控幀) - 知乎 (zhihu.com)https://zhuanlan.zhihu.com/p/649366078#:~:text=%E6%95%B0%E6%8D%AE%E5%B8%A7%E5%92%8C%E8%BF%9C%E7%A8%8B%E5%B8%A7%E6%98%AF%E4%BB%A5RTR%E4%BD%8D%E6%9D%A5%E5%8C%BA%E5%88%86%E7%9A%84%E3%80%82%20%E6%95%B0%E6%8D%AE%E5%B8%A7%E7%9A%84RTR%E4%BD%8D%E4%B8%BA%E6%98%BE%E6%80%A7%EF%BC%8C%E8%BF%9C%E7%A8%8B%E5%B8%A7%E7%9A%84RTR%E4%BD%8D%E5%88%99%E4%B8%BA%E9%9A%90%E6%80%A7%E3%80%82,%E5%9B%A0%E6%AD%A4ID%E7%9B%B8%E5%90%8C%E7%9A%84%E6%83%85%E5%86%B5%E4%B8%8B%EF%BC%8C%E6%95%B0%E6%8D%AE%E5%B8%A7%E5%85%B7%E4%BD%93%E6%9B%B4%E9%AB%98%E7%9A%84%E4%BC%98%E5%85%88%E7%BA%A7%E3%80%82%20%E7%94%B1%E4%BA%8E%E7%AC%AC%E4%B8%80%E7%A7%8D%E6%96%B9%E6%B3%95%E5%8F%AF%E8%83%BD%E9%80%A0%E6%88%90%E6%80%BB%E7%BA%BF%E5%86%B2%E7%AA%81%EF%BC%8C%E7%8E%B0%E5%9C%A8%E6%94%B9%E4%B8%BA%E8%8A%82%E7%82%B9A%E5%8F%91%E9%80%81%E8%BF%9C%E7%A8%8B%E5%B8%A7%E8%AF%B7%E6%B1%82%E8%8A%82%E7%82%B9B%E7%9A%84%E4%BF%A1%E6%81%AF%EF%BC%8C%E8%BF%9C%E7%A8%8B%E5%B8%A7%E7%9A%84ID%E5%8F%B7%E8%87%AA%E7%84%B6%E4%B8%BAB_ID%20%E3%80%82????????我們知道CAN總線是基于非破壞性的仲裁,該仲裁機制是一種既不會造成已發送數據的延遲,也不會破壞已經發送的數據的仲裁機制,其具體實施需要了解CAN協議幀結構,線與機制等。其中,線與機制簡單說就是位與計算,顯性電平(邏輯0)會覆蓋隱性電平(邏輯1)。當多個節點同時向總線發送消息時,所發送消息的優先權高的那個節點獲得總線的發送權,簡單來說仲裁段中ID號越小優先權越高。
????????為了總線訪問安全,在CAN網絡系統設計中,每個節點必須用獨屬于自己的ID號(一個或者多個,具體根據整個CAN網絡系統設計需求分配)往外發送幀。假設系統中有節點A和B,A發送信息的ID為A_ID=1,B發送信息時是用的ID為B_ID=2。A為ECM,B為車速采集設備。一般來說節點B主動發送車速信息到網絡上,節點A接收B發送的信息。但是如果某一時刻,節點A急需車速信息,而節點B可能還需要過一定時間才能發送信息,這怎么辦呢?節點A可以通過2種方法請求快速獲得的車速信息:
設置兩個ID:
????????1、A發送一幀特殊的數據幀,ID號為B的ID號(B_ID),數據域內容“請求車速信息”。前提是B要設置為能接收B_ID的幀。則A發送后被B接收到,B再以B_ID發送車速信息幀,A接收到所需的信息。這看似完美的過程,其實存在可能的總線沖突:如果A發送幀的同時,B也正要往總線上發送車速信息幀,則造成總線沖突。當然也可以采用別的方法來解決此問題,如A發送請求溫度幀的ID號改成別的,當然B也要設置成可以接收該ID的幀,但這樣就會占用了一個ID號。總的來說,不推薦使用這種方法。
????????可以看出除缺少數據場以外,遠程幀與數據幀布局相同。數據幀和遠程幀是以RTR位來區分的。數據幀的RTR位為顯性,遠程幀的RTR位則為隱性。因此ID相同的情況下,數據幀具體更高的優先級。
????????由于第一種方法可能造成總線沖突,現在改為節點A發送遠程幀請求節點B的信息,遠程幀的ID號自然為B_ID 。由于CAN總線仲裁時,數據幀發送的優先級高于遠程幀,即使A發送ID號為B_ID的遠程幀同時,B也主動發出信息也不會引起總線沖突。當節點B接收到遠程幀后,知道有其他節點在請求信息,就馬上往CAN總線上發送一幀車速信息幀,即用B_ID作為ID號往CAN總線上發送車速信息幀,這樣節點A就能及時得到節點B的車速信息,請求得到滿足。
CAN總線的位時序與參數設置_can通訊位時序-CSDN博客https://blog.csdn.net/hans_yu/article/details/89400011
?
一文讀懂CAN系統架構和幀結構 - 知乎 (zhihu.com)https://zhuanlan.zhihu.com/p/642685125
????????CAN總線的每個位(Bit)的周期 Tbit = 1 / Baudrate。根據CAN規范,每個位的時間內又可細分成4段:為了實現位同步,CAN協議把每一位的時序分解成下圖所示的四段。這四段的長度加起來即為一個CAN數據位的長度。一個完整的位由8-25個Tq組成。
? ?
同步端(SS,Synchronization Segment)
一個位的輸出從同步段開始。若總線的跳變沿被包含在SS段的范圍之內,則表示節點與總線的時序同步。節點與總線同步時,采樣點采集到的總線電平即可被確定為該電平的電位。SS段的大小為1Tq.
傳播段(PTS,Propagation Time Segment)
用于補償信號在網絡和節點傳播的物理延時時間,是總線上輸入比較器延時和輸出驅動器延時總和的兩倍。通常1-8Tq
相位緩沖段1(PBS1, Phase Buffer Segment 1)
主要用于補償邊沿階段的誤差,其時間長度在重新同步時可以加長。初始大小1-8Tq.
相位緩沖段2(PBS2,Phase Buffer Segment 2)
也是用于補償邊沿階段的誤差,其時間長度在重新同步時可以縮短。初始大小2-8Tq.
?????????波特率:單位時間內(1s)傳輸的數據位,公式:1/位時間。舉個栗子,系統時鐘頻率36MHz,預分頻因子為4,則CAN時鐘頻率9MHz,則Tq=1/9M。假設一個CAN位包含10個Tq,則一個位周期T=10Tq,從而波特率為1/T=0.9MHz.
????????CAN控制器為了適應各種波特率,對上面四個段的時間長度,不是使用納秒(ns)或微秒(us)來度量,而是使用節拍來度量,技術資料中將這個節拍稱為時間量子(Time quantum, Tq)。例如500k的波特率,每個Tbit是 2000ns,如果分為 10 個節拍,則每個 Tq 為 200ns。
6.2發送與接收的工作流程
????????發送節點在每個bit中主要完成發送和回檢。接收節點在每個Bit中主要完成接收和同步。
?
?
傳播段時長Tps:
????????傳播段PS占據的時間是信號在總線上來回傳輸的時間。
????????一次單向傳輸的延時Tdelay包括3個時間:
????????發送節點從產生信號到發到總線的時間 Td1;
????????信號在總線傳輸的時間Tbus;
????????接收節點從總線獲取信號的時間Td2。
????????按規范要求,傳播段的時間Tps應大于等于2倍Tdelay的時間,即
????????Tps >= 2 * Tdelay = 2 * (Td1 + Tbus + Td2)
為什么規定是兩倍時間呢?CAN總線是一種允許競爭并自行仲裁的協議。見上面工作流程圖可知,每個節點會回讀自己發出的信號。假設極端情況下,節點Node1在總線的一端發出了信號s1,總線另一端的節點Node2在 Tdelay 時間之前由于尚未收到信號s1,所以可能認為總線是空閑的,那就可能往總線上發送信號s2。當然,Node2剛發出s2,總線上就產生了s1和s2的競爭,而這個競爭的情況會又經過 Tdelay 的時間才被Node1感知到。所以兩倍Tdelay的要求就是為了保證每個節點都能正確檢測到總線上的競爭。
STM32 CPU的CAN與位時序相關的參數有4個:
????????BRP (Baud rate prescaler),預分頻值,允許的范圍是1 ~ 1024。
????????TS1 (Time segment 1), 允許的范圍是1 ~ 16。這個參數設置傳播段(Tps)與相位緩沖段1(Tpbs1)相加的節拍數。
????????TS2 (Time segement 2), 允許的范圍是1 ~ 8。這個參數設置相位緩沖段2(Tpbs2)的節拍數。
????????SJW(Resynchronization jump width), 重同步寬度,允許的范圍是1 ~ 4。用于設置Tpbs1和Tpbs2可以調整的節拍數。
七、bxCAN中斷
????????bxCAN占用4個專用的中斷向量。通過設置CAN中斷允許寄存器(CAN_IER),每個中斷源都可以單獨允許和禁用。
發送中斷可由下列事件產生:
─ 發送郵箱0變為空,CAN_TSR寄存器的RQCP0位被置’1’。
─ 發送郵箱1變為空,CAN_TSR寄存器的RQCP1位被置’1’。
─ 發送郵箱2變為空,CAN_TSR寄存器的RQCP2位被置’1’。
● FIFO0中斷可由下列事件產生:
─ FIFO0接收到一個新報文,CAN_RF0R寄存器的FMP0位不再是’00’。
─ FIFO0變為滿的情況,CAN_RF0R寄存器的FULL0位被置’1’。
─ FIFO0發生溢出的情況,CAN_RF0R寄存器的FOVR0位被置’1’。
● FIFO1中斷可由下列事件產生:
─ FIFO1接收到一個新報文,CAN_RF1R寄存器的FMP1位不再是’00’。
─ FIFO1變為滿的情況,CAN_RF1R寄存器的FULL1位被置’1’。
─ FIFO1發生溢出的情況,CAN_RF1R寄存器的FOVR1位被置’1’。
● 錯誤和狀態變化中斷可由下列事件產生:?
─ 出錯情況,關于出錯情況的詳細信息請參考CAN錯誤狀態寄存器(CAN_ESR)。
─ 喚醒情況,在CAN接收引腳上監視到幀起始位(SOF)。
─ CAN進入睡眠模式。
?八、CAN自回環
?????????在回環通信模式下,由CAN 總線控制器發送的數據可以被自己接收并存入接收FIFO,同時這些發送數據也送至CAN 網絡。將CAN_BT 寄存器中的LCMOD 位置1,使CAN 總線控制器
進入回環通信模式,將其清0 可以退出回環通信模式。
????????回環通信模式通常用來進行CAN 通信自測。
?