STM32 BXCAN
目錄
1.bxCAN簡介
2.編程
- 1.初始化CAN
- 2.發送函數
- 3.接收函數
- 4.main函數內設置
3.FIFO郵箱介紹
Basic feature
通訊流程
初始化CAN
(1) GPIO 基本設置以及引腳配置、時鍾配置
(2) CAN 模式,波特率等配置
1.設置相關位時序,主要用來配置波特率
2.模式選擇,如普通模式,回環模式,回環靜默模式
3.優先級選擇
4.觸發方式
(3)CAN FILTER CONFIGURATION
Mask、Code、Filter選擇哪一個,IDE標准幀還是擴展幀。(這個是你能夠接收ID的設置)
(4)接收中斷使能
NVIC優先級配置
編寫接收中斷函數
發送函數
流程
在主函數中設置你想要發送的數據內容數組,長度。
配置你的node.ID,RTR,IDE,LEN,將buf中的內容填充好。
調用發送函數,將數據存儲到發送郵箱上。
判斷是否發送完成,沒有等待一段時間,如果成功返回0,失敗返回1
//=====================================
其中 msg[] 是想要發送的數組,len表示想要發送幀的長度
data總共可以接受8個字節。
STM32 CAN發送和接收都有郵箱的去接收。
unit8_t CAN_send_Msg(uint8_t* msg, uint8_t len)
{
uint8_t msgbox; //郵箱,存儲你想要發送的幀frame
uint16_t i = 0;
CANTxMsg TxMessage;
TxMessage.Stdid = 0x12; //配置ID
// TxMessage.Extid = 0X12; //擴展幀29還是標准幀11
TxMessage.IDE = CAN_id_Standard; //顯性0dominant
TxMessage.RTR= CAN_RTR_Data; //Data frame
TxMessage.DLC= len; //frame lenghth
for (i = 0; i < len; i++)
{
TxMessage.Data[i] = msg[i]; //把想要寫的新消息寫入buff中 0-8個字節
msgbox = CAN_Transmit(CAN1, &TxMessage); //最多發送8個字節
i = 0;
//循環等待 一段時間等待發送結束
while ((CAN_TransmitStatus(CAN1, mbox) == CAN_TxStatus_Failed) && (i < 0xfff))
i++;
if (i > 0xff)
{
return 1;
}
else
{
return 0;
}
}
}
//========================================
接收函數
//接收函數
//1.判斷CAN接收郵箱是否收到數據
//2.BUF 數據緩存區,定義全局變量數組用於存放BUF數據
//3.返回值為0,無數據受到。其他受到數據。
unit8_t CAN_Receive_Msg(uint8_t* buf)
{
uint8_t i; //郵箱,存儲你想要發送的幀frame
CANRxMsg TxMessage;
if (CAN_Message_pending(CAN1, CAN_FIFO) == 0) //沒有接收到數據,直接退出
return 0;
CAN_receive(CAN1, CAN_FIFO, &RxMessage); //讀取數據
for (i = 0; i < 8; i++)
{
buf[i] = RxMessage.Data[i]; //取出數據即可,如果存在數據,返回值不為0
}
return RxMessage.DLC; Date Length
}
主函數(偽代碼)
設置發送msg數組和接收buf數組
int main()
{
- 主函數中調用transmit函數(填充發送的數組,選擇發送的字節長度),至於結果你要看從設備的狀態,可以通過仿真看從設備的狀態。
從設備可能會發送接收成功的相應,不過這是CANopen協議
CAN_send_Msg(uint8_t* msg, uint8_t len)
- 上位機(其他設備)對從設備發送命令, 主函數中調用RECEIVE函數(選擇哪個)
CAN_Receive_Msg(uint8_t* buf)
取出數據實現相應的操作
}
時間:2021-10-24 19:18:14 於 圖書館