时间:2024-05-04
文/张席旗 白创
(长沙理工大学物理与电子科学学院 湖南省长沙市 410114)
CAN控制器局域网[1-2](Controller Area Network)是一种高抗干扰性、高可靠性、高实时性和高性价比的现场总线[3]之一,它能有效地提供分布式实时控制[4],且具有非常高的安全级别[5],其通信速率可达1Mbps[6]。因此广泛应用于汽车、工业自动化、数字信号处理(DSP)等领域[7-8]。
在传统的CAN模块设计中,会有传输速率较慢、传输资源较少、传输时间不确定、抗干扰性较弱等缺陷。例如,在基于单片机的CAN模块[9]会出现传输数据较少和抗干扰性较弱的现象。在基于CPI系统总线的3U结构的CAN模块[10]其设计上采用双口RAM的缓冲区结构,虽然克服了丢帧现象,但是传输速率不快。本文所设计的ECAN模块,带有32个消息邮箱且每个邮箱都带有时间戳计数器寄存器以及消息对象超时寄存器,这样总线传输的数据量更大、速率更快以及通信更加灵活可靠。
ECAN模块是与CAN2.0B标准协议完全兼容。ECAN模块是带有32个完全可配置的邮箱和定时邮递(time-stamping)功能的增强型CAN总线模块,它能够实现灵活稳定的串行通信接口。与其它的CAN模块相比,它主要增加了邮箱的数量、时间标识和超时功能。ECAN总线模块框图如图1所示。
ECAN控制器的内部是32位的,主要由以下几部分构成:
(1)CAN协议内核(CPK);
(2)消息控制器:存储器管理单元(MMU)、CPU接口、接收控制单元(接收滤波)和定时器管理单元;可以存储32个消息的邮箱存储器;控制和状态控制器。
CAN 协议内核(CPK)的两个功能:解码在CAN总线上接收到的所有消息,并把这些消息转移到接收缓冲器;根据CAN协议传输CAN总线上的消息。
CAN控制器的消息控制器是负责确认CPK接收到的消息是否被CPU使用还是被丢弃。
本文所设计的ECAN模块硬件电路代码主要由ecan_rece、ecan_regs、ecan_txd、ecan_rxd四部分组成。其中ecan_rece主要是根据CAN协议对总线上接收到的消息和所需要发送的消息按照协议进行处理;ecan_regs模块主要用于控制状态寄存器进行相关处理以及对于邮箱空间的读写访问;ecan_txd模块用于将需要发送的消息发送至CAN总线;ecan_rxd模块主要用于接收CAN总线的数据并将数据传递给ecan_rece模块。ECAN硬件设计模块结构图如图2所示。
图1:ECAN总线模块框图
图2:ECAN硬件设计模块结构图
1.2.1 ecan_rece模块
图3:时间标识功能流程图
图4:消息发送或接收超时功能流程图
图5:初始化进程流程图
ecan_rece模块接收到有效的消息后,对消息进行解码分析,确定是否将接收到的消息存储到邮箱存储器中。接收控制单元检查消息的状态、标识符和所有消息对象的滤波,确定相应邮箱的位置,接收到的消息经过滤波后存放到第一个邮箱。如果接收控制单元不能找到存放接收消息的有效地址,那么接收到的消息将会被丢失。
图6:ECAN模块数据发送流程图
图7:ECAN模块数据接收流程图
图8:数据帧格式
1.2.2 ecan_regs模块
ecan_regs模块包含控制状态寄存器、邮箱读写配置寄存器以及ECAN模块配置、中断等各种寄存器。其中ECAN模块的时间标识功能以及超时功能就在此模块进行设计。
ECAN模块每个邮箱内部都有消息对象时间戳寄存器(MOTS),当消息成功发送或者接收时,该寄存器会分别记录下当时消息发送和接收时刻时间戳计数器(CANTSC)的值。这样通过计算消息发送和成功接收到的差值就可以得到消息传输的时间。时间标识功能流程图如图3所示。
图9:ECAN数据发送接收
图10:ECAN数据发送移位
图11:代码覆盖率
ECAN模块的每个邮箱内部都有消息超时寄存器(MOTO),当发送消息或接收消息时,消息超时寄存器(MOTO)中的值会与时间戳计数器(CANTSC)中的值进行比较。若时间戳计数器(CANTSC)中的值大于消息超时寄存器(MOTO)中的值,则超时控制寄存器(CANTOC)以及超时状态寄存器(CANTOS)会被置1,此时表示发送消息或接收消息已超时。消息发送或接收功能流程图如图4所示。
1.2.3 ecan_txd模块与ecan_rxd模块
当需要发送消息时,消息控制器将要发送的消息传送到ecan_txd模块,以便在下一个总线空闲状态开始发送该信息。当有多个消息需要发送时,ecan_rece模块将准备发送消息中优先级最高的传送到ecan_txd模块。如果两个邮箱有相同的优先级,选择邮箱编号大的邮箱内存放的消息。
当需要接收消息时,消息控制器将接收到的消息传送给ecan_rxd模块,然后ecan_rxd模块对接收到的数据进行位填充、错误检测等处理,以供CPU读取。
在使用CAN模块前必须将其初始化。将主控制寄存器的更改配置请求位CCR(CANMC.12)置1,表示启动初始化配置模式;将错误和状态寄存器的更改配置使能位CCE(CANES.4)置1,激活初始化配置模式。当CCE和CCR都为1时,ECAN控制器的位定时参数位被使能,配置位定时参数完成后;CCR置0,ECAN模块进入正常模式。ECAN模块初始化进程流程图如图5所示。
CPU将需要发送的数据先存放到ECAN模块的发送邮箱。使能邮箱使能位CANME[n],当数据和标识符写入发送邮箱后,此时将相应的发送请求设置位CANTRS[n]置位,消息便会发送出去。ECAN模块数据发送流程图如图6所示。
ECAN模块中数据以报文的形式进行传输,当到达一个节点时ECAN控制器会将接收到的报文的标识符与ECAN控制器内的各个邮箱标识符相比较;若报文标识符与ECAN控制器内相应的邮箱标识符相匹配,则ECAN控制器将相应的接收消息挂起位CANRMP[n]置位,并产生中断;若报文标识符与ECAN控制器内所有的邮箱标识符都不匹配,则ECAN控制器不接收此报文。ECAN模块数据接收流程图如图7所示。
ECAN模块的硬件设计是采用Verilog HDL硬件语言进行描述,在cadence环境下调用SimVision进行仿真。ECAN模块中有两个CAN控制器,分别为CANA和CANB。选择CANA为接收,CANB为发送,CANB按照CAN协议向CANA中发送如图8所示的标准数据帧。
在此次仿真中,前一段时间是在进行ECAN各个寄存器的配置,配置完成后,检测到起始帧SOF后开始发送数据。选择发送一个ID为00000000001(按照CAN协议的规定仲裁域部分为12位,前11位为ID第12位为RTR位,数据帧中RTR位为0)的数据域为每字节8位的8字节数据的标准帧。如图9所示,数字域为每字节8位的8字节的标准数据帧共108位,因为帧结尾是7位高电平,所以在设计中发送完ACK低电平之后,总线就会拉高。
每当信号data_rlf上升沿来到时send_data经过一个周期的延时向左移一位,总共移位83次,CRC校验域是通过算法计算所得。按照CAN协议中的CRC填充准则,当总线上出现每五个相同电平时,总线会发送一个与之前相反的填充电平,这样避免总线上出现太多连续相同的电平时,使收发双方失步,导致仿真错误。在图9中CANA接收的数据的后四位为CRC计算值。CANBTX向CANARX发送时同时也会给CANBRX发送,当CANARX和CANBRX接收到数据相同时则会产生一个ACK应答信号(低电平)。当CANBTX发送的数据与CANARX接收的数据一样时,CANATX也会给一个ACK应答信号。ECAN数据发送移位仿真图如图10所示。
利用Cadence软件中的NC-Verilog编译器,来测试代码覆盖率。仿真结果如图11所示,结果显示所设计的代码的覆盖率均达到100%。
本文设计的ECAN模块,完全兼容CAN2.0B协议,通过仿真验证ECAN模块中CANB发出的数据CANA成功收到且CRC校验正确,ACK应答信号在CANA收到正确的数据后成功拉低,最后成功实现了ECAN模块的通信。
我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自各大过期杂志,内容仅供学习参考,不准确地方联系删除处理!