首页 » 互联网 » 为什么仅发出一帧CAN报文?_函数_如下图

为什么仅发出一帧CAN报文?_函数_如下图

神尊大人 2024-11-28 01:18:19 0

扫一扫用手机浏览

文章目录 [+]
小编
1. 问题背景

在软件开拓初期基本上须要开拓CAN驱动模块,最为常见的一类问题便是 软件内部虽然在周期发送CAN帧,但是仅发出一帧?

本日小T跟大家一起来解析这个最为常见的问题缘故原由,以英飞凌TC3XX芯片CAN驱动开拓为例。

为什么仅发出一帧CAN报文?_函数_如下图 为什么仅发出一帧CAN报文?_函数_如下图 互联网

2. 过程剖析

2.1 CAN发送状态剖析

为什么仅发出一帧CAN报文?_函数_如下图 为什么仅发出一帧CAN报文?_函数_如下图 互联网
(图片来自网络侵删)

以TC3XX芯片为例,CAN发送一样平常均通过如下函数接口 Can_17_McmCan_Write 对外发送CAN报文。

该函数也有相应的返回值, 干系解释如下图:

我们通过调试代码创造此时 canStatus的状态为CAN_BUSY, 则表示当前CAN没有可用的Tx hardware buffer 。

Q1 : 为什么没有可用的Tx hardware Buffer呢 ?

Ans :  首先我们查看下回答CAN_BUSY的条件:

CanTxMask表示32个Tx的发送状态Bit位,个中某Bit位为1表示当前Tx Buffer处于空闲状态,为0则表示已经利用。
当前可以看到是由于Line 7564行条件知足时才会进入到CAN_BUSY状态。

个中BufferIndex可理解为对应发送数据的Tx Mailobx,当前可以判断对应的Bit位为0,从而造成条件成立,导致回答CAN_BUSY。

Q2: 什么情形CanTxMask中特定的Bit位为0呢?

Ans: 通过剖析代码创造,CAN初始化过程会将CanTxMask全部初始化为1,如下图所示:

在调用发送函数 Can_17_McmCan_Write 中,首次发送时,任意对应TxBuffer均会知足条件成立,从而能够分配得到Tx Buffer,得到Buffer之后,便会将对应Buffer的CanTxMask的Bit置位为0,进而锁住该Buffer,直到被开释之后才能够利用,如下图为锁住对应Tx Buffer代码:

Q2: 什么情形下会开释这个Tx Buffer所在的Bit位呢?

Ans: 通过剖析代码创造在对应的Controller发送完成中断中如下代码:

如下图为Controller0的发送完成中断代码,一级一级的追溯,终极我们可以看到中断函数中调用了函数接口 Can_17_McmCan_IsrTransmitHandler 。

在上述函数接口中连续调用了函数接口 Can_17_McmCan_lTxEventHandler 。

在上述TxEventHandler函数中连续调用了 Can_17_McmCan_lTxEventProcessingHandler ,在该函数中我们便创造了开释Tx Buffer的地方,如下图所示:

2.2 中断剖析

接下来我们看下中断是否使能了呢? 很明显创造发送完成中断并没有使能 ,如下图所示:

Q3:如何使能CAN发送完成中断呢?

Ans: 对付英飞凌TC3XX芯片而言, 统共3个Can Module, 每个Can Module有4个Can Node,以是统共有12个Can Controller 。
每一个CAN Controller均有如下四类中断必须进行使能:

CAN Rx FIFO中断 :如果对应的CAN Mailbox配置为吸收且Mailbox大于1,那么此时对应Mapping到这类CAN Mailbox将会触发Rx FIFO中断,而不是Rx Dedicated Buffer中断;

CAN Rx Dedicated Buffer 中断 :如果对应的CAN Mailbox配置成吸收且Mailbox即是1,那么则会触发该类中断,则不会触发Rx FIFO中断;

CAN Tx Finish 中断 :每次CAN发送成功之后均会触发此类中断;

CAN Busoff中断 :当发送CAN Busoff时便会触发此类中断;

这四类中断使能的条件条件有两个:

配置对应CAN Controller的上述4个中断优先级且均大于0,那么上述发送完成中断则不会是灰色状态,能够加入到代码编译;

将中断挂载到英飞凌中断处理模块IR上并使能中断;

上述这两个步骤统一在 MCAL中IRQ模块或者OS中 任意一个配置即可,无需同时配置。
本文以没有OS,在MCAL中的IRQ模块中进行配置作为参考示例:

至此中断函数入口使能完毕,除此之外并没有真正意义上使能了CAN中断,此时 还须要调用如下图CAN中断初始化函数挂载中断并使能中断 。

把稳 :如果仅仅调用了IrqCan_Init进行了中断初始化,只是代表挂载了中断,中断标志位能够在SRC干系寄存器置位,如果对应中断的SRE没有使能,也不会将中断通报至对应中断做事者,即CPU0,这点特殊把稳,许多情形下中断没有产生基本上便是这个最为大略的问题。

2.3 问题发生逻辑关系图

如下图所示为问题发生逻辑关系图:

3. 根本缘故原由

在MCAL IRQ模块中没有配置CAN干系中断以及优先级,导致中断入口没有使能;

没有调用CAN中断初始化函数或者在SRC中没有使能对应的SRE位;

4. 修复方法

在MCAL IRQ模块配置好CAN干系中断以及优先级,同时在调用CAN中断初始化函数并使能对应SRC的SRE中断使能位;

如果存在OS则须要在OS中配置好CAT2中断并挂载中断即可;

5. 总结

在开拓任何外设驱动过程中如果须要利用中断,务必要检讨中断被成功使能以及如何使能;

如果涌现发送不堪利,首先检讨CAN驱动接口的返回值是否检讨,然后按图索骥便可以找到问题所在,要不怕调试,调试多了自然履历就上去了,下次就无需调试也就知道问题最有可能出在那里了。

标签:

相关文章

半导体芯片价格曝光_芯片_半导体

半导体芯片是指在半导体片材上进行浸蚀、布线等加工后制成的能实现某种功能的半导体器件。它不仅是硅芯片,还包括砷化镓、锗等其他半导体材...

互联网 2025-01-23 阅读0 评论0