[资源分享] AC7811上实现CAN网络管理以及15765诊断功能

[复制链接]
18737|38
 楼主| JasonLee27 发表于 2020-6-18 15:32 | 显示全部楼层 |阅读模式
本帖最后由 JasonLee27 于 2020-6-18 15:32 编辑

硬件环境:AC7811通用开发板  周立功USBCAN软件环境:Keil 5.23

看到有坛友提到关于CAN协议方面的移植,想起来自己之前写过一些,不过还只是一个半成品,就算是抛砖引玉吧
附件包含了网络管理的例程以及UDS的例程
WeChat Screenshot_20200618145218.png
网络管理的例程是参照OSEK 2.5.2的文档实现的。
诊断TP层参照15765-2标准。应用层参照14229标准,大部分变量,函数名称,宏定义都直接取自标准。大家可以参照标准来对照理解。

这里主要讲下功能的验证:
网络管理:
单个节点的话,用CAN盒接收报文的顺序应该如下,9帧alive和ring报文后,单节点进入跛行。时间间隔分别是100ms,260ms,1000ms。
WeChat Screenshot_20200618145838.png

如果你手里有两块以上的板子,可以进行建环测试,改一下nodeID,范围0~1F。
WeChat Screenshot_20200618150045.png
这是我两个node测试的结果,在单节点跛行的情况下加入一个新的节点并建环,这里可以用两块板子测试,也可以用一块板子的两路CAN测试(我的代码应该可以支持多路网络管理,修改代码即可实现)
WeChat Screenshot_20200618150240.png
另外网络管理还实现了休眠和唤醒操作,通过按键KEY6,KEY7实现,大家可以自行测试一下(这里只让网络管理休眠了,没有让MCU整个休眠,有需要的可以自行添加)

