STM32F103有1个CAN控制器,可以配合逻辑分析仪来测试CAN和PC的通信。在此之前先学习一下CAN的基础知识。

CAN 控制器根据两根线上的电位差来判断总线电平。总线电平分为显性电平(0),CAN_H和 CAN_L之差为 2.5V左右;隐性电平(1),二者必居其一。而隐性电平对应逻辑 1 CAN_H和 CAN_L之差为 0V。发送方通过使总线电平发生变化,将消息发送给接收方。在总线上显性电平具有优先权,只要有一个单元输出显性电平,总线上即为显性电平。而隐形电平则具有包容意味,只有所有的单元都输出隐性电平,总线上才为隐性电平(显性电平比隐性电平更强)

这里要注意,和常规理解不同,显性电平为0。
还有一点,CAN总线的起止端都有一个120欧的匹配电阻

除了正常工作模式外,还有3种测试模式:

  • 静默模式(接收自己发出去的数据和总线数据,不发送)
  • 环回模式(发送数据到总线,但不接收总线数据,只接收自己Tx到总线的那份数据)
  • 环回静默模式(不发送数据到总线,不接收总线数据,仅接收自己Tx的数据)

这里还有个很重要的知识点,就是CAN总线的波特率,计算方式比较复杂,结合CubeMX上的CAN设置来看

有4个参数和波特率有关,PrescalerTQBS1TQBS2SJW
APB1的频率是36MHz,分频系数取9的话,则一个TQ为1(36/9) =250ns,之后*(TQBS1+TQBS2+SJW),则CAN的位时间为2000ns,相应的位波特率为500Kbps(记住这个值,后面很重要)

  1. Generate code之后,我们首先测试发送功能。
    CAN的发送比较简单,使用的是HAL_CAN_Start()HAL_CAN_AddTxMessage()这两个方法。还要利用CAN_TxHeaderTypeDef这个结构体。
  CAN_TxHeaderTypeDef   TxHeader;uint8_t               TxData[8]={0x10, 0x20, 0x30, 0x40, 0x54, 0x65, 0x66, 0x99};   //测试发送这8个字节uint32_t              TxMailbox = 0;TxHeader.StdId = 0x198;TxHeader.ExtId = 0x999;TxHeader.IDE = 0;TxHeader.RTR = 0;TxHeader.DLC = 8;

然后在进入while(1)循环前,开启CAN通道

HAL_CAN_Start(&hcan);  //F103ZET只有一个CAN,所以无需写序号

while循环中加入下列代码

 HAL_GPIO_TogglePin(LED1_GPIO_Port,LED1_Pin);   //LED1闪烁表示程序在正常运行HAL_Delay(500);HAL_CAN_AddTxMessage(&hcan, &TxHeader, TxData, &TxMailbox);

编译烧写后,将Saleae的USB Logic Analyzer的CH0连到开发板的CANL,并将分析仪的地线和开发板的某个GND相连,千万不能忘的是设置波特率为500Kbit/s。点击软件的Start后,可以看到捕获的波形

放大右下角来看

就是我们发送的数据以及CAN Identifier,测试通过!
2. 接收功能测试

CAN的接收比发送要复杂,CAN总线协议是有邮箱机制的,就是收到的报文是需要放到邮箱里,需要配置过滤器(Filter),关于过滤器的配置,可以在stm32f1xx_hal_can.h中找到CAN_FilterTypeDef结构体的各个成员定义,一般会在can.c中手动将这个结构体的各个成员进行初始化。


CAN接收函数使用HAL_CAN_GetRxMessage(&hcan, CAN_RX_FIFO0, &RxHeader, RxData),接收到的数据存到RxData中。
由于我手头上只有一块开发板,无法向CAN接收器发送数据,所以接收测试无法做,但可以使用测试模式回环即loopback来测试接收功能,即发数据不进入总线,直接接收回来。
3. 回环测试
can.c里将hcan.Init.Mode = CAN_MODE_NORMAL改为hcan.Init.Mode = CAN_MODE_LOOPBACK,即进入了回环模式。想法是通过串口将送回去的RxData打印出来
将过滤器初始化后,需要在原来的main.c代码中添加接收器结构体的初始化

  CAN_RxHeaderTypeDef    RxHeader;uint8_t                RxData[8];RxHeader.StdId = 0x234;RxHeader.ExtId = 0x234;RxHeader.IDE = 0;RxHeader.RTR = 0;RxHeader.DLC = 8;

while(1)循环中在原来的代码后加入以下

HAL_CAN_GetRxMessage(&hcan, CAN_RX_FIFO0, &RxHeader, RxData);
printf("RX of the CAN data is: %02X %02X %02X %02X %02X %02X %02X %02X\r\n", RxData[0], RxData[1], RxData[2], RxData[3], RxData[4], RxData[5], RxData[6], RxData[7]);

这样在发送出去以后马上就能回到RxData中,打开串口调试助手可以看到

证明发送出去的数据都可以通过串口打印出来,测试通过。
同时通过逻辑分析仪也还是能看到CAN模块的发送数据。

