語言生動形象,讓人一看就懂。
STM32 CAN發送和接收過濾原理
通過對 CANBUS 協議的理解 , 我們知道 : CAN 總線上的節點接收或發送數據都是以幀為單位的 ! ! ! CAN 協議規定了好幾種幀類型,但是對于我們應用來說,只有數據幀和遠程幀可以通過軟件編程來控制 。 ( 其他幾種幀都是由 CAN 控制器硬件實現的 , 我們想管也管不了 ) 。而數據幀和遠程幀最大的區別在于 : 遠程幀沒有數據域 。 數據幀分為標準數據幀和擴展數據幀,它們之間最大的區別在于:標識符 (ID) 長度不同(標準幀為 11 位,擴展幀為 29 位 ) 。為了能更好地理解下面的內容,讓我們先來回憶一下標準數據幀是什么樣子的:
0.png (197.17 KB, 下載次數: 172)
下載附件
2018-4-16 04:32 上傳
0.jpg (28.05 KB, 下載次數: 157)
下載附件
2018-4-16 04:33 上傳
0.jpg (83.7 KB, 下載次數: 156)
下載附件
2018-4-16 04:33 上傳
0.png (184.39 KB, 下載次數: 144)
下載附件
2018-4-16 04:33 上傳
1 :假如我們只想收到別人發過來的 ID 為 0x317 的標準數據幀:
0X317 二進制位: 011 0001 0111
那么可以這樣設置 :
0.png (128.53 KB, 下載次數: 155)
下載附件
2018-4-16 04:34 上傳
0.png (120.49 KB, 下載次數: 141)
下載附件
2018-4-16 04:35 上傳
種標準數據幀了。
以上是 32 位模式下標識符屏蔽模式和標識符列表模式下的設置方法。
在 16 位模式下,只不過把兩個 32 位寄存器拆成了 4 個 16 位的而已,原理和 32 位模式下是一樣的。就不贅述了。
接收數據是通過指向 Can Can Can Can R R R R xMsg xMsg xMsg xMsg 結構體變量的指針傳遞的。直接調用 CAN_Receive 即可輕松完成。
typedef struct
{
uint32_t StdId;
uint32_t ExtId;
uint8_t IDE;
uint8_t RTR;
uint8_t DLC;
uint8_t Data[8];
uint8_t FMI;
} CanRxMsg;
CanRxMsg 結構與 CanTxMsg 差不多。只是多了一個 FMI 域。
FMI
FMI 設定為消息將要通過的過濾器索引 , 這些消息存儲于郵箱中 。 該參數取值范圍 0 到0xFF 。
完整的pdf格式文檔51黑下載地址:
STM32CAN詳解.pdf
(252.93 KB, 下載次數: 595)
2018-4-14 18:18 上傳
點擊文件名下載附件
STM32 CAN 下載積分: 黑幣 -5
|