stm32的can配置,獲取標(biāo)識(shí)符(ID)
關(guān)于stm32的can的特性,從手冊(cè)上可以查到:
手冊(cè)上面的內(nèi)容比較雜,所以截取了一些有用的片段:(大家也可以查看手冊(cè),)

關(guān)于can的硬件接線:



寄存器的主要功能:

整個(gè)的流程可以從這張圖中看出,這張圖是很重要的:
從下面這張圖中,可以看出很多東西,可以看出數(shù)據(jù)流,
1,從圖中可以看出,stm32里有兩個(gè)can;
2,從圖中可以看出,stm32里每個(gè)can有3個(gè)發(fā)送郵箱,兩個(gè)接收f(shuō)ifo,每個(gè)fifo有三個(gè)深度.
3,從圖中可以看出,數(shù)據(jù)經(jīng)過(guò)過(guò)濾器,進(jìn)入到fifo,需要設(shè)置過(guò)濾器決定數(shù)據(jù)進(jìn)入哪個(gè)fifo.
? 實(shí)際上,can的fifo0和fifo1是兩個(gè)不同的中斷名字,



can的發(fā)送:

上面的圖片說(shuō)明了發(fā)送的過(guò)程,
發(fā)送前,需要將CAN_TIxR的TXRQ位置1,用來(lái)表示有數(shù)據(jù)要發(fā)送.
選擇一個(gè)郵箱,這個(gè)郵箱的選擇是硬件自己完成的,根據(jù)CAN的結(jié)構(gòu)圖(上面),
可以看出有0,1,2這三個(gè)發(fā)送郵箱,但是用那個(gè)郵箱是你決定不了的,需要根據(jù)規(guī)則:
硬件自己會(huì)查詢當(dāng)前哪個(gè)郵箱是空的,如果哪個(gè)郵箱有空閑,就先用哪個(gè).
當(dāng)有多個(gè)郵箱被裝滿數(shù)據(jù)的時(shí)候,哪個(gè)會(huì)先發(fā)送? 這里有兩個(gè)方法,可以通過(guò)軟件挑選:
方法一:發(fā)送順序有郵箱中存儲(chǔ)消息的標(biāo)識(shí)符來(lái)確定,如果標(biāo)識(shí)符一樣,則按照郵箱號(hào)小的發(fā)送.(可以理解為按照緊急程度發(fā)送); 這里會(huì)出現(xiàn)一些奇怪的現(xiàn)象,就是你先發(fā)A后發(fā)B,對(duì)方可能現(xiàn)接受到B然后再接收到A.因?yàn)锽比較緊急,所以即使先發(fā)送了A,也不一定第一個(gè)收到A.
方法二:按照請(qǐng)求順序發(fā)送,通過(guò)設(shè)置CAN_MCR寄存器中的TXFP位,變成FIFO模式發(fā)送,這樣就會(huì)按照請(qǐng)求順序發(fā)送.(可以認(rèn)為,先到先發(fā)); 這個(gè)模式對(duì)分段發(fā)送很有用,如果你的數(shù)據(jù)特別長(zhǎng),需要分成好幾條報(bào)文,那么就用方法二.
等待總線變空閑,空閑后就會(huì)發(fā)送了.
檢測(cè)是否發(fā)送成功,can發(fā)送出數(shù)據(jù)后,還會(huì)檢測(cè)是否發(fā)送成功,這個(gè)是硬件幫助我們完成的,如果發(fā)送成功,CAN_TSR寄存器的RQCP和TXOK會(huì)置一.
如果發(fā)送失敗,CAN_TSR寄存器的ALST位(仲裁丟失) \ TERR位(發(fā)送錯(cuò)誤)會(huì)置一.
這也是can的優(yōu)點(diǎn),它發(fā)送完成之后會(huì)檢測(cè)是否成功.
can會(huì)幫助我們完成很多事,比如重新發(fā)送,只需要操作寄存器就可以,并不需要軟件的重新發(fā)送,硬件會(huì)自動(dòng)重發(fā)失敗的信息,如果不需要這個(gè)功能,可以通過(guò)配置寄存器關(guān)閉,

下面是郵箱發(fā)送的過(guò)程中,這個(gè)郵箱寄存器變化圖,這個(gè)圖也很重要,它可以幫助啊我們了解整個(gè)的過(guò)程:(要記住一些必要的寄存名字,這樣看起來(lái)會(huì)舒服些,也容易弄懂)


can的接收
接收緩存的寄存器變化.

根據(jù)can的結(jié)構(gòu)框圖(上面),可以看到一個(gè)can有兩個(gè)FIFO,分別是FIFO0和FIFO1,FIFO是硬件管理的.
FIFO的長(zhǎng)度是有限的,如果超出,就會(huì)溢出,
溢出的處理有兩種方法,




篩選器的配置:
一共有28個(gè)或14個(gè)篩選器組.
篩選器組,可以進(jìn)行伸縮配置,分為,一個(gè)32位的篩選器,或兩個(gè)16位的篩選器.
篩選器組的用法,掩碼模式和標(biāo)識(shí)符列表模式.
篩選器的配置模式,


can的錯(cuò)誤管理:




郵箱的構(gòu)成:


如何獲取can接收到的數(shù)據(jù):
首先從庫(kù)里調(diào)用函數(shù),

can接收到的數(shù)據(jù)都到了RxMessage中,
原型是,(里面就有獲取ID)


跳進(jìn),CanRxMsg這個(gè)結(jié)構(gòu)體里面,可以看到結(jié)構(gòu)體的定義,

然后就可以查看手冊(cè),和它的英文說(shuō)明,就可以知道接收的都是些什么了.
手冊(cè)上的說(shuō)明,


參考:
https://blog.csdn.net/Leisure_ksj/article/details/106788852