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