关于CAN总线仲裁问题

1. 硬件配置

单片机 stm32F412ret6
CAN接口芯片 SN65HVD230DR
外部晶振 8M

2 芯片CAN初始化

系统时钟配置使用cubeMX进行配置,按照最大时钟速度进行配置,can系统时钟频率为50MHz

重点:

之前can速率使用250kHz,两台设备对着发送数据,总线仲裁总是出现问题
后来看过一篇MCP2517的文章

  • 这篇文章提到 1Mbps的仲裁比特率,8Mbps的数据比特率。
  • 也就是说不是所有时钟都可以有仲裁功能,can时钟越低,总线仲裁成功率越高。
  • 后来,我将stm32F4的can总线时钟改成125kHz,两台设备对着发送,数据就不会相互冲突
  • 电平略高的是用TJF1051T/3的接口芯片发送的,连续发送3组数据
  • 电平略低的是用SN65HVD230DR的接口芯片发送的,连续发送3组数据
  • 从波形上看,2对数据在can总线上,数据相互穿插,可以表明stm32f4芯片互相之间可以有效的进行仲裁
  /* USER CODE END CAN1_Init 1 */hcan1.Instance = CAN1;hcan1.Init.Prescaler = 25;hcan1.Init.Mode = CAN_MODE_NORMAL;hcan1.Init.SyncJumpWidth = CAN_SJW_1TQ;//CAN的时钟配置为 125kHzhcan1.Init.TimeSeg1 = CAN_BS1_13TQ;hcan1.Init.TimeSeg2 = CAN_BS2_2TQ;hcan1.Init.TimeTriggeredMode = DISABLE;//启用或禁用时间触发的通信模式hcan1.Init.AutoBusOff = DISABLE;//总线自动关闭hcan1.Init.AutoWakeUp = DISABLE;//启用或禁用自动唤醒模式hcan1.Init.AutoRetransmission = ENABLE;//启动自动重传模式hcan1.Init.ReceiveFifoLocked = DISABLE;//启用或禁用接收FIFO锁定模式hcan1.Init.TransmitFifoPriority = DISABLE;//启用或禁用传输FIFO优先级if (HAL_CAN_Init(&hcan1) != HAL_OK){Error_Handler();}/* USER CODE BEGIN CAN1_Init 2 */

3. 启动总线错误中断

如果不启动总线错误中断,有可能出现错误,通过函数查不到相应的错误

 HAL_CAN_ActivateNotification(&hcan1,CAN_IT_ERROR_WARNING);HAL_CAN_ActivateNotification(&hcan1,CAN_IT_ERROR_PASSIVE);HAL_CAN_ActivateNotification(&hcan1,CAN_IT_BUSOFF);HAL_CAN_ActivateNotification(&hcan1,CAN_IT_LAST_ERROR_CODE);HAL_CAN_ActivateNotification(&hcan1,CAN_IT_ERROR);

4当总线出现故障后,系统内部复位错误,修复故障方法

bCANGetError = HAL_CAN_GetError(&hcan1);//查询can错误代码
bCanGetState = HAL_CAN_GetState(&hcan1);
if( bCANGetError!=0 )  //当系统出现错误,错误修复
{HAL_CAN_ResetError(&hcan1);
}

5. 发送代码

CAN_TxHeaderTypeDef   TxHeader;//发送配置结构体
TxHeader.StdId = 0x121;//标准帧地址
TxHeader.ExtId = 0x01;//扩展帧发送地址
TxHeader.RTR = CAN_RTR_DATA;//发送数据
TxHeader.IDE = CAN_ID_EXT;//扩展帧
TxHeader.DLC = 8;//发送8个字节数据
TxHeader.TransmitGlobalTime = DISABLE; //启动时间戳 ENABLE DISABLE        for(;HAL_CAN_GetTxMailboxesFreeLevel(&hcan1)==0;);//检查发送邮箱是否有空闲
TxHeader.ExtId = 0x100001;//扩展帧地址
bCAN_Tx = HAL_CAN_AddTxMessage(&hcan1, &TxHeader, TxData, &TxMailbox);//发送
__nop();for(;HAL_CAN_GetTxMailboxesFreeLevel(&hcan1)==0;);//检查发送邮箱是否有空闲
TxHeader.ExtId = 0x100002;//扩展帧地址
bCANGetError = HAL_CAN_AddTxMessage(&hcan1, &TxHeader, TxData, &TxMailbox);//发送
__nop();for(;HAL_CAN_GetTxMailboxesFreeLevel(&hcan1)==0;);//检查发送邮箱是否有空闲
TxHeader.ExtId = 0x100003;//扩展帧地址
bCANGetError = HAL_CAN_AddTxMessage(&hcan1, &TxHeader, TxData, &TxMailbox);//发送
__nop();

