关注+星标公众,不错过精彩内容

CAN,Controller Area Network(控制器局域网络),在汽车电子、工业控制领域的应用比较多,通常用于局域组网。

CAN总线和UART、I2C、SPI总线最大的区别主要在于取消了传统的地址编码方式,理论上讲总线上的互联节点数不受限制,拥有强大的握手与出错管理及重发机制,具有很强的抗干扰能力。

嵌入式专栏

1

STM32 CAN 基础内容

CAN网络中主要由CAN控制器和CAN收发器组成,大部分STM32内部都集成了CAN控制器,如果需要使用CAN功能,还需要在外部连接一个CAN收发器才能使用。

▲ CAN 网络拓扑结构图

STM32内部集成的CAN控制器,支持 2.0A 和 B 版本的 CAN 协议。还有通信速度更快的CAN FD、 CAN XL,目前一部分STM32支持CAN FD(比如STM32H7)。

下面结合STM32F4描述一下关于CAN基本的信息:

1. CAN总线

CAN总线上的数据是基于差分信号,通常只有两根线:CAN_L和CAN_H。从STM32芯片引出来的两个信号脚CAN发送和CAN接收,有点类似UART的收发引脚,但内部控制逻辑完全不一样。经过CAN收发器后形成两根信号线CAN_L和CAN_H挂到CAN总线上。

2. CAN波特率

CAN 总线属于异步通信,和UART类似,因此具有通信的波特率,标准 CAN 波特率通常支持高达 1 Mb/s。当然,也可以配置成500Kb/s、 250Kb/s等。

CAN 波特率由多个参数决定,下面章节会讲述波特率配置。

3. CAN发送

STM32集成的CAN控制器支持三个发送邮箱,也就是说可以支持队列发送消息(数据),如果同一时间发送数据比较多,使用邮箱就比较高效,不用消耗CPU资源,CAN控制器自动发送,直到完成。

4. CAN接收

和发送类似,CAN接收支持接收FIFO,可以连续接收多个消息(数据),CPU空闲了再去处理接收到的数据。

同时,CAN控制器还支持接收过滤配置,也就是说,有些数据我不需要,CAN控制器可以自动过滤掉。

通过一张CAN框图来认识CAN控制器:

关于CAN的更多信息,可以参看芯片对应的手册和CAN相关协议资料。

嵌入式专栏

2

STM32 CAN 常规配置

STM32 CAN控制器需要配置的参数比较多,对于初学者而言,重点就是波特率。如果你只使用一些基本的功能,不使用的功能建议参考官方代码默认配置即可。

1. CAN引脚时钟配置

引脚和时钟是使用外设基本的配置,比如F4例程:

GPIO_InitTypeDef  GPIO_InitStructure;RCC_AHB1PeriphClockCmd(CAN_GPIO_CLK, ENABLE);
RCC_APB1PeriphClockCmd(CAN_CLK, ENABLE);GPIO_PinAFConfig(CAN_GPIO_PORT, CAN_RX_SOURCE, CAN_AF_PORT);
GPIO_PinAFConfig(CAN_GPIO_PORT, CAN_TX_SOURCE, CAN_AF_PORT);GPIO_InitStructure.GPIO_Pin = CAN_RX_PIN | CAN_TX_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_UP;
GPIO_Init(CAN_GPIO_PORT, &GPIO_InitStructure);

2. CAN常规配置

这些基本参数,需要进一步功能的作用,默认DISABLE。

CAN_InitTypeDef CAN_InitStructure;CAN_InitStructure.CAN_TTCM = DISABLE;
CAN_InitStructure.CAN_ABOM = DISABLE;
CAN_InitStructure.CAN_AWUM = DISABLE;
CAN_InitStructure.CAN_NART = DISABLE;
CAN_InitStructure.CAN_RFLM = DISABLE;
CAN_InitStructure.CAN_TXFP = DISABLE;
CAN_InitStructure.CAN_Mode = CAN_Mode_Normal;

3. CAN波特率配置

波特率是第一步需要掌握的,波特率不对,就不能正常通信。

波特率 = 时钟 ÷ Prescaler ÷ (SJW + BS1 + BS2);

比如:42M / 2 / (1 + 12 +8) = 1M

CAN_InitStructure.CAN_SJW = CAN_SJW_1tq;
CAN_InitStructure.CAN_BS1 = CAN_BS1_12tq;
CAN_InitStructure.CAN_BS2 = CAN_BS2_8tq;
CAN_InitStructure.CAN_Prescaler = 2;

4. CAN过滤配置

CAN过滤是相对更高级的功能,建议深入了解,否则建议默认配置即可。

