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

关于stm32F4CAN总线调试

[复制链接]
STMCU小助手 发布时间:2022-12-15 13:31
关于CAN总线仲裁问题
1. 硬件配置

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

2 芯片CAN初始化
系统时钟配置使用cubeMX进行配置,按照最大时钟速度进行配置,can系统时钟频率为50MHz

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

20210517155943669.png


这篇文章提到 1Mbps的仲裁比特率,8Mbps的数据比特率。
也就是说不是所有时钟都可以有仲裁功能,can时钟越低,总线仲裁成功率越高。
后来,我将stm32F4的can总线时钟改成125kHz,两台设备对着发送,数据就不会相互冲突

2021051716050556.png

电平略高的是用TJF1051T/3的接口芯片发送的,连续发送3组数据
电平略低的是用SN65HVD230DR的接口芯片发送的,连续发送3组数据
从波形上看,2对数据在can总线上,数据相互穿插,可以表明stm32f4芯片互相之间可以有效的进行仲裁

  1.   /* USER CODE END CAN1_Init 1 */
  2.   hcan1.Instance = CAN1;
  3.   hcan1.Init.Prescaler = 25;
  4.   hcan1.Init.Mode = CAN_MODE_NORMAL;
  5.   hcan1.Init.SyncJumpWidth = CAN_SJW_1TQ;//CAN的时钟配置为 125kHz
  6.   hcan1.Init.TimeSeg1 = CAN_BS1_13TQ;
  7.   hcan1.Init.TimeSeg2 = CAN_BS2_2TQ;
  8.   hcan1.Init.TimeTriggeredMode = DISABLE;//启用或禁用时间触发的通信模式
  9.   hcan1.Init.AutoBusOff = DISABLE;//总线自动关闭
  10.   hcan1.Init.AutoWakeUp = DISABLE;//启用或禁用自动唤醒模式
  11.   hcan1.Init.AutoRetransmission = ENABLE;//启动自动重传模式
  12.   hcan1.Init.ReceiveFifoLocked = DISABLE;//启用或禁用接收FIFO锁定模式
  13.   hcan1.Init.TransmitFifoPriority = DISABLE;//启用或禁用传输FIFO优先级
  14.   if (HAL_CAN_Init(&hcan1) != HAL_OK)
  15.   {
  16.     Error_Handler();
  17.   }
  18.   /* USER CODE BEGIN CAN1_Init 2 */
复制代码



3. 启动总线错误中断
如果不启动总线错误中断,有可能出现错误,通过函数查不到相应的错误
  1. HAL_CAN_ActivateNotification(&hcan1,CAN_IT_ERROR_WARNING);
  2. HAL_CAN_ActivateNotification(&hcan1,CAN_IT_ERROR_PASSIVE);
  3. HAL_CAN_ActivateNotification(&hcan1,CAN_IT_BUSOFF);
  4. HAL_CAN_ActivateNotification(&hcan1,CAN_IT_LAST_ERROR_CODE);
  5. HAL_CAN_ActivateNotification(&hcan1,CAN_IT_ERROR);
复制代码

4当总线出现故障后,系统内部复位错误,修复故障方法
  1. bCANGetError = HAL_CAN_GetError(&hcan1);//查询can错误代码
  2. bCanGetState = HAL_CAN_GetState(&hcan1);       
  3. if( bCANGetError!=0 )  //当系统出现错误,错误修复
  4. {
  5.                 HAL_CAN_ResetError(&hcan1);
  6. }       
复制代码


5. 发送代码

  1. CAN_TxHeaderTypeDef   TxHeader;//发送配置结构体
  2. TxHeader.StdId = 0x121;//标准帧地址
  3. TxHeader.ExtId = 0x01;//扩展帧发送地址
  4. TxHeader.RTR = CAN_RTR_DATA;//发送数据
  5. TxHeader.IDE = CAN_ID_EXT;//扩展帧
  6. TxHeader.DLC = 8;//发送8个字节数据
  7. TxHeader.TransmitGlobalTime = DISABLE;        //启动时间戳 ENABLE DISABLE        

  8. for(;HAL_CAN_GetTxMailboxesFreeLevel(&hcan1)==0;);//检查发送邮箱是否有空闲
  9. TxHeader.ExtId = 0x100001;//扩展帧地址
  10. bCAN_Tx = HAL_CAN_AddTxMessage(&hcan1, &TxHeader, TxData, &TxMailbox);//发送
  11. __nop();

  12. for(;HAL_CAN_GetTxMailboxesFreeLevel(&hcan1)==0;);//检查发送邮箱是否有空闲
  13. TxHeader.ExtId = 0x100002;//扩展帧地址
  14. bCANGetError = HAL_CAN_AddTxMessage(&hcan1, &TxHeader, TxData, &TxMailbox);//发送
  15. __nop();

  16. for(;HAL_CAN_GetTxMailboxesFreeLevel(&hcan1)==0;);//检查发送邮箱是否有空闲
  17. TxHeader.ExtId = 0x100003;//扩展帧地址
  18. bCANGetError = HAL_CAN_AddTxMessage(&hcan1, &TxHeader, TxData, &TxMailbox);//发送
  19. __nop();
复制代码


6. 关于can接口芯片的问题
当使用两种不同电压的接口芯片,会出现杂波
一种是TJF1051T/3的接口芯片,5v CAN接口芯片
一种是SN65HVD230DR的接口芯片,3.3v CAN接口芯片

20210517163146962.png

当使用同一种接口芯片TJF1051T/3

20210517163328853.png

从波形上看,杂波明显消失
虽然可以同时使用5v或者3.3v的can接口芯片,但是使用5v的接口芯片,杂波明显消失
————————————————
版权声明:xyang18


收藏 评论0 发布时间:2022-12-15 13:31

举报

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