诊断的话有三份代码,一份是bootloader,一份是app,还有一份client是测试升级用的客户端代码。
测试诊断必须要准备两个板子了,一个板子烧写bootloader和app,此时就已经可以用周立功的CAN工具里面自带的诊断功能进行测试了(应用层只实现了一些基本的会话切换以及34,36,37服务,大多数服务应该都会回消极响应了,响应的逻辑基本参照14229里面提供的负响应判断逻辑,有根据自己以往的经验稍作修改:
WeChat Screenshot_20200618150720.png

诊断的升级功能,我这里实现的非常简单,因为按照完整的FBL流程,我有太多东西需要做了
升级我仅仅实现了10,11,34,36,37服务,用于复位,以及下载,至于其他的前期后期的工作就都省了。
升级的流程可以看下client里面的代码实现,先通过10服务切换至编程模式,按FBL定义,收到编程会话请求后会复位进入bootloader并保持。后面再通过34,36,37服务将代码传输到目标板。升级完成后复位,目标板就运行了新的app了。
  1. const uint8_t step1[]={0x02, 0x10, 0x03};
  2. const uint8_t step2[]={0x02, 0x10, 0x02};

  3. uint8_t sendData[520];
  4. #define StepToal    2
  5. const uint8_t *step[2]=
  6. {
  7.     step1,
  8.     step2,
  9. };
  10. int udsClientLoop(void)
  11. {
  12.     uint16_t index=0;
  13.     uint8_t seq=0;
  14.     uint16_t i;
  15.     uint32_t totalCount=sizeof(data);
  16.     uint32_t transferCount;
  17.     for (index=0;index<StepToal;index++)
  18.     {
  19.         TpTransmit(0, &step[index][1], step[index][0]);   
  20.         while (s_waitRes==0);
  21.         s_waitRes=0;
  22.         mdelay(100);
  23.     }
  24.     index = 0;
  25.     sendData[index++] = 0x34;
  26.     sendData[index++] = 0x00;
  27.     sendData[index++] = 0x44;
  28.    
  29.     sendData[index++] = 0x08;
  30.     sendData[index++] = 0x00;
  31.     sendData[index++] = 0x80;
  32.     sendData[index++] = 0x00;
  33.    
  34.     sendData[index++] = (totalCount>>24) & 0xff;
  35.     sendData[index++] = (totalCount>>16) & 0xff;
  36.     sendData[index++] = (totalCount>>8) & 0xff;
  37.     sendData[index++] = totalCount & 0xff;
  38.    
  39.     TpTransmit(0, sendData, index);   
  40.     while (s_waitRes==0);
  41.     s_waitRes=0;
  42.     mdelay(100);
  43.     transferCount=0;
  44.     while (transferCount < sizeof(data))
  45.     {
  46.         index = 0;
  47.         uint16_t count=0;
  48.         sendData[index++] = 0x36;
  49.         sendData[index++] = seq++;
  50.         if ((totalCount - transferCount) > 128)
  51.         {
  52.             count = 128;
  53.         }
  54.         else
  55.         {
  56.             count = totalCount - transferCount;
  57.         }
  58.         for (i=0;i<count;i++)
  59.         {
  60.             sendData[index++] = data[transferCount++];
  61.         }
  62.         TpTransmit(0, sendData, index);
  63.         
  64.         while (s_waitRes==0);
  65.         s_waitRes=0;
  66.         
  67.         mdelay(100);
  68.     }
  69.     index = 0;
  70.     sendData[index++] = 0x37;
  71.     TpTransmit(0, sendData, index);
  72.    
  73.     while (s_waitRes==0);
  74.     s_waitRes=0;
  75.     mdelay(10);
  76.     index = 0;
  77.     sendData[index++] = 0x11;
  78.     sendData[index++] = 0x01;
  79.     TpTransmit(0, sendData, index);
  80.     while (1)
  81.     {
  82.         
  83.     }
  84.     return 0;
  85. }
升级文件的制作通过编译app,会在project下生成一个uds_demo.h,这个是将app生成的bin文件转为数组,然后把这个文件替换到client的代码中即可。
这是测试过程中目标板的打印,升级后打印从update变成了old(事先烧的打印是update的)。说明app已经被替换。
  1. this is boot
  2. this is a update App
  3. this is boot
  4. this is boot
  5. this is a old App
诊断的ID定义如下

  1. #define NPDUidPhys      (0x702)
  2. #define NPDUidFunc      (0x700)
  3. #define NPDUidDiag      (0x701)


诊断的应用层感觉写的不是很好,但CANTP写的还算凑合。

总结来说,网络管理要实现起来还是比较简单的,代码量也不大,但诊断的代码量确实有点大了,应用层的逻辑也多,自己完全实现起来还是比较费脑子的,但如果框架搭好了,那代码量也就是时间的问题了。

另外,我手里没有CANoe也没有测试用例,网络管理和诊断都没有做完整的测试,只能简单的验证一下功能。实际使用还是要慎重的

文档都是标准的,就不贴了,大家网上搜一搜就有。

OSEKNM_sample.rar (941.37 KB, 下载次数: 276)
CANUDS.rar (3.85 MB, 下载次数: 391)











评论

牛X啊,小伙考虑来我司上班吧,哈哈  发表于 2021-3-12 10:23
marginer 发表于 2020-6-23 14:08 | 显示全部楼层
汽车电子的东西太专业了么,尽然没人跟贴
TechHolder 发表于 2020-6-23 17:06 | 显示全部楼层
现在就剩下坛友小伙伴们拿去使用体验了
desk1983 发表于 2020-6-26 13:26 | 显示全部楼层
非常好的资料,对初学者很有帮助;
希望楼主多多分享,赠人玫瑰,手有余香,念念不忘,必有回响;.
WoodData 发表于 2020-6-26 17:36 | 显示全部楼层
非常好的资料。支持。
desk1983 发表于 2020-6-30 11:32 | 显示全部楼层
应该成立一个微信群,这发了100块左右的板子,应该有一个大家跟互相讨论的微信平台呀!
强烈建议成立微信群,或者QQ群
zhouchen1233 发表于 2020-7-9 16:03 | 显示全部楼层
问下,测试用的周立功什么软件,我怎么找不到
dream886 发表于 2020-7-10 11:29 | 显示全部楼层
@JasonLee27  很好的东西,应该留个联系方式探讨一下
戊戌变法 发表于 2020-7-13 11:28 | 显示全部楼层
这个功能demo我喜欢 这才是车规级MCU需要的出的
zhouchen1233 发表于 2020-7-22 15:09 | 显示全部楼层
想问下NM管理比如在正常工作模式时两个ID在每隔100mS发送ring,那什么时候发送别的数据,比如uds诊断数据
zeshoufx 发表于 2020-7-22 21:47 | 显示全部楼层
赶紧收藏,,,谢谢分享【AC7811上实现CAN网络管理以及15765诊断】
zhouchen1233 发表于 2020-11-16 16:05 | 显示全部楼层
UDS刷写时候我看到34服务时候擦除flash,擦除flash这个功能不是应该在31服务实现吗?
yangxiaor520 发表于 2020-11-16 20:36 来自手机 | 显示全部楼层
学习了,感谢楼主分享经验。
两只袜子 发表于 2020-11-17 09:02 | 显示全部楼层
非常好的资料
数据采集存储 发表于 2020-11-17 15:31 | 显示全部楼层
这个是上操作系统了吗?我没有看见操作系统的哪里做的入口
elephant00 发表于 2021-3-12 11:06 | 显示全部楼层
非常好的资料。支持。
路飞 发表于 2021-3-18 09:57 | 显示全部楼层
不错哈,支持一下
wayne_yi 发表于 2021-3-26 17:40 | 显示全部楼层
不错,点个赞1
baoyingbin1989 发表于 2021-8-24 11:31 | 显示全部楼层
支持国产MCU
Bobby13 发表于 2021-8-24 14:02 来自手机 | 显示全部楼层
放gitee或者github吧,还能维护,还能有版权
您需要登录后才可以回帖 登录 | 注册

本版积分规则

66

主题

415

帖子

12

粉丝
快速回复 在线客服 返回列表 返回顶部