(四)LIN协议实践指南

IAP和OTA(基于LIN)

实践篇

  • IAP和OTA(基于LIN)
  • 效果演示
  • 操作要点
  • boot与app划分
  • 关键代码解析
  • 上位机设置
  • 报文解析
  • 注意点:
  • 尾声
  • 参考链接
  • 效果演示

    LIN_test

    由视频可以看到,开始我们烧录了Lin_uds_ota(boot)进入flash,之后用图莫斯进行LIN UDS固件升级可以正常更新app到flash 的0xc800地址上,然后读取出升级之后flash里边的内容,发现不仅有Lin_uds_ota(boot),也存在Tproject(app)。

    操作要点

    boot与app划分

    首先需要划分boot和app在芯片flash的哪个地址,因为KF32A156MQV这块芯片flash起始地址为0x0000 0000,所以我将boot设置大小为48K,之后48-50K用于存储标志位,之后从50-512k设置为APP的存储区域。
    分区

    划分boot和app

    关键代码解析

    工程代码主要包含Lin.c、Lin_Uds.c、Lin_buffer.c、Lin_bootloader.c。
    Lin.c:底层LIN总线驱动
    Lin_buffer.c:是一个队列,可以存储最多64帧数据
    Lin_Uds.c:主要用于解析单帧,首帧和续帧,把真正的有用的UDS数据保存起来。
    Lin_bootloader.c:对接收来的UDS数据进行解析,每个不同的服务,处理不同的功能。

    上位机设置

    10服务,进入编程会话,

    更新

    11服务,复位

    报文解析

    “10 02”,切换为编程会话

    “31 01 FF 00”,例程控制,用于擦除APP

    “34 00 44 00 00 C8 00 00 00 51 E0”,要烧录到哪个地址,烧录多少字节,一次可以传输多少字节

    “36 XX 数据1 数据2 数据3 数据4…”

    36服务应答

    37服务,退出传输
    11服务,ECU复位

    注意点:

    1.在使用0x37服务的时候,如果每次传输刚好是1024字节的话,那没有问题,如果到最后不足1024字节,比如480字节,此时需要注意,要补足1024字节再烧录,因为这款芯片比较特殊,必须是1024的倍数。480烧录时烧录失败的,这也就是为什么视频最后boot_app.hex读取出来的值和app.hex对比后边有那么多FF,因为擦除也是填充的FF,所以,用FF代替不足1024字节的部分

    2.在上位机发送比如0x36烧录程序的服务时,我们需要先发送 “7F SID 78” ,意思是让上位机先等一等,因为在将数据下载到flash是关中断的,不允许被打断的,这样子ECU就没法对上位机进行响应,烧录完数据之后,再给上位机肯定响应

     case 0x31:
          if((DataLen>=3)&&(pData[0]==0x01)&&(pData[1]==0xFF)&&(pData[2]==0x00)){//Erase Flash Memory
            printf("Erase Flash Memory\r\n");
            uint8_t res[2]={SID,0x78};//Request Correctly Received Response Pending
            LIN_BOOT_Response(0x7F,res,2);
            pData[3] = LIN_BOOT_EraseApp();
            LIN_BOOT_Response(SID|0x40,pData,4);
          }
    

    尾声

    网上关于LIN进行IAP的讲解很少,例程参考更是少只有少,本例程参照图莫斯管方提供的LIN UDS例程进行修改,该例程是基于stm32f405的。在此基础上适配了KF32A156MQV。在此感谢图莫斯官方。另外,如果文章有什么不对的地方,欢迎大家指正。

    参考链接

    hex文件解析
    图莫斯提供的LIN UDS例程

    作者:羽翼未丰的啊博

    物联沃分享整理
    物联沃-IOTWORD物联网 » (四)LIN协议实践指南

    发表回复