STM32-CAN通讯与编程

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/zhandouhu/article/details/88423647

一、can通信介绍

1、基本概念:CAN 是Controller Area Network 的缩写(以下称为CAN),是ISO国际标准化的串行通信协议。在汽车产业中,出于对安全性、舒适性、方便性、低公害、低成本的要求,各种各样的电子控制系统被开发了出来。
2、CAN总线物理特性:CAN bus两根信号线分别叫CANH 和CANL,如果CANH电平 大于 CANL 为 Dominant (显性电平) 其实表示的是信号 0 ;如果CANH电平 等于 CANL 为 Recessive (隐形电平) 其实表示的是信号 1。
芯片5V供电时输出0时CANH 和 CANL输出电压大致为 3.5V和1.5V,当输出为1时 两根线就是浮地的高阻状态,通过外界的端接电阻将电压拉到相等大致为2.5V
在这里插入图片描述
3、协议标准:CAN协议经过ISO标准化后有两个标准:IS011898标准和IS011519-2标准。其中IS011898是针对通信速率为125Kbps-1Mbps的高速通信标准,而IS011519-2是针对通信速率为125Kbps以下的低速通信标准。
4、参数:通信速率最高可达1Mbps,通信距离最远可达10KM,传输距离与速率的一般关系如下:
在这里插入图片描述
5、对比:CAN通信相比于串口通信、SPI通信、IIC通信,功能和高干扰能力要更强一些;与485总线有些类似,都是2线制的差分形式;但相比而言,CAN总线的数据通信具有更好的可靠性、实时性和灵活性。CAN已经形成国际标准,并已被公认为几种最有前途的现场总线之一。
在这里插入图片描述

二、CAN通讯编程

1、目的:本次实验主要实现MCU(stm32F103)与BMS的CAN通讯功能,然后根据BMS的通讯协议文档解析当前BMS的状态。
2、编程思路:参考STM32的CAN例程基础上,1)根据BMS通讯要求更改初始化参数;2)CAN接收后进行BMS状态解析。
3、编程实现
(1)CAN总线波特率设置
CAN通讯的一个位可分为 4 段:同步段(SS)、传播时间段(PTS)、相位缓冲段1(PBS1)、相位缓冲段2(PBS2);STM32把传播时间段和相位缓冲段1(STM32称之为时间段1)合并了,所以STM32的CAN一个位只有3段:同步段(SYNC_SEG)、时间段1(BS1)和时间段2(BS2)。
通过设定位时序,多个单元可同时采样,也可任意设定采样点。比如设置TS1=9、TS2=8,SYNC_SEG=1和BRP=8,在APB1频率为36Mhz的条件下,即可得到CAN通信的波特率=36000/[(9+8+1)*8]=250Kbps。

	    CAN_InitStructure.CAN_TTCM=DISABLE;         //没有使能时间触发模式
	    CAN_InitStructure.CAN_ABOM=DISABLE;         //没有使能自动离线管理
	    CAN_InitStructure.CAN_AWUM=DISABLE;         //没有使能自动唤醒模式
	    CAN_InitStructure.CAN_NART=ENABLE;         //禁止报文自动传送
	    CAN_InitStructure.CAN_RFLM=DISABLE;         //没有使能接收FIFO锁定模式
	    CAN_InitStructure.CAN_TXFP=DISABLE;         //没有使能发送FIFO优先级
	    CAN_InitStructure.CAN_Mode=CAN_Mode_Normal; //CAN设置为正常模式
	    CAN_InitStructure.CAN_SJW=CAN_SJW_1tq;      //重新同步跳跃宽度1个时间单位
	    CAN_InitStructure.CAN_BS1=CAN_BS1_9tq;      //时间段1为9个时间单位
	    CAN_InitStructure.CAN_BS2=CAN_BS2_8tq;      //时间段2为8个时间单位
	    CAN_InitStructure.CAN_Prescaler=8;        //时间单位长度为8 
        CAN_Init(CAN1,&CAN_InitStructure);         

(2)滤波器和屏蔽
参考:https://blog.csdn.net/jixiangrurui/article/details/39370027
(3)接收:采用中断方式

void USB_LP_CAN1_RX0_IRQHandler(void)
{
	  		CanRxMsg RxMessage;
			double i=0;
	   		 CAN_Receive(CAN1, 0, &RxMessage);
			if(RxMessage.ExtId==xxxx){
			///解析代码
}

三、结果与总结
1、实验结果
BMS电池数据测量值如下,与预期相同
在这里插入图片描述
2、总结:
(1)调试方法:按照单STM32回环测试–>双STM32功能测试–>STM32与BMS通讯测试
(2)滤波器和屏蔽配置时,可以先不进行屏蔽,在接收中断中进行筛选;功能调通后,后续再根据需求进行设置。

猜你喜欢

转载自blog.csdn.net/zhandouhu/article/details/88423647