中科芯CKS32F4xx系列MCU的CAN通信应用指南分享
当前,CAN的高性能和可靠性已被认同,并被广泛地应用于工业自动化、船舶、医疗设备、工业设备等方面。现场总线是当今自动化领域技术发展的热点之一,被誉为自动化领域的计算机局域网。它的出现为分布式控制系统实现各节点之间实时、可靠的数据通信提供了强有力的技术支持。
CAN控制器根据两根线上的电位差来判断总线电平。总线电平分为显性电平和隐性电平,二者必居其一。发送方通过使总线电平发生变化,将消息发送给接收方。
CAN协议具有以下特点:
(1)多主控制
(2)系统的柔软性
(3)通信速度较快,通信距离远
(4)具有错误检测、错误通知和错误恢复功能
(5)故障封闭功能
(6)连接节点多
中科芯CKS32F4xx系列MCU自带的是bxCAN,即基本扩展CAN。它支持CAN协议2.0A和2.0B。它的设计目标是,以最小的CPU负荷来高效处理大量收到的报文。它也支持报文发送的优先级要求(优先级特性可软件配置)。对于安全紧要的应用,bxCAN提供所有支持时间触发通信模式所需的硬件功能。
CKS32F4xx系列的bxCAN的主要特点有:
● 支持CAN协议2.0A和2.0B主动模式
● 波特率最高达1Mbps
● 支持时间触发通信
● 具有3个发送邮箱
● 具有3级深度的2个接收FIFO
● 可变的过滤器组(28个,CAN1和CAN2共享)
本章只用了1个CAN,即CAN1。双CAN的框图如图1所示:
图1 CAN功能框图
从图中可以看出两个CAN都分别拥有自己的发送邮箱和接收FIFO,但是他们共用28个滤波器。通过CAN_FMR寄存器的设置,可以设置滤波器的分配方式。
CKS32F4xx系列的标识符过滤比较复杂,它的存在减少了CPU处理CAN通信的开销。CKS32F4xx系列的过滤器(也称筛选器)组最多有28个,每个滤波器组x由2个32为寄存器,CAN_FxR1和CAN_FxR2组成。CKS32F4xx系列每个过滤器组的位宽都可以独立配置,以满足应用程序的不同需求。根据位宽的不同,每个过滤器组可提供:
●1个32位过滤器,包括:STDID[10:0]、EXTID[17:0]、IDE和RTR位
● 2个16位过滤器,包括:STDID[10:0]、IDE、RTR和EXTID[17:15]位
此外过滤器可配置为,屏蔽位模式和标识符列表模式。在屏蔽位模式下,标识符寄存器和屏蔽寄存器一起,指定报文标识符的任何一位,应该按照“必须匹配”或“不用关心”处理。而在标识符列表模式下,屏蔽寄存器也被当作标识符寄存器用。因此,不是采用一个标识符加一个屏蔽位的方式,而是使用2个标识符寄存器。接收报文标识符的每一位都必须跟过滤器标识符相同。
通过CAN_FMR寄存器,可以配置过滤器组的位宽和工作模式,如图2所示:
图2 CAN过滤器组的位宽和工作模式
为了过滤出一组标识符,应该设置过滤器组工作在屏蔽位模式。
为了过滤出一个标识符,应该设置过滤器组工作在标识符列表模式。
应用程序不用的过滤器组,应该保持在禁用状态。
过滤器组中的每个过滤器,都被编号为从0开始,到某个最大数值-取决于过滤器组的模式和位宽的设置。举个简单的例子,我们设置过滤器组0工作在:1个32位过滤器-标识符屏蔽模式,然后设置CAN_F0R1=0XFFFF0000,CAN_F0R2=0XFF00FF00。其中存放到CAN_F0R1的值就是期望收到的ID,即我们希望收到的ID(STID+EXTID+IDE+RTR)最好是:0XFFFF0000。而0XFF00FF00就是设置我们需要必须关心的ID,表示收到的ID,其位[31:24]和位[15:8]这16个位的必须和CAN_F0R1中对应的位一模一样,而另外的16个位则不关心,可以一样,也可以不一样,都认为是正确的ID,即收到的ID必须是0XFFxx00xx,才算是正确的(x表示不关心)。
CAN发送流程
CAN发送流程为:程序选择1个空置的邮箱(TME=1)→设置标识符(ID),数据长度和发送数据→设置CAN_TIxR的TXRQ位为1,请求发送→邮箱挂号(等待成为最高优先级)→预定发送(等待总线空闲)→发送→邮箱空置。整个流程如图3所示:
图3 CAN发送邮箱
上图中,还包含了很多其他处理,终止发送(ABRQ=1)和发送失败处理等。通过这个流程图,我们大致了解了CAN的发送流程,后面的数据发送,我们基本就是按照此流程来走。
CAN接收流程
CAN接收到的有效报文,被存储在3级邮箱深度的FIFO中。FIFO完全由硬件来管理,从而节省了CPU的处理负荷,简化了软件并保证了数据的一致性。应用程序只能通过读取FIFO输出邮箱,来读取FIFO中最先收到的报文。这里的有效报文是指那些正确被接收的(直到EOF都没有错误)且通过了标识符过滤的报文。前面我们知道CAN的接收有2个FIFO,我们每个滤波器组都可以设置其关联的FIFO,通过CAN_FFA1R的设置,可以将滤波器组关联到FIFO0/FIFO1。
CAN接收流程为:FIFO空→收到有效报文→挂号_1(存入FIFO的一个邮箱,这个由硬件控制,我们不需要理会)→收到有效报文→挂号_2→收到有效报文→挂号_3→收到有效报文→溢出。
这个流程里面,我们没有考虑从FIFO读出报文的情况,实际情况是:我们必须在FIFO溢出之前,读出至少1个报文,否则下个报文到来,将导致FIFO溢出,从而出现报文丢失。每读出1个报文,相应的挂号就减1,直到FIFO空。CAN接收流程如图4所示:
图4 FIFO接收报文
FIFO接收到的报文数,我们可以通过查询CAN_RFxR的FMP寄存器来得到,只要FMP不为0,我们就可以从FIFO读出收到的报文。
CAN时间特性
CKS32F4xx系列把传播时间段和相位缓冲段1(CKS32F4xx系列称之为时间段1)合并了,所以CKS32F4xx系列的CAN一个位只有3段:同步段(SYNC_SEG)、时间段1(BS1)和时间段2(BS2)。CKS32F4xx系列的BS1段可以设置为1~16个时间单元,刚好等于传播时间段和相位缓冲段1之和。CKS32F4xx系列的CAN位时序如图5所示:
图5 CAN位时序
图中还给出了CAN波特率的计算公式,我们只需要知道BS1和BS2的设置,以及APB1的时钟频率(一般为42MHz),就可以方便的计算出波特率。比如设置TS1=6、TS2=5和BRP=5,在APB1频率为42Mhz的条件下,即可得到CAN通信的波特率=42000/[(7+6+1)*6]=500Kbps。
CAN程序配置
1)配置相关引脚的复用功能(AF9),使能CAN时钟
我们要用CAN,第一步就要使能CAN的时钟,CAN的时钟通过APB1ENR的第25位来设置。其次要设置CAN的相关引脚为复用输出,这里我们需要设置PA11(CAN1_RX)和PA12(CAN1_TX)为复用功能(AF9),并使能PA口的时钟。具体配置过程如下:
2)设置CAN工作模式及波特率等这一步通过先设置CAN_MCR寄存器的INRQ位,让CAN进入初始化模式,然后设置CAN_MCR的其他相关控制位。再通过CAN_BTR设置波特率和工作模式(正常模式/环回模式)等信息。最后设置INRQ为0,退出初始化模式。
在库函数中,提供了函数CAN_Init()用来初始化CAN的工作模式以及波特率,CAN_Init()函数体中,在初始化之前,会设置CAN_MCR寄存器的INRQ为1让其进入初始化模式,然后初始化CAN_MCR寄存器和CRN_BTR寄存器之后,会设置CAN_MCR寄存器的INRQ为0让其退出初始化模式。所以我们在调用这个函数的前后不需要再进行初始化模式设置。下面我们来看看CAN_Init()函数的定义:uint8_t CAN_Init(CAN_TypeDef* CANx, CAN_InitTypeDef* CAN_InitStruct);
第一个参数就是CAN标号,这里我们使用的是芯片CAN1,所以就配置成CAN1。
第二个参数是CAN初始化结构体指针,结构体类型是CAN_InitTypeDef,下面我们来看看这个结构体的定义:
这个结构体看起来成员变量比较多,实际上参数可以分为两类。前面5个参数是用来设置寄存器CAN_BTR,用来设置模式以及波特率相关的参数,这在前面有讲解过,设置模式的参数是CAN_Mode,我们实验中用到回环模式CAN_Mode_LoopBack和常规模式CAN_Mode_Normal,大家还可以选择静默模式以及静默回环模式测试。其他设置波特率相关的参数CAN_Prescaler,CAN_SJW,CAN_BS1和CAN_BS2分别用来设置波特率分频器,重新同步跳跃宽度以及时间段1和时间段2占用的时间单元数。后面6个成员变量用来设置寄存器CAN_MCR,也就是设置CAN通信相关的控制位。初始化实例为:
3)设置滤波器
本章,我们将使用滤波器组0,并工作在32位标识符屏蔽位模式下。先设置CAN_FMR的FINIT位,让过滤器组工作在初始化模式下,然后设置滤波器组0的工作模式以及标识符ID和屏蔽位。最后激活滤波器,并退出滤波器初始化模式。
在库函数中,提供了函数CAN_FilterInit()用来初始化CAN的滤波器相关参数,CAN_Init()函数体中,在初始化之前,会设置CAN_FMR寄存器的INRQ为INIT让其进入初始化模式,然后初始化CAN滤波器相关的寄存器之后,会设置CAN_FMR寄存器的FINIT为0让其退出初始化模式。所以我们在调用这个函数的前后不需要再进行初始化模式设置。下面我们来看看CAN_FilterInit()函数的定义:void CAN_FilterInit(CAN_FilterInitTypeDef* CAN_FilterInitStruct);
这个函数只有一个入口参数就是CAN滤波器初始化结构体指针,结构体类型为CAN_FilterInitTypeDef,下面我们看看类型定义:
结构体一共有9个成员变量,第1个至第4个是用来设置过滤器的32位id以及32位maskid,分别通过2个16位来组合的,这个在前面有讲解过它们的意义。
第5个成员变量CAN_FilterFIFOAssignment用来设置FIFO和过滤器的关联关系,我们的实验是关联的过滤器0到FIFO0,值为CAN_Filter_FIFO0。
第6个成员变量CAN_FilterNumber用来设置初始化的过滤器组,取值范围为0~13。
第7个成员变量FilterMode用来设置过滤器组的模式,取值为标识符列表模式CAN_FilterMode_IdList和标识符屏蔽位模式CAN_FilterMode_IdMask。
第8个成员变量FilterScale用来设置过滤器的位宽为2个16位CAN_FilterScale_16bit还是1个32位CAN_FilterScale_32bit。
第9个成员变量CAN_FilterActivation就很明了了,用来激活该过滤器。过滤器初始化参考实例代码:
4)发送接受消息
在初始化CAN相关参数以及过滤器之后,接下来就是发送和接收消息了。库函数中提供了发送和接受消息的函数。发送消息的函数是:uint8_t CAN_Transmit(CAN_TypeDef* CANx, CanTxMsg* TxMessage);
这个函数的第一个参数是CAN标号,我们使用CAN1。第二个参数是相关消息结构体CanTxMsg指针类型,CanTxMsg结构体的成员变量用来设置标准标识符,扩展标识符,消息类型和消息帧长度等信息。
接受消息的函数是:void CAN_Receive(CAN_TypeDef* CANx, uint8_t FIFONumber, CanRxMsg* RxMessage);
前面两个参数也比较好理解,CAN标号和FIFO号。第二个参数RxMessage是用来存放接受到的消息信息。结构体CanRxMsg和结构体CanTxMsg比较接近,分别用来定义发送消息和描述接受消息。
5)CAN状态获取
对于CAN发送消息的状态,挂起消息数目等等之类的传输状态信息,库函数提供了一些列的函数,包括CAN_TransmitStatus()函数,CAN_MessagePending()函数,CAN_GetFlagStatus()函数等等,大家可以根据需要来调用。至此,CAN就可以开始正常工作了。
- |
- +1 赞 0
- 收藏
- 评论 0
本文由ll转载自中科芯MCU公众号,原文标题为:MCU微课堂|CKS32F4xx系列CAN通信,本站所有转载文章系出于传递更多信息之目的,且明确注明来源,不希望被转载的媒体或个人可与我们联系,我们将立即进行删除处理。
相关推荐
解析中科芯CKS32F107xx系列MCU的GPIO配置
本文中中科芯来给大家介绍CKS32F107xx系列MCU的GPIO配置,希望对各位工程师有所帮助。GPIO是通用输入输出端口的简称,也是CKS32可控制的引脚,CKS32芯片的GPIO引脚与外部设备连接起来,从而实现与外部通讯、控制以及数据采集的功能。
【经验】如何提高雅特力32位MCU AT32F403RCT7在ADC采集信号的精度
雅特力32位MCU AT32F403RCT7采用高性能ARM Cortex-M4F内核,工作频率240MHz主频,本文主要介绍雅特力32位MCU AT32F403RCT7的ADC如何通过硬件设计电路来提高测量精度。
【经验】中科芯CKS32F4xx系列MCU DAC功能应用指南
DAC模块作为中科芯CKS32F4xx系列MCU的一个常用外设,可以将数字信号转换成模拟信号,最高分辨率可达12位,且两个独立DAC输出通道转换互不影响,各个通道均能使用DMA功能,可由软硬件触发。因此,为了实现DAC输出正弦波,拟采用一定的时间向DAC的数据寄存器写入数据,随后进行数模转换输出不同的电压,最后在时间轴上显示出波形。
CPU和MCU的差异
在现代计算机和嵌入式系统中,CPU(中央处理器)和MCU(单片微型计算机)是两种关键的处理器类型,各自在不同的应用场景中发挥着重要作用。虽然它们都是处理器,但它们的设计和功能有着显著的差异。
M0+产品行业新标杆诞生,武汉芯源CW32L010安全低功耗MCU集合多项技术性能优势
2024年9月26日,武汉芯源半导体带着最新产品CW32L010安全低功耗MCU作客电巢直播间,举行了一场璀璨的XR技术新品发布会,此次直播,武汉芯源半导体技术总监 张亚凡、北中国区销售总监 孙秀艳与大家分享了武汉芯源半导体的发展历程和重要时刻,全面介绍和讲解了新品CW32L010实现的技术优势。
中科芯CKS32K148系列MCU SCG寄存器配置以及相关示例(二)
在前文中,已经对中科芯CKS32K148 MCU SCG时钟进行了整体介绍,下面以RUN模式下配置SPLL为系统时钟源为例,对时钟配置的具体方法进行讲解。
中科芯CKS32F4xx系列MCU Flash模拟EEPROM的操作应用指南
中科芯CKS32F4xx系列芯片内部嵌入一个FLASH,若FLASH存储了用户的应用程序后仍留有空间,剩余空间可被当作EEPROM使用,这比访问外部FLASH速度优势更为明显。在本章节中,将会向大家简要介绍内部FLASH,并通过一个例程来演示FLASH模拟EEPROM的操作。
【IC】灵动微电子高性能通用32位MCU产品MM32H5480荣获“2024年度硬核MCU芯片奖”
近日,第六届硬核芯生态大会在深圳举办,同期2024年度硬核中国芯获奖榜单正式发布。作为国内领先的本土通用32位MCU产品及解决方案供应商,MindMotion灵动微电子凭借高性能产品MM32H5480斩获“2024年度硬核MCU芯片奖”。
极海半导体APM32F407系列MCU支持国密算法,助力国产安全可控,适用于新能源等领域
极海推出的APM32F407系列MCU,结合当前环境要求,设计出了支持国密算法(SM2,SM3,SM4)的IP, 符合国家密码管理局认定和公布的密码算法标准及其应用规范,并凭借显著的性能优势,已应用至新能源、工业控制、医疗设备等众多领域。
【IC】国内首款集成2MSPS 16位 SAR ADC的MCU LH32M3Sxx,工作频率最高可达72MHz
领慧立芯推出的LH32M3Sxx系列MCU是完全集成的单封装器件,集成高性能模拟外设和数字外设和72MHz ARM Cortex-M3处理器。LH32M3Sxx集成了一系列片上外设,可以根据应用需要通过软件控制进行配置。广泛用于数据采集、工业控制等领域。
解码工业自动化:匠芯创M6800系列MCU编码器接口协议全解析
在工业自动化的浪潮中,编码器以其精确的位置和速度反馈是实现精密控制的基础。随着技术的发展,编码器与控制系统之间的通信协议变得尤为关键。本文匠芯创将聚焦于多摩川、BISS和Endat等主流协议,以M6800系列芯片为例,分析它们如何满足不同工业场景的需求,以及如何推动自动化技术的进步。
中科芯(CETC)32位MCU产品及公司简介
型号- CKS32F103R6T6,CKS32F103V8T6,CKS32F030C8T6,CKS32F031K6U6,CKS32F417ZET6,CKS32F102C6T6,CKS32F102R8T6,CKS32F105RBT6,CKS32F102R4T6,CKS32F031C6T6,CKS32F103C8T6,CKS32F101R6T6,CKS32F103C4T6,CKS32F051C6U6,CKS32F102CBT6,CKS32F051K6U6,CKS32F101ZCT6,CKS32F101VET6,CKS32F101RCT6,CKS32F415VGT6,CKS32F417VGT6,CKS32F031G4U6,CKS32F031F4P6,CKS32F101C8T6,CKS32F103RCT6,CKS32F103VET6,CKS32F107RBT6,CKS32F051C6T6,CKS32F405OET6,CKS32F051K6T6,CKS32F405ZGT6,CKS32F103ZET6,CKS32F417IGT6,CKS32F105VCT6,CKS32F051R6T6,CKS32,CKS32F405RGT6,CKS32F101ZDT6,CKS32F407ZGT6,CKS32F101VBT6,CKS32F102RBT6,CKS32F031K4T6,CKS32F415OGT6,CKS32F101RDT6,CKS32F103RDT6,CKS32F103VBT6,CKS32F030K6T6,CKS32F407VET6,CKS32F103R8T6,CKS32F107VCT6,CKS32F103R4T6,CKS32F103ZDT6,CKS32F030C6T6,CKS32F031K4U6,CKS32F102C8T6,CKS32F103CBT6,CKS32F417ZGT6,CKS32F102C4T6,CKS32F105VBT6,CKS32X,CKS32F102R6T6,CKS32F031C4T6,CKS32F103C6T6,CKS32F051C4U6,CKS32F101R4T6,CKS32F105R8T6,CKS32F051C8U6,CKS32F101R8T6,CKS32F030F4P6,CKS32F051K8U6,CKS32F051K4U6,CKS32F101VCT6,CKS32F101ZET6,CKS32F415ZGT6,CKS32F101RET6,CKS32F101CBT6,CKS32F031G6U6,CKS32F417VET6,CKS32F103RET6,CKS32F415RGT6,CKS32F051C4T6,CKS32F103VCT6,CKS32F031F6P6,CKS32F051C8T6,CKS32F107VBT6,CKS32F405OGT6,CKS32F051K8T6,CKS32F103ZCT6,CKS32F417IET6,CKS32F051K4T6,CKS32F105RCT6,CKS32F051R4T6,CKS32F051R8T6,CKS32F405VGT6,CKS32F101VDT6,CKS32F105V8T6,CKS32F407ZET6,CKS32F101RBT6,CKS32F031K6T6,CKS32F103RBT6,CKS32F103VDT6,CKS32F407VGT6,CKS32F107RCT6
【经验】中科芯CKS32F4xx系列MCU SPI通信配置及读写SPI FLASH指南
中科芯CKS32F4xx系列MCU的SPI外设可用作通讯的主机及从机,支持最高的SCK时钟频率为fpclk/2,完全支持SPI协议的4种模式。本文介绍利用CKS32F4xx系列固件库来完成对SPI的配置使用及SPI FLASH实验。
HPM6700/6400 系列开创国产高性能 MCU 新时代
型号- HPM6400 系列,HPM64A0A,HPM64G0,HPM64A0,HPM6400,HPM6700 系列,HPM6700,HPM6750EVKMINI,HPM6750EVK2
电子商城
现货市场
服务
可定制显示屏的尺寸0.96”~15.6”,分辨率80*160~3840*2160,TN/IPS视角,支持RGB、MCU、SPI、MIPI、LVDS、HDMI接口,配套定制玻璃、背光、FPCA/PCBA。
最小起订量: 1000 提交需求>
可烧录IC封装SOP/MSOP/SSOP/TSOP/TSSOP/PLCC/QFP/QFN/MLP/MLF/BGA/CSP/SOT/DFN;IC包装Tray/Tube/Tape;IC厂商不限,交期1-3天。支持IC测试(FT/SLT),管装、托盘装、卷带装包装转换,IC打印标记加工。
最小起订量: 1pcs 提交需求>
登录 | 立即注册
提交评论