STM32自学笔记-7-CAN总线通信相关推荐

  1. STM32自学笔记-6-RS485串口通信

    RS232的通信逻辑"1"的电平为-5V~-15 V,逻辑"0"的电平为+5 V-+15 V.这样高的电平和TTL不兼容,而且容易烧坏接口电路芯片,共地的方式也 ...

  2. STM32学习笔记7(串口通信)

    一.简介 1.电平标准 2.串口参数及时序 串口通讯的数据包由发送设备通过自身的 TXD 接口传输到接收设备的 RXD 接口.它由起始位.数据位.校验位以及停止位组成,通讯双方的数据包格式要约定一致才 ...

  3. 小辣记【野火stm32自学笔记】点灯仪式

    前记 置位:|= 清零:&=~ 使用寄存器点亮LED灯 让绿灯亮PB0 PB0连接3.3V 低电平亮 端口输出寄存器ODR APB2中的GPIO端口B的基地址为0x40010C00 地址偏移为 ...

  4. STM32自学笔记-4-SPI和Flash芯片

    I2C中曾经说过其实目前基本用Flash而不用E2PROM,E2PROM最大的特点是按字节操作,Flash则是按扇区操作.目前STM32单片机教程里基本上都是用W25Q128这款SPI Flash芯片 ...

  5. STM32自学笔记15-步进电机驱动项目-磁编码器MT6816驱动

    这个闭环驱动系统中,充当闭环反馈的是磁编码器MT6816,它的作用是告诉主控现在电机的转动位置. 一般来说磁编码器和光编码器相比,精度.分辨率和响应时间都要差一些,但优势是对环境要求较低,粉尘.油污. ...

  6. STM32学习笔记(四 串口通信 3 串口寄存器库函数配置)

    一.常用的串口寄存器 USART_SR状态寄存器 作用: 状态寄存器适用于检测串口此时所处的状态. 主要关注两个位:RXNE和TC(第5.6两位). RXNE(读数据寄存器非空): 当该位被置1的时候 ...

  7. STM32自学笔记ADC多通道扫描

    STM cubemx STM32F1 ADC多通道采集(非DMA) ADC模式介绍: 扫描模式: 多通道采集必须开启,这一项CUBE已经默认设置好了.这个模式就是自动扫描你开启的所有通道进行转换,直至 ...

  8. STM32 CAN总线通信学习笔记(一)

    STM32 CAN总线通信学习笔记(一) 一.CAN总线简介 CAN 是控制器局域网络(Controller Area Network, CAN)的简称.CAN采用数据块编码的方式,数据块根据帧的类型 ...

  9. 基于STM32的CAN总线通信学习笔记

    转自:https://blog.csdn.net/ludaoyi88/article/details/53350077 基于STM32的CAN总线通信学习笔记 本文主要简单介绍CAN总线的相关概念,以 ...

最新文章

  1. JavaScript学习系列6 充实文档的内容
  2. Python学习六大路线,教你快速上手
  3. 走近TCP/IP协议
  4. 网络营销外包——网络营销外包前关键词排名反超首页的原因在哪里
  5. 倒计时小工具_这款高颜值的 APP 可以让小仙女/男神们的日子过得更精致
  6. iphone图片等比缩放
  7. Flink : Flink run yarn 报错 could not build the program from jar file -ynm
  8. jsp 页面实现增减行
  9. 数据结构:B树和B+树的插入、删除图文详解
  10. 安卓手机qq怎么看密友值_qq密友值在哪看
  11. my97Date如何多选日期且无重复日期
  12. hive教程:启动hive客户端
  13. 4k电视测试软件准确吗,如何检测自家的电视是真4K还是假4K?当贝市场告诉你
  14. 个性化推荐算法(推荐系统)概要
  15. 浏览器阻挡cookies_如何在任何浏览器中阻止Cookies(除了您使用的网站外) | MOS86...
  16. 56: Recv failure: Connection was reset和55错误解决办法
  17. TensorFlow实践四步法
  18. VBox 虚拟机完美迁移/复制(带快照)
  19. python图标中文_解决python中matplotlib中文乱码 for Mac
  20. Ubuntu上安装QQ,无法显示图片和头像

热门文章

  1. MIT 6.S965 韩松课程 05
  2. python并发编程之semaphore(信号量)_python 之 并发编程(守护进程、互斥锁、IPC通信机制)...
  3. 支付宝支付API之签名与验签
  4. 前端面试技巧和注意事项_前端HR的面试套路,你懂几个?
  5. 经济学硕士读计算机博士,去美国那些大学攻读经济学博士比较好?看完你就清楚了...
  6. 强化学习 Sarsa 实战GYM下的CliffWalking爬悬崖游戏
  7. GILT市场方兴未艾
  8. 在线html编辑器---htmlarea 附件,在线HTML编辑器htmlarea简单使用
  9. Meta分析和网状Meta分析速成班( 2019年12月28-29日 上海)
  10. 帆软报表在已经搭载服务器上开发_报表案例_数据报表开发_做报表的步骤_报表开发流程-帆软...