CAN协议学习(二)MCAN控制器介绍

本文介绍了Mentor公司的CAN2网络控制器MCAN2,详细阐述了其总体架构,包括发送、接收过程,接收过滤机制以及信号和寄存器描述。MCAN2支持CAN2.0A和2.0B协议,具备可编程位定时逻辑和接收FIFO功能,确保高效、可靠的CAN总线通信。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

更多细节请参看MCAN2文档mcan2_ps.pdf。

一、MCAN2简介

MCAN2Mentor公司开发的一个CAN2.0网络控制器的软核,初版2001年末版2006年。MCAN 2控制器实现了BOSCAN消息传输协议2.0a2.0b。规范2.0a(相当于can 1.2)涵盖标准消息格式(11位标识符);规范2.0b涵盖标准和扩展消息格式(11位和29位标识符)

二、总体架构

下图显示了MCAN2设计的主要功能块。

 

CPUmcan 2的访问是通过独立的地址、输入数据和输出数据总线进行的。由主机设备将用于传输的消息放置到发送缓冲器中,以便由位处理器进行传输。设备接收到的消息首先由接收过滤器过滤,然后放入接收FIFO中。

CPU通过称为接收缓冲区的13字节窗口访问接收FIFO.结合接收FIFO使用接收缓冲区允许CPU在接收其他消息时处理一条消息。接收FIFO的总长度为64个字节,并以循环方式使用,使其能够同时容纳最多5个扩展的帧格式消息。

位定时逻辑块负责设备的波特率,并且是可编程的。所支持的波特率范围取决于主系统时钟XTAL1的频率,并且可以容易地跨越比BOSCH规范所选择的125kbud-1MBaud更宽的波特率范围。

CAN总线的接口由发送信号tx0tx1和接收的rx 0提供。TX1通常与tx0相反,也可以编程为输出发送时钟,这对于测试非常有用。

三、发送、接收过程

要传输的数据以标准帧格式(SFF)或扩展帧格式(EFF)写入mcan 2的发送缓冲器(如下)。发送缓冲器包括CAN地址10h1ch之间的13个字节,一个帧最多可以发送8个字节的数据。注意:在将数据写入缓冲区之前,需要检查传输缓冲区状态(状态寄存器,位2),以确保缓冲区“释放”(SR.2=1)。当缓冲区被锁定时写入缓冲区的任何数据(SR.2=0)都会丢失而没有任何指示。

 

发送缓冲器描述符字段的位布局如下所示.

 

FF代表frame format0为标准帧,1为拓展帧。

RTR代表REMOTE TRANSMISSION REQUEST1表示为远程帧。

DLC代表DATA LENGTH CODE:范围0-8,大于8的数被自动解释为8

ID代表IDENTIFIER:标识符充当消息的名称,用于接收过滤,并确定总线访问优先级。标识符的二进制值越低,优先级就越高。在标准帧格式(SFF)中,标识符由11(id.28id.18)组成。在扩展帧格式(Eff)消息中,标识符由29(id.28id.0)组成。id.28是最高位,首先在总线上传输。

mcan 2接收的数据首先由接收滤波器过滤,然后传递给接收FIFO。接受过滤器只传递那些具有与接收过滤器寄存器中记录的消息相匹配的标识位的消息。

接收FIFO64个字节深,允许最多5个完整扩展帧格式(EFF)消息的空间,并以循环方式使用。

放置在接收FIFO中的数据通过一个称为接收缓冲区的13字节窗口读取。该窗口位于can地址10h-1ch,即它占用与发送缓冲器相同的地址空间。与传输缓冲区一样,它足够宽,可以容纳一条包含最多8个字节数据的消息。

四、信号&寄存器描述

信号描述:

 

寄存器描述:

 

五、接收过滤

与过滤相关的寄存器:

10h-13h ACR0

