本帖最后由 TechHolder 于 2019-8-8 23:04 编辑
AC781X CAN模块应用笔记
1 CAN模块介绍
1.1 CAN特性
1. 支持CAN2.0A/CAN2.0B标准
2. 支持高达1Mbit/s的可编程比特率
3. 9个接收缓冲区,先进先出规则(FIFO)
4. 两级发送缓冲区,主发送缓冲区(PTB)只有一个消息缓冲区,次发送缓冲区(STB)则有5个消息缓冲区
5. 16个可独立编程的29位接收过滤器
6. 扩展状态与错误报
7. 可配置的中断资源
8. 带集成式低通过滤器的可编程唤醒功能
1.2 CAN通用操作
1.2.1 接收缓冲区
可设置接收过滤器过滤不需要的数据,以减少MCU的负载。只有经过接收过滤器检查的数据,才会将其缓冲到接收缓冲区中(RB)。接收缓冲区可容量最多9帧CAN数据,并具有FIFO行为,即先进先出,当接收缓冲区满后,可配置最新数据覆盖最旧数据或者最新数据直接丢弃。 当接收缓冲区已满或已经达到配置的“几乎满”限制时,CAN模块会在接收每帧数据时产生中断。
1.2.2 发送缓冲区
主发送缓冲区(PTB)具有高优先级,但只能缓冲一帧数据。次发送缓冲区(STB)优先级较低,但可以在FIFO或优先级模式下运行;可使用STB发送一帧或发送所有的数据,在FIFO模式下,首先发送最先进入缓冲区的数据,在优先级模式下,首先发送该缓冲区内ID优先级最高的数据。 主发送缓冲区的数据始终比次发送缓冲区的数据的优先级高。 请求发送主发送缓冲区的数据时,如果正在发送次缓冲区中的某一帧数据,那么则要等待该帧发送完成后,才开始发送主发送缓冲区的数据。
1.2.3 总线关闭 当CAN的发送错误计数器超过255,则自动进入“BUSOFF”状态,如果使能了BEIE,一旦产生BUSOFF故障,就会立即产生对应的中断,并且会将BUSOFF置位;从BUSOFF状态恢复到正常情况有2种途径,重新初始化CAN模块或接收到128组11bit的隐形位后自动恢复,目前车身控制使用最多的还是手动对CAN模块进行初始化,以让其进入正常模式工作。
CAN_H或者CAN_L对VCC或对GND短接、CAN_H与CAN_L短接都会导致CAN BUSOFF。
1.2.4 波特率与采样点 使用CAN传输数据时,波特率与采样点是两个非常关键的设置。 图1-1 CAN位时定义 上图展示的就是1bit的时间组成,在AC781x的CAN模块中,直接定义成了segment1与segment2,segment1结束时就是采样点。 BandRate = (48M / (S_PRESC + 1) / ((S_SEG_1 + 2) +(S_SEG_2 + 1))). tSeg1 = (S_SEG_1 + 2); tSeg2 = (S_SEG_2 + 1).
SamplePoint = (tSeg1 / (tSeg1 + tSeg2)).
1.2.5 休眠唤醒 MCU进入休眠之后,CAN模块接收数据能够唤醒MCU。 表1-2 CAN支持唤醒低功耗模式 在进入休眠模式之前,需要对唤醒源进行配置。在ATC_AC781x_ReferenceManual_CH第6章“系统电源管理”中有描述,在寄存器REG_EN_PERIPH_WAKEUP中使能期望的唤醒源,CAN模块默认是禁能状态。调用库SPM_EnableModuleWakeup(SPM_MODULE_CANx)使能CAN模块唤醒,就能将MCU从休眠模式中唤醒,Standby模式除外。
2 驱动库 2.1 寄存器驱动
3 例程介绍 3.1 总述 共3个子例程用以阐述CAN的各种功能使用,包括基本收发数据,CAN 总线关闭恢复,CAN唤醒休眠MCU,每个子例程对应一个宏定义,通过修改CAN_SAMPLE_SEL选择不同的子例程。
3.2 例程功能概述 表3-1 例程功能描述 在3个子例程中,通过RECV_FRM_KIND_SE选择接收数据类型ONLY_RECV_STD_FRM,ONLY_RECV_EXT_FRM,RECV_STD_EXT_BOTH_FRM。
欢迎各位坛友指正,后续会根据问题持续更新。
|