CAN 通訊協議學習筆記(2)STM32 CAN 編程案例


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 於  圖書館

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM