stm32_CAN总线知识
一、CAN總線(xiàn)的特點(diǎn):
bxCAN主要特點(diǎn)
● 支持CAN協(xié)議2.0A和2.0B主動(dòng)模式● 波特率最高可達(dá)1兆位/秒
● 支持時(shí)間觸發(fā)通信功能
發(fā)送
● 3個(gè)發(fā)送郵箱
● 發(fā)送報(bào)文的優(yōu)先級(jí)特性可軟件配置
● 記錄發(fā)送SOF時(shí)刻的時(shí)間戳
接收
● 3級(jí)深度的2個(gè)接收FIFO
● 可變的過(guò)濾器組:
─ 在互聯(lián)型產(chǎn)品中,CAN1和CAN2分享28個(gè)過(guò)濾器組
─ 其它STM32F103xx系列產(chǎn)品中有14個(gè)過(guò)濾器組
● 標(biāo)識(shí)符列表
● FIFO溢出處理方式可配置
● 記錄接收SOF時(shí)刻的時(shí)間戳
時(shí)間觸發(fā)通信模式
● 禁止自動(dòng)重傳模式
● 16位自由運(yùn)行定時(shí)器
● 可在最后2個(gè)數(shù)據(jù)字節(jié)發(fā)送時(shí)間戳
管理
● 中斷可屏蔽
● 郵箱占用單獨(dú)1塊地址空間,便于提高軟件效率
雙CAN
● CAN1:是主bxCAN,它負(fù)責(zé)管理在從bxCAN和512字節(jié)的SRAM存儲(chǔ)器之間的通信
● CAN2:是從bxCAN,它不能直接訪(fǎng)問(wèn)SRAM存儲(chǔ)器
● 這2個(gè)bxCAN模塊共享512字節(jié)的SRAM存儲(chǔ)器
注:在中容量和大容量產(chǎn)品中,USB和CAN共用一個(gè)專(zhuān)用的512字節(jié)的SRAM存儲(chǔ)器用于數(shù)據(jù)的發(fā)送和接收,因此不同同時(shí)使用USB和CAN(共享的SRAM被USB和CAN模塊互斥地訪(fǎng)問(wèn))。USB和CAN可以同時(shí)用于一個(gè)應(yīng)用中但不能在同一個(gè)時(shí)間使用。
CAN總線(xiàn)的拓?fù)浣Y(jié)構(gòu) CAN控制器是stm32芯片自帶的,CAN收發(fā)器是專(zhuān)門(mén)外接的芯片,野火的開(kāi)發(fā)板上是帶的TJA1050
stm32 互聯(lián)型產(chǎn)品的雙CAN框圖:
發(fā)送報(bào)文流程:
? ? 應(yīng)用程序選擇1個(gè)空置的發(fā)送郵箱;設(shè)置標(biāo)識(shí)符,數(shù)據(jù)長(zhǎng)度和待發(fā)送數(shù)據(jù);然后對(duì)CAN_TIxR寄存器的TXRQ位置’1’,來(lái)請(qǐng)求發(fā)送。TXRQ位置’1’后,郵箱就不再是空郵箱;而一旦郵箱不再為空置,軟件對(duì)郵箱寄存器就不再有寫(xiě)的權(quán)限。TXRQ位置1后,郵箱馬上進(jìn)入掛號(hào)狀態(tài),并等待成為最高優(yōu)先級(jí)的郵箱,參見(jiàn)發(fā)送優(yōu)先級(jí)。一旦郵箱成為最高優(yōu)先級(jí)的郵箱,其狀態(tài)就變?yōu)?span style="color:#ff0000;">預(yù)定發(fā)送狀態(tài)。一旦CAN總線(xiàn)進(jìn)入空閑狀態(tài),預(yù)定發(fā)送郵箱中的報(bào)文就馬上被發(fā)送(進(jìn)入發(fā)送狀態(tài))。一旦郵箱中的報(bào)文被成功發(fā)送后,它馬上變?yōu)榭罩绵]箱;硬件相應(yīng)地對(duì)CAN_TSR寄存器的RQCP和TXOK位置1,來(lái)表明一次成功發(fā)送。如果發(fā)送失敗,由于仲裁引起的就對(duì)CAN_TSR寄存器的ALST位置’1’,由于發(fā)送錯(cuò)誤引起的就對(duì)TERR位置’1’。
發(fā)送報(bào)文的優(yōu)先級(jí):
由標(biāo)識(shí)符決定
當(dāng)有超過(guò)1個(gè)發(fā)送郵箱在掛號(hào)時(shí),發(fā)送順序由郵箱中報(bào)文的標(biāo)識(shí)符決定。根據(jù)CAN協(xié)議,標(biāo)識(shí)符數(shù)值最低的報(bào)文具有最高的優(yōu)先級(jí)。如果標(biāo)識(shí)符的值相等,那么郵箱號(hào)小的報(bào)文先被發(fā)送。
由發(fā)送請(qǐng)求次序決定
通過(guò)對(duì)CAN_MCR寄存器的TXFP位置’1’,可以把發(fā)送郵箱配置為發(fā)送FIFO。在該模式下,發(fā)送的優(yōu)先級(jí)由發(fā)送請(qǐng)求次序決定。該模式對(duì)分段發(fā)送很有用。
接收管理
接收到的報(bào)文,被存儲(chǔ)在3級(jí)郵箱深度的FIFO中。FIFO完全由硬件來(lái)管理,從而節(jié)省了CPU的處理負(fù)荷,簡(jiǎn)化了軟件并保證了數(shù)據(jù)的一致性。應(yīng)用程序只能通過(guò)讀取FIFO輸出郵箱,來(lái)讀取FIFO中最先收到的報(bào)文。
有效報(bào)文
根據(jù)CAN協(xié)議,當(dāng)報(bào)文被正確接收(直到EOF域的最后一位都沒(méi)有錯(cuò)誤),且通過(guò)了標(biāo)識(shí)符過(guò)濾,那么該報(bào)文被認(rèn)為是有效報(bào)文
FIFO管理
FIFO從空狀態(tài)開(kāi)始,在接收到第一個(gè)有效的報(bào)文后,FIFO狀態(tài)變?yōu)閽焯?hào)_1(pending_1),硬件相應(yīng)地把CAN_RFR寄存器的FMP[1:0]設(shè)置為’01’(二進(jìn)制01b)。軟件可以讀取FIFO輸出郵箱來(lái)讀出郵箱中的報(bào)文,然后通過(guò)對(duì)CAN_RFR寄存器的RFOM位設(shè)置’1’來(lái)釋放郵箱,這樣FIFO又變?yōu)榭諣顟B(tài)了。如果在釋放郵箱的同時(shí),又收到了一個(gè)有效的報(bào)文,那么FIFO仍然保留在掛號(hào)_1狀態(tài),軟件可以讀取FIFO輸出郵箱來(lái)讀出新收到的報(bào)文。
如果應(yīng)用程序不釋放郵箱,在接收到下一個(gè)有效的報(bào)文后,FIFO狀態(tài)變?yōu)閽焯?hào)_2(pending_2),硬件相應(yīng)地把FMP[1:0]設(shè)置為’10’(二進(jìn)制10b)。重復(fù)上面的過(guò)程,第三個(gè)有效的報(bào)文把FIFO變?yōu)閽焯?hào)_3狀態(tài)(FMP[1:0]=11b)。此時(shí),軟件必須對(duì)RFOM位設(shè)置1來(lái)釋放郵箱,以便FIFO可以有空間來(lái)存放下一個(gè)有效的報(bào)文;否則,下一個(gè)有效的報(bào)文到來(lái)時(shí)就會(huì)導(dǎo)致一個(gè)報(bào)文的丟失。為掛號(hào)_3狀態(tài)(FMP[1:0]=11b)。此時(shí),軟件必須對(duì)RFOM位設(shè)置1來(lái)釋放郵箱,以便FIFO可以有空間來(lái)存放下一個(gè)有效的報(bào)文;否則,下一個(gè)有效的報(bào)文到來(lái)時(shí)就會(huì)導(dǎo)致一個(gè)報(bào)文的丟失。
報(bào)文的溢出:
當(dāng)FIFO處于掛號(hào)_3狀態(tài)(即FIFO的3個(gè)郵箱都是滿(mǎn)的),下一個(gè)有效的報(bào)文就會(huì)導(dǎo)致溢出,并且一個(gè)報(bào)文會(huì)丟失。此時(shí),硬件對(duì)CAN_RFR寄存器的FOVR位進(jìn)行置’1’來(lái)表明溢出情況。至于哪個(gè)報(bào)文會(huì)被丟棄,取決于對(duì)FIFO的設(shè)置:
● 如果禁用了FIFO鎖定功能(CAN_MCR寄存器的RFLM位被清’0’),那么FIFO中最后收到的報(bào)文就被新報(bào)文所覆蓋。這樣,最新收到的報(bào)文不會(huì)被丟棄掉。
● 如果啟用了FIFO鎖定功能(CAN_MCR寄存器的RFLM位被置’1’),那么新收到的報(bào)文就被丟棄,軟件可以讀到FIFO中最早收到的3個(gè)報(bào)文。
接收相關(guān)的中斷
一旦往FIFO存入一個(gè)報(bào)文,硬件就會(huì)更新FMP[1:0]位,并且如果CAN_IER寄存器的FMPIE位為’1’,那么就會(huì)產(chǎn)生一個(gè)中斷請(qǐng)求。當(dāng)FIFO變滿(mǎn)時(shí)(即第3個(gè)報(bào)文被存入),CAN_RFR寄存器的FULL位就被置’1’,并且如果CAN_IER寄存器的FFIE位為’1’,那么就會(huì)產(chǎn)生一個(gè)滿(mǎn)中斷請(qǐng)求。在溢出的情況下,FOVR位被置’1’,并且如果CAN_IER寄存器的FOVIE位為’1’,那么就會(huì)產(chǎn)生一個(gè)溢出中斷請(qǐng)求。
標(biāo)識(shí)符過(guò)濾
在CAN協(xié)議里,報(bào)文的標(biāo)識(shí)符不代表節(jié)點(diǎn)的地址,而是跟報(bào)文的內(nèi)容相關(guān)的。因此,發(fā)送者乙廣播的形式把報(bào)文發(fā)送給所有的接收者。節(jié)點(diǎn)在接收?qǐng)?bào)文時(shí)-根據(jù)標(biāo)識(shí)符的值-決定軟件是否需要該報(bào)文;如果需要,就拷貝到SRAM里;如果不需要,報(bào)文就被丟棄且無(wú)需軟件的干預(yù)。在stm32普通產(chǎn)品中提供了14個(gè)位寬可變、可配置的過(guò)濾器(0~13),而互聯(lián)產(chǎn)品則提供了28個(gè)位寬可變、可配置的過(guò)濾器(0~27),以便只接收那些軟件需要的報(bào)文。硬件過(guò)濾的做法節(jié)省了CPU開(kāi)銷(xiāo),否則就必須由軟件過(guò)濾從而占用一定的CPU開(kāi)銷(xiāo)。
過(guò)濾器可配置為,屏蔽位模式和標(biāo)識(shí)符列表模式。
屏蔽位模式
在屏蔽位模式下,標(biāo)識(shí)符寄存器和屏蔽寄存器一起,指定報(bào)文標(biāo)識(shí)符的任何一位,應(yīng)該按照“必須匹配”或“不用關(guān)心”處理。
標(biāo)識(shí)符列表模式
在標(biāo)識(shí)符列表模式下,屏蔽寄存器也被當(dāng)作標(biāo)識(shí)符寄存器用。因此,不是采用一個(gè)標(biāo)識(shí)符加一個(gè)屏蔽位的方式,而是使用2個(gè)標(biāo)識(shí)符寄存器。接收?qǐng)?bào)文標(biāo)識(shí)符的每一位都必須跟過(guò)濾器標(biāo)識(shí)符相同。
過(guò)濾器組位寬和模式的設(shè)置
過(guò)濾器組可以通過(guò)相應(yīng)的CAN_FMR寄存器配置。在配置一個(gè)過(guò)濾器組前,必須通過(guò)清除CAN_FAR寄存器的FACT位,把它設(shè)置為禁用狀態(tài)。通過(guò)設(shè)置CAN_FS1R的相應(yīng)FSCx位,可以配置一個(gè)過(guò)濾器組的位寬。通過(guò)CAN_FMR的FBMx位,可以配置對(duì)應(yīng)的屏蔽/標(biāo)識(shí)符寄存器的標(biāo)識(shí)符列表模式或屏蔽位模式。
為了過(guò)濾出一組標(biāo)識(shí)符,應(yīng)該設(shè)置過(guò)濾器組工作在屏蔽位模式。
為了過(guò)濾出一個(gè)標(biāo)識(shí)符,應(yīng)該設(shè)置過(guò)濾器組工作在標(biāo)識(shí)符列表模式。
應(yīng)用程序不用的過(guò)濾器組,應(yīng)該保持在禁用狀態(tài)。
過(guò)濾器組中的每個(gè)過(guò)濾器,都被編號(hào)為(叫做過(guò)濾器號(hào))從0開(kāi)始,到某個(gè)最大數(shù)值-取決于過(guò)濾器組的模式和位寬的設(shè)置。
過(guò)濾器優(yōu)先級(jí)規(guī)則
根據(jù)過(guò)濾器的不同配置,有可能一個(gè)報(bào)文標(biāo)識(shí)符能通過(guò)多個(gè)過(guò)濾器的過(guò)濾;在這種情況下,存放在接收郵箱中的過(guò)濾器匹配序號(hào),根據(jù)下列優(yōu)先級(jí)規(guī)則來(lái)確定:
● 位寬為32位的過(guò)濾器,優(yōu)先級(jí)高于位寬為16位的過(guò)濾器
● 對(duì)于位寬相同的過(guò)濾器,標(biāo)識(shí)符列表模式的優(yōu)先級(jí)高于屏蔽位模式
● 位寬和模式都相同的過(guò)濾器,優(yōu)先級(jí)由過(guò)濾器號(hào)決定,過(guò)濾器號(hào)小的優(yōu)先級(jí)高
位時(shí)間特性
簡(jiǎn)單的說(shuō)就是在can寄存器配置的時(shí)候?qū)τ诩拇嫫鰿AN_CJW、CAN_BS1、CAN_BAS2的設(shè)置值,以及CAN_Prescaler的設(shè)置,
波特率=clk/(CAN_CJW+CAN_BS1+CAN_BAS2)/CAN_Prescaler。
以上就是CAN總線(xiàn)的部分知識(shí),還有一些沒(méi)有粘貼在這里,可以在stm32手冊(cè)中查找,另外對(duì)于can寄存器的設(shè)置都是以上介紹的代碼實(shí)現(xiàn),因此在寄存器設(shè)置中有不理解的地方可以參考can總線(xiàn)的介紹。
轉(zhuǎn)載于:https://www.cnblogs.com/longbiao831/p/4556283.html
總結(jié)
以上是生活随笔為你收集整理的stm32_CAN总线知识的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: debian 升级glibc
- 下一篇: Hibernate关联查询