
这篇文章讲述的是使用LKS32MC077x芯片基于普通 UART 外设模拟 LIN 总线协议实现无烧录器固件更新。一、LIN协议LIN协议是CAN协议的青春mini版一般用于低速率的汽车ECU通信。1.1 LIN 标准帧结构部分内容发送者规则报头HeaderBreak 信号 同步字节 0x55 PID带校验的 ID永远是主机所有通信必须由主机发起从机不能主动发报头响应Response1~8 字节数据 校验和该 ID 的发布者主机 / 从机均可主机发完报头后约定的发布者填充数据1.2 协议具体实现LIN协议是一主多从的模式主机永远作为开始发报头数据的一端在PID端带了发送数据的ID号。BREAK信号是由至少13个低电平至少1个高电平组成主机在发送完BREAK信号后就发送同步字01010101同步字之后就是PID字节其中的低六位是接下来要发送的设备的ID号而bit6和bit7是这个ID号的校验如果从机识别到的ID号是主机端那么从机就做好接收数据的准备如果是从机端那么从机开始回复响应并且执行对应操作二、代码整体结构层级对应代码核心作用硬件驱动层main 函数初始化 寄存器操作配置 GPIO、UART、定时器、Flash 外设协议解析层UART1 中断状态机 CheckRecvData逐字节解析 LIN 单帧多帧拼接成完整指令包业务逻辑层HandleXXX 系列函数执行升级逻辑参数校验、写 Flash、固件校验、跳转三、OTA 升级完整交互流程开始升级主机发SID_OTA指令 → 从机校验参数 → 应答主机 → 中断中擦除 Flash分包传输主机循环发SID_File数据包 → 从机逐包写入 Flash → 每包返回应答 → 累计写入进度固件校验固件全部写完自动进入校验 → 逐 4 字节读 Flash 计算校验值 → 对比标准值跳转运行校验通过后主机发SID_Jump指令 → 从机置跳转标志 → 主循环关中断、设栈、跳转至新固件四、疑问1LIN在发送一帧请求帧后就需要回复一帧应答帧那么在传输OTA固件的时候也需要这样传输吗是的。在传输OTA过程中由于采用的Wifi模块和MCU之间通信采用的是LIN协议而在LIN协议中从机永远没有总线控制权绝对不能主动发起任何传输。所有通信必须由主机先发报头来调度。所以传输步骤为第一帧是主机发送主机应答这帧数据里主机发送的报头数据里ID为其自己后面跟着的应答数据为8byte的OTA固件第二帧为主机发送从机应答主机发送的报头数据里ID为从机ID从机识别报头后知晓是自己的ID然后开始发送应答数据表示自己收到了这一帧OTA数据包。这样一次传输就完成了。循环往复直到所有固件发完。2在LIN传输OTA包的时候从机怎么知道包的长度怎么确定现在接收到包有没有超过要发送的包的大小在开始OTA升级的时候主机会发送当前OTA固件的长度以及其他的配置信息这些信息大于8byte不能只用1帧数据就传输完成所以会分成好几帧来发送等固件信息发送完毕后就开始正式接受固件内容固件分批次发送每一批的第一帧的前两个字节代表这次会发送多少字节的固件等接收完这批固件后就开始写入flash并且记录当前写入的字节数和固件的总字节数进行对比如果小于就重复接受下一批次的固件等到大于等于固件总字节数就标志着固件接收完成。