6. 关于can接口芯片的问题

  • 当使用两种不同电压的接口芯片,会出现杂波
  • 一种是TJF1051T/3的接口芯片,5v CAN接口芯片
  • 一种是SN65HVD230DR的接口芯片,3.3v CAN接口芯片
  • 当使用同一种接口芯片TJF1051T/3
  • 从波形上看,杂波明显消失
  • 虽然可以同时使用5v或者3.3v的can接口芯片,但是使用5v的接口芯片,杂波明显消失

关于stm32F4CAN总线调试相关推荐

  1. STM32的CAN总线调试经验分享

    相关文章 CAN总线简易入门教程 CAN总线显性电平和隐性电平详解 STM32的CAN总线调试经验分享 文章目录 相关文章 背景 CAN总线 CAN控制器 CAN收发器 调试过程 硬件排查 CAN分析 ...

  2. RS485总线调试记录

    1.现象 PLC与通信模块(简称CB)通过485通信(9600,1bit停止,无校验),PLC发送查询报文,CB应答.在调试过程中发现CB无应答,再加入一台PC设备监视总线报文.总线上共3台设备,无终 ...

  3. 数字音频接口(二) 高通平台MI2S总线调试

    硬件平台:高通SM6125 基线代码:LA.UM.8.11.1.c1 git clone https://git.codelinaro.org/clo/la/platform/vendor/opens ...

  4. 485总线调试问题总结

    不同的芯片可以支持的节点数不同,MAX3085支持256个节点,MAX487支持128个节点. 一.项目内容 十通道MCU的工装利用UM3085E(英联)芯片,通过485总线与PC进行通信.设计两种通 ...

  5. FPGAi2c总线调试M24LC04B

    以M24LC04B作为测试模型验证I2C总线时,应注意M24LC04B地址为000~1FF,它是8位地址线器件,如果需要访问全部地址需要在器件地址处补一位,不能使用2字节的i2c总线,仿真结果会出现错 ...

  6. AT24C02 IIC总线调试记录

    周末在家调AT24C02,分享一下调试记录,给有需要的人参考一下: 刚开始的时候读出来的数据全部都是0x00:正常新的EEPROM里面的数据没有初始化的都是0xFF: 刚开始怀疑是AT24C02坏了, ...

  7. keil spi 调试_单片机软件出问题了?有经验的工程师这么调试

    单片机软件调试方法有很多,今天我们来看一看都有哪些值得大家学习的调试方法. 欢迎关注哈,有搞单片机的北漂吗,来抱团取暖吧,关注私信入群 一.一切跟着手册走 单片机本身就是要驱动各类传感器,软件都是跑在 ...

  8. linux脚本ipddr.sh 是什么,MTK DDR调试

    1. 获取 flash id: 硬件信息:通过这个节点可以知道当前flash的id,上层根据id找到对应的flash名字. cat /sys/block/mmcblk0/device/cid \ker ...

  9. ARM调试原理【调试接口框图】【SWD时序】【SWD主机】

    调试接口框图 ARM-M0<ARM Cortex-M0.pdf>手册上提到的调试框图如下: <debug_interface_v6_0_architecture_specificat ...

最新文章

  1. 我是如何做软件测试项目的?
  2. Python 之Re模块(正则表达式)
  3. Eclipse中CVS版本管理
  4. 为你的集成需求选择合适的ESB
  5. mysql aa复制_MySQL的复制架构与优化
  6. MGraph图(代码、分析、汇编)
  7. java 怎么用 string method return数量_java教程之Map应该怎么用
  8. 将5350 i2c clk设置为gpio 中断模式的方法
  9. 第一次执行时没有问题,重复执行会出错、GP循环
  10. DPM灾难切换应用场景
  11. attachEvent 与 addEventListener的使用
  12. 怎样正确的理解和解决 ORA-01843:not a valid month
  13. mysql中mapping标签的作用_3种高效的Tags标签系统数据库设计方案分享
  14. 统计github本地仓库的代码行数
  15. 服务器硬盘数据备份到nas,群晖NAS教程第五节:如何备份 Synology NAS
  16. c语言保留三位小数用float,float保留三位小数
  17. java 制作简历_个人简历java制作.doc
  18. Idea中使用maven命令
  19. 用ffmpeg将mp3转为wav
  20. linux命令大全 load,linux命令TOP参数load average详解[转]

热门文章

  1. 代码艺术~优雅的编程字体及对字体的感觉
  2. emacs for windows
  3. go gin提交form表单请求
  4. k8s 通用的java项目迁移流程
  5. Cloudera Enterprise 试用版 6.3.1查看cloudrea的许可证---可用期限
  6. azkaban修改MySQL配置上传包的大小上限
  7. K8S部署工具:KubeOperator安装部署
  8. Go gin获取post请求数据
  9. kube-controller-manager 配置参数解读
  10. k8s部署mysql集群(statefulset):主写从读、一主多从集群