【BAT32A237-使用硬件CAN接口实现控制IS32FL3265A功率器件-DSView逻辑分析抓取波形CAN步骤-底层波形认识CAN-A3-2025/4/02】

提示:本内容仅供学习,切勿商用!

上节课,咱们已经简单学习了配置外部晶振方法,接着讲IS器件控制LED的流水、颜色编程!本文主要介绍中微BAT32A237系列单片机CAN原理(通过实验现象来完成)、用逻辑分析仪来分析CAN波形、掌握硬件CAN接口传输速率计算方法

本人只是一个普通的嵌入式低级(初级)玩家,文章主要针对新手,所以大佬要是发现文中有何不妥之处,还请口下留情,若能指出,我一定虚心改正。


前言

在这里插入图片描述

理论知识:趋近于完美的通讯 CAN总线!4分钟看懂!
理论知识还是很重要的,如若忘记了,请回顾看一下!

学习单片机,要对单片机通信知识浅浅了解一下,需要学习一下此链接:
1.浅谈单片机通信,化繁为简UART、I2C、SPI学习全家桶,你值得拥有!
2.串口通信————UART、I2C、SPI详解(总结篇)
3.CAN总线入门教程-全面细致 面包板教学 多机通信

小结
1.你必须掌握:串行和并行的区别,半双工和全双工的区别,异步和同步的区别
2.你首要任务:通过基础知识拿起笔来分析UART、I2C、SPI是串行还是并行,是半双工还是全双工,是异步还是同步?
注意:在单片机中,数据传输一位数据是bit,传输一个数据是Byte!

温馨提示:关于单工,这里不常用,暂不讨论,其次关于UART、I2C、SPI通信你没有学过,也不必担心!你脑子里有大概了解就行。接下来,我会讲解CAN通信的知识。


一、时钟发生电路分析【重点】

请下载此芯片的用户手册:中微半导-BAT32A237用户手册
先不要着急看下图,先回顾相关知识点:
1.【BAT32G113-时钟发生电路控制LED时长-A5-2025/3/17】
2.【硬件干货】电脑的心脏——时钟神马情况?石英晶体为啥能够振起来
3.【单片机的心脏】时钟振荡部分

在这里插入图片描述
根据上图的时钟发生电路框图,你看过之后,可能有一点点蒙,你先回顾此篇文章:
1.【BAT32A237-使用硬件I2C接口实现控制IS32FL3265A功率器件-A2-2025/3/31】

通过回顾之前的文章,你对I2C与CAN的理论知识是有一定的了解,按照这个思路(来分析CAN),不过这里你最关心的问题如下:
1.根据已知时钟发生电路框图的12Mhz晶体振荡器,通过官方的API,怎么配置CAN的传输速率?
2.配置的CAN传输速率的计算方法是什么,通过逻辑分析仪怎么验证?

二、你最关心的问题

在这之前,我们必须了解CAN知识:
1.CAN通信理论知识:由于CAN通信是串行、半双工、异步,所以时钟线是没有的,数据是一位一位发送的,且不能同时收发!
2.CAN通信硬件知识:由于单片机是集成了硬件CAN接口(也就是CAN控制器),CAN控制器只能发送TTL电平。由于CAN通信传输信号是差分信号,所以必须用到CAN收发器模块!
3.使用标准帧和扩展帧来实现接收和发送
4.1个通道有16 个报文缓存
5.接收/发送历史列表功能
6.自动块传输功能
7.多缓存接收块功能
8.每个通道四种模式的屏蔽设置
注意:CAN_H和CAN_L是需要上拉电阻的,且无须共地!除此之外,根据项目的复杂层度,决定了CAN通信需要采用哪些功能来实现!

单片机内部CAN控制器电路框图:

在这里插入图片描述
CAN控制器由下面四个模块组成
(1) 交互:这个模块提供内部的交互总线,在CAN模块和主机之间发送和接收信号.
(2) 内存控制模块(MCM):此功能块控制对 CAN 协议层和 CAN 模块中的 CAN RAM 的访问。
(3) CAN协议层:此功能块涉及 CAN 协议的操作及其相关设置。
(4) CAN RAM:这是 CAN 内存功能块,用于存储报文ID、报文数据等。

这里,得补充一下CAN总线有多种通信模式知识:

1.标准 CAN(ISO 11898-2):125 kbps ~ 1 Mbps(1 Mbps 时≤40 米,500 kbps 时≤100 米)。
2.低速 CAN(ISO 11898-3):10 kbps ~ 125 kbps

前面提到用了外部时钟12Mhz,FCLK的值为12Mhz。现在,需要知道CAN的传输速率计算思路是什么?

在这前提,我们得知道传输一个数据是由哪些组成的!
下面讲到的是CAN 控制器负责实现 CAN 协议相关功能,数据位时间的划分(同步段、传播段、相位段 1、相位段 2 )是 CAN 协议中关于位时序控制的关键部分 。

在这里插入图片描述
通过对比,查阅数据手册得知:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

整体构成

数据位时间(DBT)由四个部分组成:
同步段:用于使总线上不同节点的时钟信号同步。当节点检测到总线上信号的跳变沿时,通过同步段来调整自身时钟,使其与总线时钟保持一致,确保数据接收和发送的时序准确性。
传播段:主要用于补偿信号在总线上传播时产生的延迟。由于 CAN 总线中各节点之间存在一定距离,信号从发送节点传输到接收节点会有时间延迟,传播段就是为了弥补这个延迟带来的时间差。
相位段 1(TSEG1):也叫时间段 1 。它在同步段和采样点之间,用于吸收信号的相位误差,保证采样点能准确采集到数据信号。其长度可通过相关寄存器进行配置。
相位段 2(TSEG2):即时间段 2 。在采样点之后,同样用于补偿相位误差,进一步确保数据采样的准确性。其长度也可通过寄存器配置。