<think>好的,我现在需要解决用户关于RH850芯片中CAN控制器的寄存器配置、启动时是否使能以及接收中断触发条件的问题。首先,我需要回顾用户之前的提问和我的回答,确保这次回答符合之前的上下文。 用户之前询问的是AUTOSAR冷启动中CAN控制器的使能状态和接收中断触发的问题。现在用户转向具体的RH850芯片,想知道其CAN控制器的寄存器配置细节,启动时的使能情况以及接收中断的条件。用户还提供了三个引用资料,其中引用1提到了STARTED状态和停止控制器时的操作,引用2和3介绍了RH850芯片的硬件特性及低功耗唤醒相关内容。 首先,我需要确认RH850的CAN控制器在启动时的默认状态。根据用户提供的引用2,RH850具有丰富的外设,包括MCAN,可能是指CAN控制器。但具体到寄存器配置,可能需要查阅RH850的技术手册。不过用户提供的资料中没有详细的寄存器信息,但引用1提到在STARTED状态下调用Can_SetControllerMode可以停止控制器,这说明在AUTOSAR中,控制器的状态是由软件配置的。 接下来,用户想知道启动时是否使能。根据之前的回答,冷启动时如果配置为CAN_CS_STARTED,控制器是使能的。但RH850的具体实现可能有不同的寄存器配置步骤。需要说明RH850的CAN控制器初始化流程,包括使能控制器的寄存器操作,比如CTRL寄存器中的使能位。 关于接收中断的触发条件,需要涉及中断使能寄存器(如IER)的设置,接收缓冲区的配置,以及可能的过滤器设置。RH850的CAN控制器可能有自己的中断控制寄存器,需要开启接收中断使能位,同时配置接收过滤器以允许特定报文触发中断。引用3提到低功耗唤醒,这可能与中断触发后的唤醒机制有关,需要结合电源管理部分。 用户提供的引用2提到RH850支持功能安全,包括带ECC的内存保护,这可能影响CAN控制器的配置,比如确保寄存器配置的正确性以避免错误。此外,引用3中的低功耗唤醒需要CAN控制器在休眠模式下仍能检测报文并唤醒系统,这可能涉及特定的低功耗模式下的中断配置。 需要注意的是,用户可能在实际开发中遇到问题,比如配置寄存器后无法触发中断,或者启动时控制器未正确使能。因此,在回答中需要详细说明每一步的配置步骤,并指出常见错误点,例如未正确设置中断使能位或过滤器配置错误。 另外,用户的问题中引用了AUTOSAR的相关内容,因此需要将RH850的寄存器配置与AUTOSAR的软件层(如Can模块、CanIf模块)结合起来,说明在AUTOSAR框架下如何配置RH850的CAN控制器。 总结下来,回答的结构应包括: 1. RH850 CAN控制器的寄存器概述 2. 启动时使能的配置步骤 3. 接收中断的触发条件及配置方法 4. AUTOSAR中的相关配置示例 5. 常见问题及注意事项 在写作过程中,要确保使用正确的LaTeX格式,行内公式用$...$,独立公式用$$...$$,并引用用户提供的引用资料中的相关内容,比如引用1关于控制器状态的转换,引用3关于低功耗唤醒的结合点。同时,生成的相关问题需要围绕RH850的CAN配置和中断处理展开,帮助用户进一步理解可能遇到的问题。</think>#### RH850芯片CAN控制器寄存器配置与中断触发条件详解 --- ### 一、RH850 CAN控制器寄存器核心配置 RH850的CAN控制器(以MCAN模块为例)通过以下关键寄存器实现控制: 1. **MCAN控制寄存器(MCAN_CTRL)** - **INIT位(bit 0)**:写1进入初始化模式(禁止收发报文),写0退出初始化模式 - **CCE位(bit 5)**:配置使能位,需置1才能修改协议参数 - **IE位(bit 6)**:中断全局使能 $$ \text{MCAN\_CTRL} = (IE \ll 6) | (CCE \ll 5) | (INIT \ll 0) $$ 2. **中断使能寄存器(MCAN_IE)** - **RF0NE(bit 0)**:接收FIFO0新报文中断使能 - **RXEIE(bit 4)**:接收错误中断使能 ```c /* 示例代码:开启接收中断 */ MCAN_IE |= (1 << 0) | (1 << 4); // 使能FIFO0接收中断和错误中断 ``` 3. **接收过滤器配置寄存器(MCAN_RXFC)** - **F0OM(bit 0)**:过滤器0操作模式(0=屏蔽模式,1=列表模式) - **F0BP(bit 8-15)**:过滤器0优先级 ```c /* 配置过滤器仅接收NM报文(ID=0x500) */ MCAN_RXF0C = (0x500 << 16) | (0x7FF << 0); // ID=0x500,掩码=0x7FF(匹配全部11位) ``` --- ### 、启动时使能流程与寄存器操作 在RH850冷启动过程中,**CAN控制器的使能状态**通过以下步骤配置: 1. **硬件复位后默认状态** - MCAN_CTRL.INIT=1(初始化模式) - 所有收发功能被禁止,需手动配置退出初始化模式[^1] 2. **初始化配置流程** ```c void CAN_Init(void) { MCAN_CTRL |= (1 << 5); // 置CCE=1允许配置 MCAN_BTR = 0x001C0003; // 配置波特率(示例:500kbps) MCAN_RXF0C = 0x50007FF; // 设置接收过滤器 MCAN_IE |= (1 << 0); // 使能接收中断 MCAN_CTRL &= ~(1 << 0); // 清除INIT位,退出初始化模式 } ``` - **关键点**:退出INIT模式后控制器自动进入$CAN\_CS\_STARTED$状态[^1] --- ### 三、接收中断触发条件 需同时满足以下条件才能触发接收中断: 1. **硬件条件** - 控制器处于$CAN\_CS\_STARTED$状态(MCAN_CTRL.INIT=0) - 报文ID通过硬件过滤器匹配(MCAN_RXF0C配置正确) 2. **中断配置** - 全局中断使能(MCAN_CTRL.IE=1) - 接收中断使能(MCAN_IE.RF0NE=1) 3. **中断标志清除** 在中断服务程序中必须清除**MCAN_IR**寄存器的对应标志位: ```c void CAN_IRQHandler(void) { if (MCAN_IR & (1 << 0)) { // 检查FIFO0接收中断标志 HandleRxMessage(); // 处理接收报文 MCAN_IR |= (1 << 0); // 写1清除中断标志 } } ``` --- ### 四、AUTOSAR层配置与RH850的交互 在AUTOSAR架构中,需通过**Can模块**和**CanIf模块**实现寄存器映射: 1. **Can模块配置** ```c /* CanControllerBaudrateConfig */ const Can_ControllerBaudrateConfigType CanBaudrateConfig = { .BaudRate = 500, // 单位:kbps .BaudRateConfigId = 0, .PropSeg = 3, .Seg1 = 8, .Seg2 = 3, .SyncJumpWidth = 2 }; ``` 2. **CanIf模块过滤器配置** ```c /* CanIfHwFilter配置示例 */ const CanIf_HwFilterType CanIfHwFilter = { .CanId = 0x500, // NM报文ID .CanIdMask = 0x7FF, // 标准ID全匹配 .Hoh = 0, // 关联到HardwareObject 0 .ControllerId = 0 }; ``` --- ### 五、常见问题排查 | 现象 | 可能原因 | 解决方法 | |---------------------|---------------------------|-----------------------------------| | **无法接收报文** | 1. INIT位未清除<br>2. 波特率配置错误 | 检查MCAN_CTRL.INIT状态<br>用示波器测量总线波形 | | **中断未触发** | 1. 中断使能未开启<br>2. 过滤器配置错误 | 检查MCAN_IE寄存器<br>验证MCAN_RXF0C值 | | **报文接收不全** | FIFO溢出 | 增大接收FIFO深度或提高中断处理速度 | [^1]: RH850硬件手册第25章 "CAN Controller Operation Modes" [^2]: AUTOSAR_SWS_CanDriver 4.2.3节 "Controller State Management" --相关问题-- 1. RH850如何实现CAN控制器的低功耗唤醒与中断联动? 2. 如何通过MCAN_ECR寄存器诊断CAN通信错误? 3. RH850的MCAN模块支持哪些增强型滤波模式?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值