你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

【经验分享】STM32F103:CAN总线通信——发送和接收

[复制链接]
STMCU小助手 发布时间:2022-5-4 22:00
一、CAN总线通信 发送
1. CAN总线通信发送配置流程
1.写入标识符
2.写入标识符类型(标准帧/扩展帧)
3.写入帧类型(远程帧/数据帧)
4.写入数据长度
5.写入数据
6.发送数据
2. CAN总线通信发送相关库函数
发送数据结构体:

  1. typedef struct
  2. {
  3.   uint32_t StdId;  /*!<指定标准标识符
  4.                        该参数可以是0到0x7FF之间的值,11位数据 */

  5.   uint32_t ExtId;  /*!< 指定扩展标识符
  6.                         该参数可以是0到0x1FFFFFFF之间的值,29位数据 */

  7.   uint8_t IDE;     /*!< 指定要传输的消息的标识符类型
  8.                         标准帧:CAN_ID_STD
  9.                         扩展帧:CAN_ID_EXT        */

  10.   uint8_t RTR;     /*!< 指定要传输的消息的帧类型
  11.                          数据帧:CAN_RTR_DATA
  12.                          远程帧:CAN_RTR_REMOTE         */

  13.   uint8_t DLC;     /*!< 指定将要传输的帧的长度。
  14.                                                 取值范围为0 ~ 8        */

  15.   uint8_t Data[8]; /*!<        包含要传输的数据。
  16.                                                 取值范围是0 ~ 0xFF        */
  17. } CanTxMsg;
复制代码

发送库函数:

  1. /**
  2.   * @brief  Initiates the transmission of a message.
  3.   * @param  CANx:      where x can be 1 or 2 to to select the CAN peripheral.
  4.   * @param  TxMessage: pointer to a structure which contains CAN Id, CAN
  5.   *                    DLC and CAN data.
  6.   * @retval The number of the mailbox that is used for transmission
  7.   *                    or CAN_TxStatus_NoMailBox if there is no empty mailbox.
  8.   */

  9. uint8_t CAN_Transmit(CAN_TypeDef* CANx, CanTxMsg* TxMessage);
复制代码

3.CAN总线通信发送程序
标准帧具体代码如下:

  1. CanTxMsg TxMessage;        //定义结构体变量
  2. /* 发送数据*/
  3. void CAN_TX(void)
  4. {
  5.   TxMessage.StdId=0x01;                                //标准标识符为0x01
  6.   TxMessage.IDE=CAN_ID_STD;                        //使用标准标识符 CAN_ID_STD
  7.   TxMessage.RTR=CAN_RTR_DATA;                //为数据帧
  8.   TxMessage.DLC=0x08;                                //消息的数据长度为8个字节
  9.   TxMessage.Data[0]=0x01;                         //第1个字节数据  
  10.   TxMessage.Data[1]=0x02;                         //第2个字节数据  
  11.   TxMessage.Data[2]=0x03;                         //第3个字节数据  
  12.   TxMessage.Data[3]=0x04;                         //第4个字节数据  
  13.   TxMessage.Data[4]=0x05;                         //第5个字节数据  
  14.   TxMessage.Data[5]=0x06;                         //第6个字节数据  
  15.   TxMessage.Data[6]=0x07;                         //第7个字节数据  
  16.   TxMessage.Data[7]=0x08;                         //第8个字节数据  
  17.   CAN_Transmit(CAN1, &TxMessage);         //发送数据
  18. }
复制代码

扩展帧具体代码如下:

  1. CanTxMsg TxMessage;        //定义结构体变量
  2. /* 发送两个字节的数据*/
  3. void CAN_TX(void)
  4. {

  5.   TxMessage.ExtId=0x1FFFFFFF;                 //扩展标识符 0x1FFFFFFF
  6.   TxMessage.IDE=CAN_ID_EXT;                        //使用标准标识符 CAN_ID_EXT
  7.   TxMessage.RTR=CAN_RTR_DATA;                //为数据帧
  8.   TxMessage.DLC=0x08;                                //消息的数据长度为8个字节
  9.   TxMessage.Data[0]=0x01;                         //第1个字节数据  
  10.   TxMessage.Data[1]=0x02;                         //第2个字节数据  
  11.   TxMessage.Data[2]=0x03;                         //第3个字节数据  
  12.   TxMessage.Data[3]=0x04;                         //第4个字节数据  
  13.   TxMessage.Data[4]=0x05;                         //第5个字节数据  
  14.   TxMessage.Data[5]=0x06;                         //第6个字节数据  
  15.   TxMessage.Data[6]=0x07;                         //第7个字节数据  
  16.   TxMessage.Data[7]=0x08;                         //第8个字节数据  
  17.   CAN_Transmit(CAN1, &TxMessage);         //发送数据
  18. }