CAN_FilterInitTypeDef  CAN_FilterInitStructure;
CAN_FilterInitStructure.CAN_FilterNumber = 0;
CAN_FilterInitStructure.CAN_FilterMode = CAN_FilterMode_IdMask;
CAN_FilterInitStructure.CAN_FilterScale = CAN_FilterScale_32bit;
CAN_FilterInitStructure.CAN_FilterIdHigh = 0x0000;
CAN_FilterInitStructure.CAN_FilterIdLow = 0x0000;
CAN_FilterInitStructure.CAN_FilterMaskIdHigh = 0x0000;
CAN_FilterInitStructure.CAN_FilterMaskIdLow = 0x0000;
CAN_FilterInitStructure.CAN_FilterFIFOAssignment = 0;
CAN_FilterInitStructure.CAN_FilterActivation = ENABLE;
CAN_FilterInit(&CAN_FilterInitStructure);

以上是通过标准外设库配置的参数,使用STM32CubeMX就可以很轻松的一键配置了。

对CAN有一定基础了解,同时掌握HAL库使用方法的人,建议直接使用STM32CubemMX 配置并生成初始化代码。

嵌入式专栏

3

STM32 CAN 常见问题

STM32的CAN控制器功能相对比较强大,实际开发过程中容易遇到问题,软件硬件都有可能导致通信异常,下面整理几点常见问题。

问题一:CAN总线接线问题

CAN控制器出来的信号为CAN_TX和CAN_RX,有点类似UART,但它和外面的收发器接法是TX对应TX,不是UART交叉连接。

同时,CAN总线和485类似是差分信号,具有极性。通常CAN总线只有两根线CAN_L和CAN_H。

上面指出来的两点,任意一处接线错误都会导致通信失败。所以,建议参考官方给出的电路原理图。

问题二:通信波特率配置问题

CAN属于异步通信,如果波特率不对,就会通信失败,或者接收到乱码。影响波特率的因素有很多:CAN时钟、分频值、位时序。

CAN时钟也就是RCC出来进入CAN控制器的APB时钟,比如上面代码中配置的是APB1,42M时钟。(一定要分清,不能认为是84M)。

位时序也是比较重要的一个配置,包含同步段、位段等,需要根据实际情况调整对应的值。

问题三:CAN接收数据丢包问题

通常来说,CAN组网之后,总线上的数据量比较大,如果你配置或者处理不正确,就会导致丢失数据的情况。

1. CAN接收数据,通常使用中断

CAN中断入口和CAN中断函数处理比较容易引起数据丢失的问题。

有些CAN中断入口和其它外设的共用,比如STM32F103的CAN和USB共用一个中断入口。

通信时,由于CAN中断频率较高,中断函数不能占用太多时间,通常来说,只对接收到的数据进行一些简单搬运处理,不建议在中断程序里处理较为复杂的逻辑或算法运算。

2. 双CAN过滤器管理问题

部分STM32芯片具有双CAN模块,从整体功能上讲,两个CAN是独立的。但是,两个CAN共用过滤器管理模块,对于STM32芯片来讲,该过滤器控制模块由CAN1统一管理,所以即使只是单独使用CAN2进行收发,也须开启CAN1,否则会因为过滤器未能开启,导致单独使用CAN2时无法收发的情形。

3.CAN接收过滤

CAN总线接收可以通过配置,对一些“无用”或不需要的信息进行过滤,换言之即对总线上的信息选择性地进行接收。这个功能也算是CAN总线的高级功能,只有深入理解该功能之后方能灵活使用之。否则会因为过滤配置不当导致收发异常。

复盘一下

▼CAN 基础内容:CAN总线、波特率、发送和接收;

▼CAN 常规配置:引脚时钟、常规配置、波特率配置、过滤配置;

▼CAN 常见问题:接线问题、波特率配置问题、接收数据丢包问题;

------------ END ------------

后台回复『STM32』『STM32学习笔记』相关文章。

欢迎关注我的公众号回复“加群”按规则加入技术交流群,回复“1024”查看更多内容。

欢迎关注我的视频号:

点击“阅读原文”查看更多分享。