关键时间点

采样点(SPT):位于相位段 1 和相位段 2 之间,是节点对总线上数据进行采样读取的时刻。采样点的位置非常关键,合适的采样点位置能保证节点准确读取总线上传输的数据,避免因信号干扰或时序偏差导致数据读取错误。

配置CAN控制器传输数据位的波特率值方法:
/**************可更换值*********************
Fclk = 12 MHz
Prescaler = 3
***************************************/

/**************根据上面图的信息得到,固定不变值*********************
Sync Seg = 1 TQ
Prop Seg = 2 TQ
Phase Seg1 = 3 TQ
Phase Seg2 = 2 TQ
Bit Time = 1 + 2 + 3 + 2 = 8 TQ
***************************************/

根据‘可更换值和固定不变值’,计算公式如下:
波特率 = 12 MHz / (3 * 8 TQ) = 12,000,000 / 24 = 500,000 bps (或500Kbps)
小试牛刀:我想在想把CAN的传输速率设置为1Mbps,该如何配置?

温馨提示:
得知波特率为500Kbits/s,位时间= 1s/位速率 = 1s/500 000bits/s) =2us
也即是说2us进行一次变化的电平,进行500K次总计1s。
说到设置500K波特率,位时间为2us。
那500K的标准CAN格式报文的长度位数为44~108位,位时间为2us。
根据自己所配置的数据段,可以计算出一个标准的CAN报文所需要的时间=位长度*位时间=108*2=216us。

在这里插入图片描述
从图可知,在数据场64个bit中,1个bit位为2us,则说明CAN的传输速率为500Kbps!(这个是一个技巧)具体原理是数据场 0x55(二进制 01010101)无连续 5 个相同 bit,无需填充,测量单个 bit 的时间可直接得到波特率

这里采用的是虚拟软件进行操作的,需要对应的硬件支持才行,具体操作参考链接:【DSView逻辑分析抓取波形CAN步骤-硬件连接-数据解析-底层波形认识CAN-工具使用】

	/*****************根据上图,给出Demo***************************************/
	uint8_t TxData[8] = {0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55};//采用这个主要是为了用示波器来算出CAN总线上的波特率是多少


	CANInitStruct.ClockDivider = GMCS_DIV1;//12M/1 不用管
	CANInitStruct.BitRatePrescaler = TQPRS(3);//fcanmod/3  用户可更改值
	CANInitStruct.BitRate = SJW_1TQ|TSEG2_2TQ|TSEG1_5TQ;//500Kbps	Baud = Fclk/8/(C0GMCS+1)/(C0BRP+1),固定值
	
	void CAN_Transmit_Data(void)
	{	
			Msg_Init_Clr(&Msg_Init_buff[0]);
			Msg_Init_buff[0].Mode = CAN_TXMODE;
			Msg_Init_buff[0].Ie = 0;//disable transmit interrupt
			Msg_Init_buff[0].Id = 0x150;//ID
			Msg_Init_buff[0].Dlc = 8;//Data Length
			Msg_Init_buff[0].Msgbuff[0] = TxData[0];
			Msg_Init_buff[0].Msgbuff[1] = TxData[1];
			Msg_Init_buff[0].Msgbuff[2] = TxData[2];
			Msg_Init_buff[0].Msgbuff[3] = TxData[3];
			Msg_Init_buff[0].Msgbuff[4] = TxData[4];
			Msg_Init_buff[0].Msgbuff[5] = TxData[5];
			Msg_Init_buff[0].Msgbuff[6] = TxData[6];
			Msg_Init_buff[0].Msgbuff[7] = TxData[7];
			Transmit_MSGBuffer(CAN0MSG00,&Msg_Init_buff[0]);//该函数发送消息缓冲区0
	}

这是官方的Demo板:

在这里插入图片描述

环境搭建:

在这里插入图片描述
通过上位机来控制下位机状态,其中Demo板是在扫描上位机是否发正确的数据,如ID和DATA正确,则单片机会控制LED灯状态!
其他思考:
1.单片机可以配置多个ID来接收上位机不同指令,从而控制不同LED指示灯的状态么?
2.如果可以,最大能配置多少个ID?其中,配置的过程需要注意哪些,完整流程是什么?

答案:通过Debug,可以查看CAN0,可以配置多少FIFO接收邮箱,显然是十六个同时可以查看里面的值!这里不过多介绍!

在这里插入图片描述

接收邮箱FIFO部分代码展示:

//-----------------------------------------------------------------------	
//CAN Receive Message buffer initialize
//-----------------------------------------------------------------------	
	MsgRec_Clr(can0MsgRec);
	
	Msg_Init_Clr(&Msg_Init);
	Msg_Init.Mode = CAN_RXMODE;
	Msg_Init.Ie = 1;//enable receive interrupt
	Msg_Init.Id = 0x111;//standard ID
	Msg_Init.IdMaskNum = MCONF_RX_MSGBUFF_NOMASK;//no mask
	
	Config_MSGBuffer(CAN0MSG08,&Msg_Init);//config Receive Message buffer8

谢谢观看

博主分享不易,请给一键三连哦(关注 + 点赞 + 收藏),你的鼓励是博主分享的动力。
彩蛋:我种草了一个公众号:嵌入式点灯大师,内容实在且丰富,有兴趣的可点击查看或关注!
由于篇幅长度和信息度,这里不再继续讲解,下一章,将会继续讲解CAN通讯发送指令来控制单片机,从而控制LED指示灯的状态!其次,再讲解CAN控制单片机,单片机通过I2C来控制IS器件,从而实现LED实现流水及颜色变化!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

星新计划

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值