复制代码

二、CAN总线通信 接收
1. CAN总线通信接收配置流程
进入CAN总线接收中断
CAN总线接收库函数接收数据
解析接收数据
实现对应功能

2. CAN总线通信接收相关库函数
接收数据结构体:

  1. typedef struct
  2. {
  3.   uint32_t StdId;  /*!<指定标准标识符
  4.                        该参数可以是0到0x7FF之间的值 */

  5.   uint32_t ExtId;  /*!< 指定扩展标识符
  6.                         该参数可以是0到0x1FFFFFFF之间的值 */

  7.   uint8_t IDE;     /*!< 指定要传输的消息的标识符类型
  8.                         标准帧:CAN_ID_STD
  9.                         扩展帧:CAN_ID_EXT        */

  10.   uint8_t RTR;     /*!< 指定要传输的消息的帧类型
  11.                          数据帧:CAN_RTR_DATA
  12.                          远程帧:CAN_RTR_REMOTE         */

  13.   uint8_t DLC;     /*!< 指定将要传输的帧的长度。
  14.                                                 取值范围为0 ~ 8        */

  15.   uint8_t Data[8]; /*!<        包含要传输的数据。
  16.                                                 取值范围是0 ~ 0xFF        */
  17.                                 
  18.    uint8_t FMI;     /*!< 指定存储在邮箱中的消息所经过的筛选器的索引
  19.                                                     该参数可以是0到0xFF之间的值  */
  20. } CanRxMsg;
复制代码

接收库函数:

  1. /**
  2.   * @brief  Receives a message.
  3.   * @param  CANx:       where x can be 1 or 2 to to select the CAN peripheral.
  4.   * @param  FIFONumber: Receive FIFO number, CAN_FIFO0 or CAN_FIFO1.
  5.   * @param  RxMessage:  pointer to a structure receive message which contains
  6.   *                     CAN Id, CAN DLC, CAN datas and FMI number.
  7.   * @retval None.
  8.   */
  9. void CAN_Receive(CAN_TypeDef* CANx, uint8_t FIFONumber, CanRxMsg* RxMessage);
复制代码

3. CAN总线通信接收程序
标准帧:
具体代码如下:

  1. CanRxMsg RxMessage;//定义结构体变量
  2. //接收中断
  3. void USB_LP_CAN1_RX0_IRQHandler(void)
  4. {        
  5.         CAN_Receive(CAN1, CAN_FIFO0, &RxMessage); //接收FIFO0中的数据
  6.         get_data(&RxMessage);        //接收数据处理函数
  7. }
  8. //接收数据处理函数
  9. void get_data(CanRxMsg* rxMsg)
  10. {
  11.         switch(rxMsg->StdId) //判断标准帧标识符
  12.         {
  13.                 case 0x001:
  14.                         //要实现的功能
  15.                         break;
  16.                 /*
  17.                 *
  18.                 其他标识未列出
  19.                 */        
  20.                 case 0x7ff:
  21.                         //要实现的功能
  22.                         break;        
  23.                 default :
  24.                         break;
  25.         }
  26. }        
复制代码

扩展帧:
具体代码如下:

  1. CanRxMsg RxMessage;//定义结构体变量
  2. //接收中断
  3. void USB_LP_CAN1_RX0_IRQHandler(void)
  4. {        
  5.         CAN_Receive(CAN1, CAN_FIFO0, &RxMessage); //接收FIFO0中的数据
  6.         get_data(&RxMessage);        //接收数据处理函数
  7. }
  8. //接收数据处理函数
  9. void get_data(CanRxMsg* rxMsg)
  10. {
  11.         switch(rxMsg->ExtId) //判断扩展帧标识符
  12.         {
  13.                 case 0x00000001:
  14.                         //要实现的功能
  15.                         break;
  16.                 /*
  17.                 *
  18.                 其他标识未列出
  19.                 */        
  20.                 case 0x1FFFFFFF:
  21.                         //要实现的功能
  22.                         break;        
  23.                 default :
  24.                         break;
  25.         }
  26. }        
复制代码





收藏 1 评论0 发布时间:2022-5-4 22:00

举报

0个回答

所属标签

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版