STM32学习笔记 | CAN总线收发数据常见问题分析相关推荐

  1. can总线配置读入是什么意思_STM32学习笔记—CAN总线收发数据常见问题分析

    CAN,Controller Area Network(控制器局域网络),在汽车电子.工业控制领域的应用比较多,通常用于局域组网. 这是第9篇学习分享文章,<STM32学习笔记>之CAN总 ...

  2. dsp28335 sci中用fifo完成485收发通信_STM32学习笔记—CAN总线收发数据常见问题分析

    CAN,Controller Area Network(控制器局域网络),在汽车电子.工业控制领域的应用比较多,通常用于局域组网. 这是第9篇学习分享文章,<STM32学习笔记>之CAN总 ...

  3. STM32学习笔记(16)-数据的保存与毁灭-BKP功能(1)

    转自:http://blog.ednchina.com/czlyzhj/1821516/message.aspx 通过研究,大体明白了BKP的功能,简述如下: 1.  BKP可以用来保存数据 BKP中 ...

  4. 野火STM32学习笔记一、固件库文件分析

    STM32固件库文件分析 汇编编写的启动文件 startup_stm32f10x_hd.s: 设置堆栈指针.设置PC指针.初始化中断向量表.配置系统时钟.调用C库函数main最终去到C的世界 时钟配置 ...

  5. 《STM32学习笔记》4——核心功能电路与编程(下)

    接上文,文中的图片,大多数来自视频的截图(来自洋桃电子). 欢迎大家批评指正! STM32学习笔记-专栏 文章目录 一.蜂鸣器驱动 1.蜂鸣器介绍 2.蜂鸣器电路 3.蜂鸣器程序 二. MIDI 音乐 ...

  6. 【STM32】学习笔记RTC日历基础应用问题分析

    ▲ 点击上方 关注STM32 RTC,Real_Time Clock,即实时时钟,在许多电子系统中都能看到实时时钟的存在. 今天是第6篇分享,<STM32学习笔记>之RTC日历基础应用问题 ...

  7. STM32学习笔记(四)丨TIM定时器及其应用(定时中断、内外时钟源选择)

    本篇文章包含的内容 一.TIM 定时器 1.1 TIM 定时器简介 1.2 TIM 定时器类型及其工作原理简介 1.2.1 基本定时器工作原理及其结构 1.2.2 通用定时器工作原理及其结构 1.2. ...

  8. input内容右对齐_STM32学习笔记—DAC基础内容及常见问题

    DAC,Digital-to-Analog Converter(数模转换器),DA转换和AD转换有着同样重要的作用,在许多场合都能看到DAC的应用. 今天是第8篇分享,<STM32学习笔记> ...

  9. STM32学习笔记(15)——SPI协议

    STM32学习笔记(15)--SPI协议 一.SPI协议简介 1. 物理层 2. 协议层 (1) 通讯的开始与停止 (2)时钟极性CPOL.时钟相位CPHA 二.STM32的SPI外设 1. 通讯引脚 ...

最新文章

  1. java ipv6校验_JS及java验证 IPV6,IPV4地址的 正则表达式 | 学步园
  2. 十道上市公司java面试试题
  3. 使用 TDD 测试驱动开发来构建 Laravel REST API
  4. 控制HTML Input只能输入数字和小数点
  5. 16字节 oracle md5,Oracle中的MD5加密
  6. c oracle日志分析,oracle 日志分析
  7. python视频 神经网络 Tensorflow
  8. 蚂蚁S9矿卡ddr型号确认方法
  9. 【LeetCode】【refine 3】题号:*3. 无重复字符的最长子串
  10. php中多重继承,PHP如何使用接口实现多重继承?(代码示例)
  11. 台达服务器AB和B2系列区别,台达A2与B2伺服的区别
  12. 【无标题】2022年“研究生科研素养提升”系列公益讲座在线测评本次测验答题时间为8月15日-26日,60分及格,每人有一次补考机会。
  13. 单表(sqlserver不支持)、整库,支持本地和远程备份
  14. 少年包青天里的一个分尸案 来龙去脉
  15. xsh报告-推荐系统
  16. Flink常用算子Transformation(转换)
  17. 3D刷脸支付推动新零售行业发展
  18. Spring笔记(基于狂神视频+自己理解)
  19. 2023银行校园招聘简历自我评价高分写法模板
  20. 深入理解读写锁ReentrantReadWriteLock

热门文章

  1. 扫地机器人杂牌的怎么样_扫地机器人入坑测评不同牌子
  2. linux重启mysql服务_LINUX重启MYSQL的命令
  3. 基于HAL库手写一个轻量化操作系统——参考ucos
  4. 达梦数据库MPP搭建
  5. 什么是限流?为什么会限流呢?常见的限流算法【固定窗口限流、滑动窗口限流、漏桶限流、令牌桶限流】是什么呢?
  6. 关于MySQL自增id不连续问题
  7. html点击图标出现日历,html / css交互式日历下一个/上一天按钮编码
  8. android 日历动态图标,android – 有没有办法动态更改日历应用程序的应用程序图标呢?...
  9. vivo手机使用应用沙盒动态修改指纹数据
  10. 如何为员工创建内部知识库?