CAN Interface (MCMCAN)
1.模块
有三个模块CAN0,CAN1,CAN2,一般只使用CAN0,CAN0的模块比较全面。
CAN0有4个CAN node,Message RAM 一共32Kbyte,FIFO,buffer,register在此处开辟。
每个node通过M_CAN来实现,并且都支持CAN FD;都有两个阴角,TXD和RXD
2.初始化
具体步骤
设置CCCRi.INIT开始初始化(软硬件复位或通过bus off)此时配置寄存器不会被改变
当该位被置起,即CCCRi.INIT (i=0-3) 置1,can总线之间的通信停止,CAN node停止收发,CAN总线输出TXD为隐性(高)。错误管理逻辑EML的计数器保持不变。
重置 CCCRi (i=0-3).INIT 完成软件初始化
只有当位CCCRi.INIT和CCCRy.CCE都设置为1时,才能启用对M_CAN配置寄存器的访问
CCCRi.CCE只有在CCCRi.INIT='1’时才能被set/reset。
当CCCRi.INIT被清除时,CCCRi.CCE自动复位。
3. 时钟控制单元
MCMCAN模块时钟输入连接到时钟控制单元(CCU)。并且MCMCAN有两种时钟源,fsyn用于寄存器和RAM接口,fasyn用在CAN FD上。CLC设置为全局模块寄存器提供其时钟。
为了向M_CAN节点提供相应的时钟,必须设置MCR.CLKSELi寄存器。异步时钟以及每个M_CAN节点的同步时钟可以通过MCR.CLKSELi寄存器位字段打开/关闭。
4. 中断
每个module都有16个中断线INT_O0~INT_O15
中断分组已经设置,存在16个中断节点。中断组可以通过GRINT1i(i=0-3),**GRINT2i (i=0-3)**自由分配给节点
中断脉冲的生成是基于 寄存器 (IRi (i=0-3) TTIR0) 和 (**IEi (i=0-3)**and TTIE0),中断标志和中断使能之间的关系是&。中断flag会通过向 CANn_IRi bit.写‘1’进行reset。
如果相应中断使能寄存器中的相关中断使能位使能(IEi(i=0-3)、NTRTRi(i=0-2)、TEIE和TTIE0),MCMCAN 模块里16条中断输出线INT_On的其中一条使用GRINT1i (i=0-3) 和 GRINT2i (i=0-3)可以产生中断脉冲。
也就是说通过配置interrupt line选择对应的SRC节点(line和SRC_INT一一对应)配置CAN中断
Ifx_SRC_SRCR INT[16];
} Ifx_SRC_CAN_CAN;
1
2
volatile Ifx_SRC_SRCR *IfxCan_getSrcPointer(Ifx_CAN *can, IfxCan_InterruptLine interruptLine)
{
IfxCan_Index canIndex = IfxCan_getIndex(can);
Ifx_SRC_CAN_CAN *const srcCanBaseAddress[IFXCAN_NUM_MODULES] = {
&MODULE_SRC.CAN.CAN[0],
&MODULE_SRC.CAN.CAN[1],
};
return &(srcCanBaseAddress[canIndex]->INT[interruptLine]);
}
5. CAN FD
区别:传输速率不同、数据长度不同、帧格式不同、ID长度不同
CCCRi.FDOE (i=0-3) 是收发CAN FD frame功能启用位
时间延迟补偿:为了实现比发射机延迟更短的数据相位比特时间,引入了延迟补偿。在没有变送器延迟补偿的情况下,CAN FD帧的数据阶段的比特率受到变送器延迟的限制
CAN收发器的信号从TX出发到总线到RX有时延。CAN FD速率可变,BRS位进行控制,波特率更高
6. CAN node的收发
接受到的Rx Frame以Rx buffer的形式存放在Message RAM,最多存放64个
首地址通过寄存器进行配置
\#define SMCMCAN0_RXBC0_INIT ( 0x00000000UL )
typedef volatile struct _Ifx_CAN_N_RX
{
Ifx_CAN_N_RX_F0C F0C;
Ifx_CAN_N_RX_F0S F0S;
Ifx_CAN_N_RX_F0A F0A;
Ifx_CAN_N_RX_BC BC;
Ifx_CAN_N_RX_F1C F1C;
Ifx_CAN_N_RX_F1S F1S;
Ifx_CAN_N_RX_F1A F1A;
Ifx_CAN_N_RX_ESC ESC;
} Ifx_CAN_N_RX;
单个Rx Buffer进行管理时,每个Rx Buffer称为Dedicated Rx Buffer,当写入数据后就会被锁住,不会再从CAN总线上写入新数据,直到CPU访问完后解锁
多个连续的Rx Buffer 可以组成Rx FIFO进行管理,一个CAN Node可以设置2个Rx FIFO,FIFO0和FIFO1.同样首地址通过寄存器进行配置。FIFO是一种先进先出的数据缓存区域。
在节点的初始化过程中
①对于Tx,
(1)首先设置buffer大小
(2)判断config->txConfig.txMode的类型是FIFO还是QUEUE设置为对应的模式并且设置其buffers的大小
(3)在所选中的buffer使能中断
②对于Rx,主要是设置其Rx buffer 的数据长度和Message RAM的起始地址,然后设置Rx FIFO的数据长度,Message RAM的起始地址,大小,操作模式和watermark level
对于FIFO,可容纳的元素数量称为Deepth,每个元素大小为Size,进入full状态后写入会溢出,所以要设置水线(Watermark),Watermark<Deepth,当已被读取的Element达到Watermark时降低读取速度或者提高写入速度
读写指针:总指向下一个要读取/当前要被读出的单元。
读空:当读写指针相同时,表示FIFO为空, 复位操作时 或者当读指针读出FIFO中最后一个字 后,追赶上写指针时,此时读空信号有效
写满:当读写指针再次相等时,表明FIFO为满,这种情况发生在,当写指针转了一圈折回来(wrapped around)又追上了读指针
7. Message RAM
CAN0 起始地址:0xF0200000
CAN1起始地址:0xF0210000
CAN Node会将准备发送的Tx Frame以Tx Buffer的形式存放在Message RAM中,最多可以存放32个Tx Buffer数据
8. 工作模式
Restricted Operation Mode 固定工作模式
模式进入:处理器无法从消息RAM读取数据
模式退出:host CPU重置CCCRi.ASM位
在固定工作模式下,节点能够接收数据和远程帧,并对有效帧进行确认,但不发送数据帧、远程帧、活动错误帧或过载帧。出现错误或者过载情况等待总线空闲,然后同步CAN通信,
Bus Monitoring Mode 总线监控模式
模式进入:CCCRi.MON置1,或者error level S3,即(TTOST0.EL = “11”)
在总线监控模式下,点能够接收数据和远程帧,但是不启动传输,可以分析CAN总线上信号量
Power Down (Sleep Mode) 睡眠模式
模式进入:输入时钟信号或者控制寄存器
具体过程:时钟停止请求信号active,CCCRi.CSR读取为1;
1.当所有pending的传输请求都已经完成,等待总线空闲状态。
2.然后M_CAN将CCCRi.INIT设置为1,以防止任何进一步的CAN传输;
3.通过将CCCRi(i=0-3).CSA设置为1来确认其已准备好Power Down。在这种状态下,在时钟被关闭之前,可以进行进一步的寄存器访问。对CCCRi.INIT写访问将无效。
4.时钟将被关闭
Test Modes 测试模式
测试模式应仅用于生产测试或自检。针脚TXD的软件控制会干扰所有CAN协议功能。不建议使用测试模式进行应用
3).CSA设置为1来确认其已准备好Power Down。在这种状态下,在时钟被关闭之前,可以进行进一步的寄存器访问。对CCCRi.INIT写访问将无效。
4.时钟将被关闭
Test Modes 测试模式
测试模式应仅用于生产测试或自检。针脚TXD的软件控制会干扰所有CAN协议功能。不建议使用测试模式进行应用
————————————————
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/weixin_43925467/article/details/131662447
|