4. CAN/CAN-FD通信协议与EyeQ报文处理
EyeQ域控制器通常挂载多路CAN/CAN-FD总线,一路接底盘/动力,一路接车身,一路接诊断或私有传感器总线。要让EyeQ正确收发报文,必须同时理解两件事:CAN/CAN-FD协议本身如何组织一帧数据,以及EyeQ的CAN控制器如何把帧搬进内存并通知CPU。本节围绕帧格式、位定时、过滤器、FIFO、中断与DMA六个环节,给出可落地的配置思路。
一、帧格式:经典CAN与CAN-FD的差异
经典CAN帧由帧起始SOF、仲裁段(11位或29位ID+RTR)、控制段(IDE、r0、DLC)、数据段(0~8字节)、CRC段、ACK段和帧结束EOF组成。CAN-FD在此基础上做了三处关键改动:一是控制段新增FDF、BRS、ESI三位,FDF区分经典帧与FD帧,BRS决定数据段是否切换到更高速率,ESI指示发送节点错误状态;二是DLC采用4位编码,0~8仍表示字节数,9~15分别映射为12、16、20、24、32、48、64字节;三是CRC场根据数据长度使用17位或21位CRC并加入填充位计数,可靠性更高。
在EyeQ上配置时,需要先明确每条总线的工作模式:经典CAN、FD无速率切换(ISO CAN-FD without BRS)还是FD带速率切换(with BRS)。若总线上既有经典节点又有FD节点,通常让FD节点以无BRS方式发送,避免经典节点因位速率切换而报错。DLC映射必须由软件显式处理,例如收到DLC=9时,实际数据长度是12字节,不能按9字节解析。
二、位定时:采样点与速率切换
位定时决定一个位时间内各段的时间份额。一个位时间由同步段SYNC_SEG、传播段PROP_SEG、相位缓冲段PHASE_SEG1和PHASE_SEG2组成,采样点位于PHASE_SEG1结束处。常用参数包括:prescaler(波特率预分频)、tseg1(PROP+PHASE_SEG1)、tseg2(PHASE_SEG2)、sjw(同步跳转宽度)。采样点位置 = (1 + tseg1) / (1 + tseg1 + tseg2)。工程上仲裁段采样点建议取75%~87.5%,数据段可略高。
以EyeQ常见40MHz CAN时钟、500kbps仲裁段为例:取prescaler=5,则时间份额tq=125ns,位时间=8μs=64tq。若tseg1=47、tseg2=16,采样点=(1+47)/64=75%。数据段若切到2Mbps,tq仍为125ns时位时间仅4μs=32tq,可设tseg1=23、tseg2=8,采样点75%。配置时务必保证同一总线上所有节点的仲裁段位定时一致,数据段位定时也一致,否则BRS切换后会出现位错误。
三、过滤器:把报文分流到正确的接收通道
EyeQ的CAN控制器通常提供多组过滤器,每组可配置为范围过滤、掩码过滤或精确ID过滤。过滤器的作用是决定哪些报文进入哪个RX FIFO或专用接收邮箱。典型做法是:安全关键报文(如车速、转向角)用精确ID过滤进入高优先级FIFO;诊断报文(0x7DF~0x7E7)用范围过滤进入诊断FIFO;其余报文用掩码过滤进入普通FIFO或直接丢弃。
配置过滤器时要同时设置filter_id、filter_mask、filter_type和fifo_assignment。掩码位为1表示该位必须匹配,为0表示忽略。例如要接收ID 0x100~0x10F的标准帧,可设filter_id=0x100、mask=0x7F0,这样低4位被忽略,高7位匹配。注意FD帧的FDF位和扩展帧IDE位通常也参与过滤,需在过滤控制寄存器中明确是否接受FD帧和扩展帧。
四、FIFO:深度、水印与溢出处理
EyeQ的CAN控制器一般提供多个RX FIFO,每个FIFO有固定深度(例如6~32个报文槽)。FIFO深度要按最坏情况估算:若某路总线在10ms内可能突发20帧,而应用任务周期是10ms,则FIFO深度至少20,并留2~4帧余量。水印阈值用于触发中断或DMA请求,可设为半满或接近满。若FIFO溢出,控制器会置溢出标志并可能丢弃新报文,因此必须在初始化时使能溢出中断,并在中断服务中读取状态寄存器、清标志、记录丢失计数。
实际配置时,建议把高实时性报文放在浅FIFO但高优先级通道,把诊断和日志类报文放在深FIFO,避免诊断长报文阻塞安全报文。同时注意FD帧最长64字节,一个FIFO槽占用的RAM空间比经典帧大,深度计算要按最大帧长折算。
五、中断与DMA:把CPU从搬运中解放出来
中断方式适合低速率、低延迟要求的报文:FIFO非空即触发RX中断,CPU在ISR中读取报文并放入软件队列。若总线负载较高(如500kbps下负载率超过50%),每帧一次中断会造成较大CPU开销。此时应使用DMA:配置DMA通道源地址为CAN RX FIFO数据寄存器,目的地址为SRAM中的环形缓冲区,传输宽度按字或半字,传输长度按FIFO水印或帧数设置。DMA完成一次搬运后产生中断,CPU只需处理整批报文。
在EyeQ上配置DMA时要注意:CAN外设与DMA之间的握手信号通常由FIFO水印或“新报文”标志触发;DMA传输不能跨越FIFO边界,需按槽对齐;若使用链表模式,每个描述符对应一个FIFO槽。中断优先级上,CAN RX中断应高于普通任务但低于安全监控中断,避免长时间关中断导致FIFO溢出。
六、配置检查与常见问题
完成上述配置后,建议按以下顺序验证:先进入回环模式发送已知ID和DLC的帧,确认过滤器命中、FIFO计数增加、中断或DMA触发;再接入真实总线,用CAN分析仪对比收发计数。常见问题包括:采样点不一致导致偶发位错误;DLC映射未处理导致FD长帧被截断;过滤器掩码写错导致报文进错FIFO;FIFO深度不足导致突发丢帧;DMA目的地址未按32字节对齐导致传输错误。逐项检查这些点,基本可以保证EyeQ的CAN/CAN-FD报文处理链路稳定工作。