解决CAN中断接收数据,需要外界发送两次,才能响应,但是数据还是会响应两次,不会丢数的问题

1、思路

根据CANPro分析平台显示,两次发送的数据都成功了,而且最终Zynq的CAN中断也响应了两次,目前可以认定这种情况的发生与外界没有关系

接下来去探索为什么zynq的CAN中断响应出现了这样的问题

 

解决CAN中断接收数据,需要外界发送两次,才能响应,但是数据还是会响应两次,不会丢数的问题_第1张图片

 解决CAN中断接收数据,需要外界发送两次,才能响应,但是数据还是会响应两次,不会丢数的问题_第2张图片

2、去找can.WIR[FW]的说明,目前可以认为是FW设置的值有问题。

解决CAN中断接收数据,需要外界发送两次,才能响应,但是数据还是会响应两次,不会丢数的问题_第3张图片

3、去查找FW的值,来做分析 原本写的门限是1,现在改成63

测试结果,并不理想,以前客户端发送两次,板卡响应

现在客户端发送后,板卡并不响应(需要客户端发送很多次才能响应)

 4、细想一下,其实逻辑是反的,因为现在的问题是第一次没反映,两次就有了,门限是1的时候,其实是说一有数据就会响应。那就是说我设置成一,第一次发送来的数据就应该响应。上边的测试结果也嬴应证了这样的说法

5、截至目前看来那就是CAN中断的响应已经到了极限

6、但这并不是正确的,因为在没有移植J1939的情况下,测试是没有问题的

7、矛盾存在了,如何能解决

。。。

8、新发现的问题

1、 程序修改了波特率配置后,没有响应,就是不能再中断就收数据

2、波特率会不会和上边有关联。

 9、使能了XCANPS_IXR_RXOK_MASK接收中断。结果还是一样,第一次没有响应

 解决CAN中断接收数据,需要外界发送两次,才能响应,但是数据还是会响应两次,不会丢数的问题_第4张图片

解决CAN中断接收数据,需要外界发送两次,才能响应,但是数据还是会响应两次,不会丢数的问题_第5张图片

10、XCANPS_IXR_RXOK_MASK添加到总中断响应函数中

 OK,恭喜下自己。已经解决了标题中的内容。

一定要相信自己,一步步做没有什么是解决不了的。

11、进一步总结分析。

 解决CAN中断接收数据,需要外界发送两次,才能响应,但是数据还是会响应两次,不会丢数的问题_第6张图片

解决CAN中断接收数据,需要外界发送两次,才能响应,但是数据还是会响应两次,不会丢数的问题_第7张图片

 

12、问题来了,WaterMark和RXOK的中断接收触发条件

现在把清空中断标志加上了。

外边不再用清空中断标志位了,因为再进入中断响应函数的时候,就已经把中断清空了

 13、查看中断触发的使能位到底是什么

第一次客户端发送数据到板卡:中断状态寄存器是0x00000010 ,这是触发的RXOK中断

第二次客户端发送数据到板卡:中断状态寄存器的值还是0x00000010,还是触发的RXOK中断

结论:好像没有用到WaterMark中断,只有RXOK就可以了

14、最后:

改变了中断响应方案:从WaterMark改成了单个的RXOK。实锤+自信

 

 

你可能感兴趣的:(zynq)