107、软件补偿与重传机制:基于CAN控制器实现长距离可靠通信
007、软件补偿与重传机制:基于CAN控制器实现长距离可靠通信一、从一次凌晨三点的现场崩溃说起去年在西南某水电站的调试现场,我盯着逻辑分析仪上那堆乱码,血压比发电机转速还高。CAN总线长度超过800米,波特率设到125kbps,理论上应该能跑,但实际数据帧的CRC错误率高达17%。更诡异的是——白天正常,一到深夜就频繁丢帧。后来发现是夜间温度骤降导致线缆阻抗变化,加上地电位漂移,把CAN控制器的采样点逼到了信号畸变的悬崖边上。那次之后我彻底明白:硬件上能做的极限优化(比如加中继器、换双绞屏蔽线、调终端电阻)都试过了,剩下的坑必须靠软件来填。今天这篇笔记,就聊聊怎么用CAN控制器的内置机制和软件策略,把通信距离再往外推一推。二、采样点重配:被大多数人忽略的“软补偿”很多工程师以为CAN控制器的采样点配置是出厂定死的,其实大部分主流控制器(比如SJA1000、MCP2515、STM32的bxCAN)都允许通过寄存器调整采样位置。长距离通信时,信号边沿变缓,总线延迟增大,默认的采样点(通常在位时间的60%-70%位置)可能正好落在信号跳变的抖动区。我踩过的坑:某次用STM32F407的bxCAN,默认采样点设在87.5%(这个值对短距离没问题),但拉到600米后,总线上的隐性到显性跳变被线缆电容拉成了斜坡,采样点正好卡在阈值附近,导致连续误码。后来把采样点前移到75%,误码率直接降了80%。具体操作:以1Mbps波特率、16个时间份额(TQ)为例,把同步段(SS)设为1TQ,传播段(PTS)设为3TQ,相