can過濾器的配置(f103 hal1.8 系列)
can的過濾器的配置是對can接收到的報文進行過濾的配置,在stm32晶元中,可以對can的報文進行過濾,從而省略cpu的處理過程。
can的過濾模式
f103中為應用程式提供了14個位寬可變、可配置的過濾器組,每個過濾器組由2個32位暫存器,can_fxr0和can_fxr1組成。
每個過濾器組的位寬都可以單獨設定,以滿足應用程式的不同需求。根據位寬的不同,可以配置為1個32位過濾器和2個16位過濾器。
can過濾器還可以分為遮蔽位模式和識別符號列表模式。
其中:識別符號遮蔽位模式:fxr0為識別符號匹配值,fxr1為遮蔽碼。解釋為fxr1中某一位為1,fxr0中相應的位置必須與收到的幀的識別符號中的相應位置吻合才能通過過濾器。fxr1中為0的位表示fxr0的相應位可不必與收到的幀進行匹配。例如:識別符號暫存器的bit15=0,遮蔽位暫存器的bit15=1,那麼接受的message裡面的識別符號的bit15必須為0才可能被硬體接受。如果遮蔽位暫存器的bit15=0,message裡面的識別符號的bit15無論為什麼值,bit15都能匹配通過,當bit0~31位都能通過的時候,這個報文就會被接受;
識別符號列表模式:fr1和fr2都是要匹配的識別符號,收到的幀的識別符號必須與其中乙個吻合才能通過過濾器;
所有的過濾器都是併聯的,乙個報文只要能通過乙個過濾器就算是有效的。
在can的過濾器的配置的時候,需要用到結構體中filteridhigh,filteridlow,filtermaskidhigh,filtermaskidlow,這幾個配置。在識別符號列表模式下:id和maskid在32位模式和16位模式的過濾器中都是代表著乙個意思。在遮蔽位模式下,id代表著標準值,而maskid代表著需要關心id中的哪些位。其中高對應著高,低對應著低。
其中ide = 0為標準id,ide為1為擴充套件id,rtr = 0為代表資料幀,rtr = 1代表遠端幀,mask設定遮蔽碼,id設定標準幀。
1、進行can配置
上圖主要的配置是進行can匯流排波特率的配置,波特率由p、tq1、tq2這三個數值進行確定。
2、進行中斷配置
使用hal_can_getrxmessage(hcan, can_rx_fifo0, &rxmessage, rxdata);可以讀取can資料(rxmessage 的定義:can_rxheadertypedef rxmessage;)
3、生成工程後進行新增過濾器的配置
進行32位過濾器遮蔽位模式設定
hal_statustypedef can_user_init
(can_handletypedef *h_can)
進行16位過濾器遮蔽位模式配置
hal_statustypedef can_user_init
(can_handletypedef *h_can)
注意以上只是乙個過濾器的配置過程,f103可以進行14組過濾器的配置。
4、傳送資料:
/*使用can匯流排傳送資料*/
uint8_t canx_sendnormaldata
(can_txheadertypedef txheader,uint32_t std_id ,uint8_t *txdata ,uint16_t lengh)if(
hal_can_addtxmessage
(&hcan,
&txheader, txdata,
&txmailbox)
!=hal_ok
)return1;
}
5、接收中斷
/*採用接收中斷函式*/
void
hal_can_rxfifo0msgpendingcallback
(can_handletypedef *h_can)
; uint16_t nodeid =0;
hal_statustypedef hal_retval;
uint8_t cmd =
0x2f
;// uint16_t control_mode = 0x6060;
if(h_can ==
&hcan)}}
}if((nodeid&
0x582)==
0x582)}
}}}}
STM32F103 CAN中斷傳送功能的再次討論
我在之前的一篇部落格日誌中,寫過關於can傳送功能如何使用,但是當時由於時間匆忙,趕專案,按照對usart中斷傳送的理解,在資料成功傳送出去的情況下,寫了那篇誤人子弟的日誌,在這裡向大家道歉,實在不好意思,現在我重新闡述下can中斷傳送原理。1 usart傳送中斷與can傳送中斷的區別 usart傳...
STM32F103 CAN通訊波特率的計算方法
如果主機與從機,波特率不一致,很難正常的通訊。函式名 can mode config 描述 can的模式 配置 輸入 無 輸出 無 呼叫 內部呼叫 static void can mode config void else endif can init can1,can initstructure ...
STM32的CAN匯流排除錯
1.使用stm32的can匯流排,回環程式寫好之後,在無外接收發晶元的情況下,使程式不斷發資料,使用示波器可以看到tx引腳有波形,而rx引腳沒有波形 2.模式改為正常模式,在沒有接收發晶元的情況下再次測一下tx與rx的波形,但是發現使用示波器採集不到波形,而且在發了幾次資料後會進行標準庫的斷言,一直...