STM32G431xxxx系列CAN通信(三)

一、TJA1042T/3-CAN通信硬件连接

图1-1 CAN通信原理图

TJA1042T/3芯片有休眠模式,可以通过中断(低电平)唤醒,因此其STB和RXD引脚上通过上拉电阻接高电平,CAN_EN和CAN_RX引脚在MCU端是接在一起的,这样当CAN_RX引脚有显性电平时,会将STB引脚拉低,此芯片就从休眠模式进入正常模式。

C4的作用为降低差模干扰,稳定隐性电平,其值选择0.1uF最合适,可由下面几幅图片对比得到。
(本设计选用的CAN收发器需要5V供电,为了方便,也可以选择3.3V供电的SIT3051TK。)

图1-2 电容值对CAN波形的影响图

从上面四幅图可以看出,只有电容取为100nF时,CANH和CANL的波形是对称的,即两线电平变化幅度和速率相等。

R2、R6两个电阻起到限制瞬间电流的作用,可以提高防护能力。DT5起到抑制瞬间高电压的作用,与DT1组合起来实现差模、共模的防浪涌和静电。

最后的两个自恢复保险丝起到高压防护的作用,选择F1206的封装即可。

二、STM32F407ZGT6的CAN通信发送

Step1:在STM32CubeMX里生成基本函数(较简单,不再赘述);

Step2:在main.c函数里,while(1)函数的上方,调用Start函数启动CAN通信;

图2-1 开启CAN通信

Step3:在main.c函数如下图所示的位置,封装发送函数;

图2-2 封装发送函数

发送函数的参量为需要发送的数组名称(已指针形式表示)和数组长度,并在此函数中定义发送头结构体和发送邮箱序号,本例选择扩展ID、数据段、不开启时间戳;调用HAL库中的HAL_CAN_AddTxMessage()函数将要发送的消息添加到发送邮箱里;

Step4:在while(1)函数里调用上述发送函数并每间隔1s发送一次;

图2-3 调用发送函数

Step5:CAN上位机调试;

图2-4 调试结果

由上图可知,上位机接收到的ID为91 A0 56 78,这与发送的0x12345678不太一样,1234为高16位,5678位低16位。低16位5678没有变化,变得是高16位的1234,由图2-5可以解释:

图2-5 ID转换

扩展ID共11+18=29位,再加上SSR、IDE和RTR三位,总共32位,因此上述0x1~8换成二进制后,低16位5678不变和高16位的最后两位组成18位扩展ID,而剩余高14位往左移3位得到11位标准ID,然后中间再补三个0(不知道是前面的0直接拿过来还是直接补0还是根据SSR那三位去补);再例如标准ID0x123为12位ID,而标准ID只有11位,所以其会左移一位得到11位标准ID,然后再在后面补5个0凑成两个字节。

图2-6 上位机中的CAN表示

三、STM32F407ZGT6的CAN通信接收

Step1:在STM32CubeMX里生成基本函数,主要是打开激活CAN1然后打开CAN1的中断,此例子CAN1 RX0和CAN1 RX1两个中断都打开了,之后打开USART1,以便于将STM32接收到的数据用串口输出到PC端的串口助手上;

Step2:在Keil中封装函数用来初始化过滤器;

图3-1 定义过滤器初始化结构体

定义初始化结构体,此例中用0号过滤器、掩码模式、32位ID、FIFO0接收、所有ID都通过,最后再调用HAL_CAN_ConfigFilter()来启动上述配置。

Step3:

图3-2 初始化+启动+开启中断

在while(1)函数上方调用Step2里的过滤器初始化函数,然后开启CAN通信,最后开启CAN通信的接收中断功能。

Step4:在滤波器初始化函数下方定义回调函数;

图3-3 定义回调函数

在CAN接收消息请求回调函数里定义接收的头、接收数组,然后判断是否为CAN1收到的数据,再调用消息接收函数将上位机发来的消息存入FIFO0中,将消息中的数据存入接收数组中,最后用串口将收到的数据发送给串口助手,Header.DLC是接收到的数据的长度。

Step5:实验;

图3-4 实验结果

用上位机发送4567,左侧的串口助手里显示4567。

Step6:打印接收到的数据的ID;

图3-5 完善回调函数

由于接收数据的ID是字符串,所以要定义成char型,在这之前要包含<string.h>和<stdio.h>两个头文件,再在回调函数中定义64位的字符串,通过spring()函数将其以16进制的形式打印出来,再通过串口发送到串口助手。

Step7:串口助手显示ID;

图3-6 串口助手显示ID

在上位机设置ID为97654321,串口助手显示的ID为30 78 31 30 65 64 34 33 32 30 20 20 20,以16进制显示就是0x10ed4320,这与前面第五节后面的上位机ID顺序有关,第五节里左侧14位ID左移3位,在后面补三个0,而此处ID应该右移3位,在前面补3个0,如图3-7所示:

图3-7 ID移位
作者:Star Watcher

物联沃分享整理
物联沃-IOTWORD物联网 » STM32G431xxxx系列CAN通信(三)

发表回复