【S32K144】EB tresos CAN模块配置
[S32K144] MCAL - CAN模块配置
一、CAN介绍
1.1 CAN
控制器局域网总线(CAN,Controller Area Network)是一种用于实时应用的串行通讯协议总线,它可以使用双绞线来传输信号,是世界上应用最广泛的现场总线之一。 CAN协议用于汽车中各种不同元件之间的通信,以此取代昂贵而笨重的配电线束。 该协议的健壮性使其用途延伸到其他自动化和工业应用。 CAN协议的特性包括完整性的串行数据通讯、提供实时支持、传输速率高达1Mb/s、同时具有11位的寻址以及检错能力。
1.2 CANFD
CANFD是CAN with Flexible Data rate的缩写,翻译为【可变速率的 CAN】。 也可以简单的认为是传统CAN的升级版,其中要说明的是,只升级了协议,物理层没有改变。
1.3 邮箱
1.3.1 邮箱资源
1.3.2 邮箱构成
邮箱结构如上图所示,前8个字节包含了报文的基本信息,后面是报文的数据,最多可以存放64个字节,各字段功能如下:
EDL:CAN / CAN FD
BRS:CAN FD帧格式的速率切换
ESI:标识发送节点是错误主动还是错误被动
CODE:邮箱当前状态(具体请参考 S32K-RM:Table 55-11)
SRR:保证数据帧格式优先于扩展帧(因此设置为扩展帧时此位置1)
IDE:标准帧 / 扩展帧
RTR:数据帧 / 远程帧
DLC:数据长度
TIME STAMP:时间戳(任何帧的标识符的第二位出现在总线上时,Free Running Timer (TIMER)值被捕获,当传输/接收结束时该值被写入TIME STAMP)
PRIO:优先级用于邮箱的发送仲裁
ID:报文ID
1.4 波特率计算方式
1.4.1 位时序概述
SS:同步段
PTS:传播时间段
PBS1:相位缓冲段 1
PBS2:相位缓冲段 2
这些段的作用是为了同步节点之间的数据传输,保证采样点的一致性,在同一个CAN网络中,所有节点根据MCU频率、采样点都会指定位时序的参数,例如我是零部件供应商,那么我会根据主机厂给定的CAN开发协议来设定这些值。
第一采样点计算公式:SP = (SS + PTS + PTS1)/ (SS + PTS + PTS1 + PTS2)
第二采样点计算公式:SSP = OFFSET * DIV / Bit Time + 5%
注意:
1、OFFSET * DIV :取决于芯片类型,有些要求使用分频前的时钟进行计算,有些需要使用分频后的时钟进行计算
2、5%:偏差值,需要根据不同芯片实际测量值所得
1.4.2 波特率计算公式
PE Clock:CAN模块的报文发送与接收都是由PE Engine控制,它的时钟频率决定波特率。
如下图所示,PE Clock的时钟源有两个选择,外设时钟频率和晶振时钟频率,如果对于通信时序公差比较严格,则建议使用晶振时钟频率(防抖效果更好)。
CAN通讯中,一个数据位由4各段组成,每个段由多个Tq组成,一个数据位则由多个Tq组成,最终波特率计算公式如下所示:
① Tq = (PRESDIV + 1) / fcanclk
② CAN Bit Time = (Number of Time Quanta in 1 bit time) * Tq
③ Bit Rate = 1 / CAN Bit Time
例:CAN波特率为500kHz,输入时钟选择外设时钟(SYS_CLK:80MHz):
① CAN Bit Time = 1 / Bit Rate = 1 / 500kHz = 0.000002s
② 0.000002 = Num * (PresDiv + 1)/ 80MHz
③ Num * (PresDiv + 1)= 160
Num:8 ~ 25
PresDiv:0 ~ 255
因此我们可以配置PresDiv:7,Num:20
④ Num分配的依照产品开发的CAN协议手册规约,每个产品开发的时候都有严格的约束
二、API介绍
三、模块配置
Can Main Function Busoff Period:Can_MainFunction_BusOff函数的调用周期(CAN驱动中不使用,应在上层SchM模块使用)
Can Main Function Mode Period:Can_MainFunction_Mode函数的调用周期(CAN驱动中不使用,应在上层SchM模块使用)
Can Multiplexed Transmission:多路传输,启用后,如果目标MB处于Busy状态,则寻找其他空闲的且Object ID相同的邮箱进行发送
Can Maximum Message Buffers:最大邮箱个数
CanLPduReceiveCalloutFunction:LPDU(Id/Data/Length)接收回调函数
Can define loop as cycle:不使用OS的情况下勾选,不勾选则会引入"Os.h"
Can Timeout Duration (in Number of loops) :超时时间,各个循环中的超时计数
Can Extended ID Support:ID数据类型(true:uint32 false:uint16)
Can MB Count Extension Support:邮箱数据类型(true:uint16 false:uint8),如果定义的邮箱个数超过255,则必须开启
Message buffer data size:数据域大小(在控制器的波特率界面开启CAN FD后生效)
3.1 CanController
Can Hardware Channel:CAN硬件通道选择
Can Controller Activation:勾选后此通道的配置信息才会生效,否则生成的配置信息都是空的
Can Rx Processing Type:中断/轮询确认接收数据
Can Tx Processing Type:中断/轮询确认发送数据
Can BusOff Processing Type:中断/轮询确认BussOff
以上三者相同,选择触发事件后是通过轮询的方式还是中断的方式获取通知信息
Can Listen Only Mode:只收不发模式
Can Loop Back Mode:自发自收模式
Can Lowest Buffer Transmit First:仲裁机制(邮箱编号越低优先级越高)
Can Local Priority Enable:仲裁机制(本地优先级 - 参考仲裁机制部分)
Can Clock from Bus:PE时钟选择(true:系统时钟 false:外设时钟)
Can Controller Default Baudrate:波特率
Can CPU Reference Clock:参考时钟
3.2.1 CanControllerBaudrateConfig
3.2.1.1 General
Can Time Segments Checking:位序列检查
Can Tx ArbitrationStart Delay:仲裁启动延迟
Can Controller Prescaller:时钟分频(生成的配置自动-1)
Can Controller BaudRate:波特率
Can Propagation Segment:传播时间段(生成的配置自动-1,范围1~8)
Can Phase Segment 1:相位缓冲段1(生成的配置自动-1,范围1~8)
Can Phase Segment 2:相位缓冲段2(生成的配置自动-1,范围2~8)
Can Resynch Jump Width:跳转宽度(范围1~4)
3.2.1.1 CanControllerFdBaudrateConfig
Can FD Controller BaudRate (dynamic range):波特率
Can FD Propagation Segment:传播时间段
Can FD Phase Segment 1:相位缓冲段1
Can FD Phase Segment 2:相位缓冲段2
Can FD Resynch Jump Width:相位缓冲段2
CanControllerTxBitRateSwitch:速率切换
CanControllerFdIsoCANFD:使能CAN FD
3.3 CanHardwareObject
FD padding value:CAN FD填充数据(使能CAN FD后开启)
Can Implementation Type:Basic / Full
Can ID Message Type:报文类型(标准 / 扩展 / Mixed)
Can ID Bits Local Priority:本地优先级,用于发送时邮箱仲裁机制(范围:0~7)
Can Object ID:HOH句柄
Can MB Type:邮箱类型(发送 / 接收)
CanTriggerTransmitEnable:
Can Controller Reference:控制器选择
Can MainFunction RW Period Reference:读写轮询周期选择
Can Hw Filter Code:匹配码
Can Hw Filter Mask:掩码
3.4 CanMainFunctionRWPeriods
生成如下宏定义供上层使用,CAN驱动自己不使用:
#define CAN_MAINFUNCTION_PERIOD (0.001F)
#define CAN_MAINFUNCTION_PERIOD_READ (0.001F)
#define CAN_MAINFUNCTION_PERIOD_WRITE (0.001F)
四、掩码配置介绍
4.1 HwFilterCode / HwFilterMask
Can Hw Filter Code:匹配码的作用是用于和接收到的报文做比较
Can Hw Filter Mask:掩码的作用是决定比较ID的哪几个Bit
如下图所示,掩码置1的位置,报文ID和匹配码必须一致,否则将被过滤,掩码置0的位置忽略比较。
/*
* 报文ID: 0x1BB -> 0 0 0 1 1 0 1 1 1 0 1 1
* 匹配码: 0x1FB -> 0 0 0 1 1 1 1 1 1 0 1 1
*
* 掩码: 0x100 -> 0 0 0 1 0 0 0 0 0 0 0 0
*/
void MaskCalc()
{
uint code = 0x15F;
uint mask = 0x7FF;
uint[] id = { 0x188, 0x198, 0x257};
foreach (var item in id)
{
mask &= ~(code ^ item);
}
printf(mask);
}
4.2 Basic / Full
Basic:该邮箱允许接收一组报文
现象:接收由Can Hw Filter Code和Can Hw Filter Mask划定范围的报文。
原理:Can Hw Filter Code被设置到邮箱的ID字段,Can Hw Filter Mask被设置到该邮箱对应的RXIMR寄存器。
Full:该邮箱只接收一个报文
现象:只接收与Can Hw Filter Code一致的报文。
原理:Can Hw Filter Code被设置到邮箱的ID字段,RXIMR寄存器设置为0xFFFFFFFF(所有位都匹配)。