【Semidrive G9X】如何获取 Can 通信的异常状态

本篇博文介绍如何在 G9 平台获取 CAN 通信的异常状态,软件版本是 G9 PTG5.0,硬件环境是 Spider 方案 G9X 平台。

一、尝试在 R 核获取状态

1. 由于目前的 Can 是挂在 SDPE 上的,所以在 R 核这边只能通过核间通信向 SDPE 获取 Can 的信息,因为 SDPE 的软件无法修改,所以核间通信只能发一些特定的命令去获取有限的信息,在 cmd_can 应用中获取异常状态的命令只有 can get_state 这一条,状态一共有 Active、Passive、Busoff 三种,正常情况下 Can 的状态一般是 Active ,如果触发了 ACK 异常那么会进入 Passive 状态,即被动错误状态。

用我们的板子验证是 ACK 异常是能正常进入 Passive 状态的,消除 ACK 异常后也能变回 Active 状态,但是这样不能具体获取 CAN 的异常状态,Passive 状态包含多种类型的错误状态,如 crc 错误,帧错误也会包含在里面,因此还需要详细地获取方法。



2. 然后在 《G9_Processor_TRM_Rev00.12.pdf》文档找到 CAN_ESR1 寄存器,上面有 ACKERR 这一位是判断有没有 ACK 异常的。



3. 在我们的板子用 CAN2 进行测试,找到 R5 核 CAN2 的寄存器基地址是 0xf0040000 ,加上偏移地址 0x20 即是该寄存器的地址,在 R5 执行 dw 0xf0040020 4 读到的数值如图所示,读到的值是错误的,显示 CAN2 已经进入了 busoff 状态,但实际并没有。





二、在 A 核获取异常状态

1. 后来确认到 SDPE 是挂在 MP 域的,只能通过读取 AP 域的寄存器地址来获取 CAN 的信息,而 0xf0040000 是 Safety 域的地址,自然无法正确读取信息,然后查到 AP 域 CAN2 的基地址为 0x30040000,在 AP 执行 devmem 0x30040020 如图,成功读取到正确的值,经过测试,ACKERR 位能正确反映 CAN2 总线是否有进入 ACK 异常。




2. 如果需要把信息反馈到 R 核的话,则需要自行创建核间通信通道来传输,核间通信的实现可以去参考我的博文《【Semidrive】G9 平台如何使用 R 核与 A 核的核间通信功能》。


三、参考文档

1. 《G9_Processor_TRM_Rev00.12.pdf》

★博文内容均由个人提供,与平台无关,如有违法或侵权,请与网站管理员联系。

★文明上网,请理性发言。内容一周内被举报5次,发文人进小黑屋喔~

评论