顺便提一句,其实所谓滤波,只不过就是过滤。搞技术这一行,很多时候他们就喜欢把一些明明简单易懂的名词用人家听不懂的词代替,搞得刚入门的人很难受,找半天资料,他nn的结果发现是这样一个非常简单的东西。
目录
1、先说CANIF模块的软件滤波。
2、再说CAN控制模块的硬件滤波
我们了解一下硬件滤波的流程:
配置硬件滤波:
二、CAN控制器配置对应芯片手册(以EB工具为例)
CAN通道的配置
1、CanControllerBaseAddress:
2、CanRxInputSelection:
开启OS中对应CAN通道的CAN中断 (没图,先不讲,后续补上)
一、CAN控制器滤波及实际配置(硬件滤波、软件滤波、FilterMask/FilterCode、BasicCan、FullCan)
我们先看一下整个Autosar架构的CAN通讯模块,简单描述整个通讯链路如下:
CAN总线(硬件)->CAN收发器(硬件)->CAN控制器(硬件)->CAN(软件)->CANIF(软件)->PDUR(软件)->COM(软件)->RTE(软件)->APP(软件)
在这整个链路中,针对CAN报文滤波这一块,总共有两个地方:
①CAN控制器硬件滤波
②CANIF软件滤波
用过Autosar工具链配置过通讯的朋友们应该知道,CANIF模块可以配置报文的类型(如普通CAN格式、CANFD格式),还可以配置报文的数据长度DLC(如8、16、64等)。还可以配置接受报文的ID范围。
实际上,如果开启了软件滤波功能(工具中有配置项),代码中就会在CANIF模块中对配置的这些参数进行筛选过滤,这就是软件滤波。
具体例子如下图所示
首先说一个基本知识:一个CAN控制器可以配置很多个CAN接收邮箱,并且每个接收邮箱都可以单独配置滤波。
步骤1、在代码写好要配置CAN邮箱的滤波寄存器的值,
步骤2、在上电初始化CAN控制器的时候,就会把你配置的值写进CAN控制器的寄存器里面。
步骤3、代码跑起来后,如果接收到CAN报文,CAN邮箱就会把报文ID和你配置的FilterMask和FilterCode进行一个运算,得出的结果如果正确就接收这帧报文,否则就不收这帧报文(后面会说具体怎么算)。
明白了这个流程,其它硬件滤波的相关知识就好理解了。
①、从上面的流程中的这一句话:“CAN邮箱就会把报文ID和你配置的FilterMask和FilterCode进行一个运算”。可以知道硬件滤波只滤波报文的ID,也就是说报文长度是不管的。
②、邮箱可以配置为FullCAN和BasicCAN两种模式。
FullCAN:表示这一个邮箱只能接收一帧特定ID报文,因此一个接收邮箱配置为FullCAN,那么它必须要配置滤波。
BasicCAN:表示这一个邮箱能接收一段ID范围的报文比如0x100-0x500(前提这个邮箱滤波器你配成了这段范围)。BasicCAN可以不配置范围,这样表示接收任意ID范围的报文。
不理解硬件滤波之前,看半天手册就只知道FullCAN是一帧报文、BasicCAN是多帧报文。后面才知道原来是这样...
好了,那么,配置CAN硬件滤波是怎么个配法呢?
配置CAN硬件滤波,其实就是配置CAN接收邮箱的两个参数:
FilterMask 和 FilterCode(刚开始搞CAN的时候,对着这串奇奇怪怪的数字百思不得其解好久...),
过滤公式如下:
接收的报文ID & Filter mask = Filter Code。
接收到的报文只有满足下面这条公式才会进入CAN中断。至于FilterMask 和 FilterCode具体要怎么设置,别人写的这篇文章就写得非常好。(从接触CAN的这个东西,到最后真正理解,经历了好久的,呜呜)
CAN接收邮箱掩码设置方法_can邮箱_PlutoZuo的博客-CSDN博客https://blog.csdn.net/PlutoZuo/article/details/131086355?spm=1001.2101.3001.6650.6&utm_medium=distribute.pc_relevant.none-task-blog-2~default~BlogCommendFromBaidu~Rate-6-131086355-blog-130198344.235%5Ev38%5Epc_relevant_anti_t3&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2~default~BlogCommendFromBaidu~Rate-6-131086355-blog-130198344.235%5Ev38%5Epc_relevant_anti_t3&utm_relevant_index=12 具体配置例子的地方如下图所示(Vector为例子。EB的话就不用这样关联,直接在邮箱的FilterMask 和 FilterCode配置项里面填值就好了)。
步骤1:在CanFilterMasks里配置FilterMask 和 FilterCode
步骤2:CanHardware里的邮箱有个Filter索引,把步骤1配好的Filter关联上就好了
(没有图了,展开后就是填FilterMask 和 FilterCode。大家将就着看...)
开发过程中。使用的一路CAN要通讯起来,最关键的是驱动要配置正确,而驱动要怎么去配置是需要看芯片手册的。
对于新手来说我觉得这应该是最困难的一部分。因为驱动没问题之后,其实其它东西都是逻辑的东西,花时间去看看就明白了。
但驱动不一样,芯片手册那么多东西,好几千页,关于CAN模块也有好几十页上百页。而对于我们开发来说,我们就想让一路CAN能通讯起来,其它的东西并不想管。
一般来说,正常的开发场景是怎么样的呢,按照我个人经历为栗子:
一个新的项目过来后。
首先是硬件同事要开始搞,硬件同事把原理图、PCB板子画好,并且打好板子出来。
然后我们软件同事拿到电路板子和硬件同事画好的原理图
最后硬件同事需要告诉我们,我们使用到了哪一路CAN通道。比如他们告诉我们我们用到的CAN通道是原理图上的CAN00, 我们通过查看他们给的原理图,看到CAN01对应的芯片RX引脚是P20.7,发送引脚是P20.8。
好了,到这为止,就到我们软件的同事开始干活了。
配置一条CAN通道的驱动大概步骤如下:
步骤1、配置CAN通道
步骤2、开启OS中对应CAN通道的CAN中断。
步骤3、配置CAN控制器的位时间相关参数(就是波特率,采样点啥的。可以看我上一篇文章)
步骤4、配置CAN邮箱
这里我只讲步骤1和步骤2,因为这两个步骤是需要去查芯片手册的,且以TC397芯片:RX引脚是P20.7,TX引脚是P20.8的CAN通道为例。TC397芯片手册的链接我会放在最后面
芯片中有很多路CAN,那么,具体是怎么样选择我们使用的CAN通道呢?
这个配置项就是让我们选择芯片中具体的CAN通道。
通过查芯片手册我们可以看到有这么多CAN通道:
通过看这个表我们可以找到,我们使用的RX引脚是P20.7,TX引脚是P20.8,对应的是CAN00节点。
但是这里也没告诉我们每个CAN通道的地址呀,因此我们还得继续找。然后我们找到了这里:
可以看到CAN0、CAN1、CAN2的的基地址是这些,但是我们的节点是CAN00,它只告诉了我们CAN0,并不是CAN00。但我们也得到了CAN0的基地址:0xF020 0000
然后我们再继续往下找可以看到:
可以看到,CAN节点的地址是0x008100 + i * 0x400,i就是代表CAN0i或CAN1i或CAN2i
我们是CAN00
因此,CAN00的基地址等于:0xF020 0000 + 0x008100 + 0 * 0x400 = 0xF020 8100
所以,CanControllerBaseAddress这个配置项填的就是这个。
大家应该都知道引脚复用功能
就是为了方便大家使用和画硬件板子,一个芯片引脚可以选择不同的功能,比如某一个芯片引脚即可以用作普通IO口,也可以用作某路SPI的片选引脚,还可以用作某路CAN的RX引脚,取决于你怎么去配置)
因此,芯片中的很多引脚都可以是一路CAN通道的RX和TX。这个CanRxInputSelection就是让我们选择要配置的这一路CAN的RX和TX是芯片的哪个引脚。
我们查TC397的数据手册可以找到这一页:
我们使用的RX引脚是P20.7,TX引脚是P20.8,因此按照芯片手册选择CAN00_RXDB
另外:对于Vector工具,这个配置项就不是让我们选择CAN00_RXDB,而是让我们选择NPCRx.RXSEL,那么我们选001B就好了。
接下来是配置这一路CAN的CAN中断(Irq)。
呃。。。CAN中断这一块没有图片,不知道咋写,过两天补上。。。
朋友们,半年没更新了。
换了新工作,这次的岗位工作内容没有之前那么狭窄了,但这也意味着要累成狗了...
后续关于Autosar底层的东西我接触到的都会慢慢更新,比如休眠唤醒、诊断、SPI等等。
Tc397芯片手册官网链接(Part2中描述关于CAN模块):
SAK-TC397XP-256F300S BD - Infineon Technologies
返回目录:
Autosar BSW 开发笔记(目录)-CSDN博客