IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> STM32CubeMX之CAN通讯 -> 正文阅读

[嵌入式]STM32CubeMX之CAN通讯

? ? ? ?欢迎关注公众号"嵌入式技术开发",大家可以后台给我留言沟通交流。如果觉得该公众号对你有所帮助,也欢迎推荐分享给其他人。

1.CAN总线简介

CAN是控制器局域网络(Controller Area Network, CAN)的简称,是由以研发和生产汽车电子产品著称的德国BOSCH公司开发的,是国际上应用最广泛的现场总线之一。

CAN控制器通过组成总线的2根线(CAN-H和CAN-L)的电位差来确定总线的电平,信号是以两线之间的“差分”电压形式出现,这点与RS485类似,但两者电平值不同。CAN总线电平分为显性电平和隐性电平。

CAN总线采用两种互补的逻辑数值"显性"和"隐性"。"显性"数值表示逻辑"0",而"隐性"表示逻辑"1"。当总线上同时出现“显性”位和“隐性”位时,最终呈现在总线上的是“显性”位。?在“隐性”状态下,VCAN_H和VCAN_L被固定于平均电压电平,Vdiff近似为零,此时VCAN_H和VCAN_L的标称值为2.5V。“显性”位以大于最小阀值的差分电压表示,此时VCAN_H的标称值为3.5V,VCAN_L的标称值为1.5V。如下图所示:

2.CAN帧结构

CAN总线节点上的节点发送数据是以报文的形式广播给网络中所有节点。收发器接收到数据就把数据传送给控制器,再由控制器检查判断是不是所需数据。不是则忽略。

  • 网络上任何一个节点在任何时候都可以发送数据

  • 多个节点发送数据,优先级低主动退出发送

  • 短帧结构,每帧数据信息为0~8字节(具体用户定义),对数据编码而不是地址编码

  • CAN每帧都有CRC校验和其他检验措施,严重错误的情况下具有自动关闭输出的功能

? 报文传输由以下5个不同的帧类型所表示和控制:?

  • 数据帧:数据帧携带数据从发送器至接收器。?

  • 远程帧:总线单元发出远程帧,请求发送具有同一识别符的数据帧。?

  • 错误帧:任何单元检测到总线错误就发出错误帧。?

  • 帧间隔:数据帧(或远程帧)通过帧间空间与前述的各帧分开。

  • 过载帧:过载帧用以在先行的和后续的数据帧(或远程帧)之间提供附 加的延时。?

? 具体帧结构的介绍,可以参考后面一篇文章。

3.硬件设计

现在很多单片机中内置CAN总线协议控制器,只要外接总线驱动芯片和适当的抗干扰电路就可以很方便地建立一个CAN总线智能测控节点。驱动芯片如下:

4.软件设计

??这里以STM32L431单片机为例,建立STM32CubeMX工程,使能CAN接口,设置时钟及分配系数等参数,如下图:

? STM32L431的系统时钟为80M,上图中设置的波特率为100kbps。计算方法如下:

?CAN波特率为 = 系统时钟/Prescaler/ (SJW+BS1+BS2) = 80MHz/32/(1+16+8) = 100KHz

? 使能接收中断:

? 生成代码后,添加CAN滤波器配置函数,如下:

//can滤波器配置函数
void CANFilter_Config(void)
{ 
  CAN_FilterTypeDef  sFilterConfig; 
  sFilterConfig.FilterBank = 0; //CAN过滤器编号,范围0-27 
  sFilterConfig.FilterMode = CAN_FILTERMODE_IDMASK;   //CAN过滤器模式,掩码模式或列表模式 
  sFilterConfig.FilterScale = CAN_FILTERSCALE_32BIT;  //CAN过滤器尺度,16位或32位 
  sFilterConfig.FilterIdHigh = 0x000 << 5;      //32位下,存储要过滤ID的高16位 
  sFilterConfig.FilterIdLow = 0x0000; //32位下,存储要过滤ID的低16位 
  sFilterConfig.FilterMaskIdHigh = 0x0000;      //掩码模式下,存储的是掩码 
  sFilterConfig.FilterMaskIdLow = 0x0000; 
  sFilterConfig.FilterFIFOAssignment = 0; //报文通过过滤器的匹配后,存储到哪个FIFO 
  sFilterConfig.FilterActivation = ENABLE; //激活过滤器 
  sFilterConfig.SlaveStartFilterBank = 0; 
  if (HAL_CAN_ConfigFilter(&hcan1, &sFilterConfig) != HAL_OK) 
  { 
    Error_Handler(); 
  } 
}

? 编写接收中断函数和发送数据函数:

static CAN_TxHeaderTypeDef TxMessage; //CAN发送的消息的消息头
static CAN_RxHeaderTypeDef RxMessage; //CAN接收的消息的消息头
//can总线接收中断函数
void HAL_CAN_RxFifo0MsgPendingCallback(CAN_HandleTypeDef *hcan)
{ 
  uint8_t  data[8]; //接收数据缓存
  HAL_StatusTypeDef  status; 
  if (hcan == &hcan1) 
  { 
    status = HAL_CAN_GetRxMessage(hcan, CAN_RX_FIFO0, &RxMessage, data); 
    if (HAL_OK == status)
    { 
      //数据处理。。。
    } 
  }
}


//can发送数据函数
void CAN1_Send_Test()
{ 
  uint8_t data[4] = {0x01, 0x02, 0x03, 0x04}; //需要发送的数据
  TxMessage.IDE = CAN_ID_STD; //设置ID类型
  TxMessage.StdId = 0x222; //设置ID号 
  TxMessage.RTR = CAN_RTR_DATA;   //设置传送数据帧
  TxMessage.DLC = 4; //设置数据长度 
  if (HAL_CAN_AddTxMessage(&hcan1, &TxMessage, data, (uint32_t*)CAN_TX_MAILBOX0) != HAL_OK) 
  { 
    Error_Handler(); 
  } 
}


??在主函数中调用滤波器配置函数,启动CAN总线,使能接收中断,并循环发送测试数据:

  CANFilter_Config();
  HAL_CAN_Start(&hcan1);
  HAL_CAN_ActivateNotification(&hcan1,CAN_IT_RX_FIFO0_MSG_PENDING);
????/*?USER?CODE?END?2?*/


  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    CAN1_Send_Test();
    HAL_Delay(100);
    /* USER CODE END WHILE */
????/*?USER?CODE?BEGIN?3?*/
  }

? 通过USB转CAN的工具可以在电脑端查看数据是否成功。可以看到,数据可以正常发送。

推荐阅读:

程序 |?STM32CubeMX系列教程

程序 | STM32CubeMX之FatFS读写U盘

电路 | 两种常用压控电流源设计

电路 | 一种RS485自动收发电路

  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2021-09-12 13:19:13  更:2021-09-12 13:20:33 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年12日历 -2024/12/30 1:31:40-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码