关于stm32F4CAN总线调试

关于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的时钟配置为 125kHz
  hcan1.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的接口芯片,杂波明显消失
  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
125kHZ低频读卡器功能概述: 本资源中包含读卡器原理图及PCB文件、读卡器源程序和电脑端上位机源程序。读卡器可以直接制作使用,可以使用附件中的上位机与读卡器进行通信,控制读卡器对T5557类卡片进行读写操作。对T5557卡片的配置必须为(RF/32,曼侧斯特编码),这也是国内T5557卡的常用配置。要对其他配置的T5557卡片或其他低频卡片(EM4305类和EMID卡片)进行读写,硬件上是支持的,只需根据卡片文档修改读卡器源程序,下载更新便可。为方便程序更新,硬件电路上已经实现自动下载,使用串口下载程序时无需手动设置BOOT0和BOOT1。 应用场景: 低频RFID主要用在短距离、低成本的应用中,如门禁控制、校园卡、煤气表、水表等。 在相关领域的开发中,可以使用该读卡器作为前台管理的设备,对客户卡进行管理。也可以将读卡器改成终端设备,如RFID门锁上的读卡器,用来验证卡片信息并控制门锁;或煤气表、水表上的读卡器,根据卡片内的余量信息控制煤气和水的供应。另外,也可以作为学习曼彻斯特解码的学习工具。 设计思路: 使用STM32F103R8T6输出125kHZ的PWM信号作为载波信号,将信号输入到功率放大电路,在线圈上产生125kHZ的正弦信号。T5557卡片从125kHZ信号中获取能量和控制命令,并根据命令将要传回的信息使用曼彻斯特编码对载波信号进行调制。读卡器端的检波电路和滤波放大电路将被调制信号提取处理成单片机能识别的数字信号,输入到STM32F103R8T6的输入捕获功能引脚,再通过STM32F103R8T6将捕获的信号进行曼彻斯特解码,最后将解码信息根据自己设定的通讯协议进行数据打包,发送到电脑上位机。 系统框图: 硬件平台: 1.主控制器:STM32F103R8T6 2.USB转TTL:CH340G 3.模拟电路:LM358 AMS1117-3.3V 125kHZ谐振线圈(345UH线圈搭配4700PF电容)谐振频率在线计算工具 4.蜂鸣器: 3V供电 软件平台: 开发工具:Keil uVision5 上位机编写工具:Microsoft Visual C# 学习版 成本估算: 芯片询价和在线购买链接https://www.bom2buy.com/元器件估算价格约为30元 项目进度: 1.能对AT5557/55567/5577卡片(配置为RF/32,曼彻斯特编码)进行整页读,密码读和密码写操作; 2.有相应的上位机,方便读写指令的发送和数据解读; 3.上位机与读卡器之间通讯加入了数据校验,提高了通讯的可靠性。 未来更新: 1.加入EM4305类和EMID卡片的读写功能; 2.加上触摸显示屏和电池,做成便携版 3.做成袖珍版,加入与手机通讯的接口(OTG或蓝牙)

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值