当前位置: 首页 > web >正文

关于tresos Studio(EB)的MCAL配置之CAN

每一路CAN最多可配置32个发送缓存区,64个接收缓存区,也就是mailbox。

Tx处理器控制从外部消息RAM到CAN核心的消息传输。

Rx处理器控制从CAN内核到外部接收到的消息的传输消息RAM。

接收处理程序还支持两个接收FIFO,用于存储已通过接受过滤的所有消息,可配置多达64个元素。

还有128个接收标准过滤器和64个接收扩展过滤器。

出现问题

假设在Tx的输出管道中有两个Tx FIFO消息

消息处理程序。Tx FIFO消息1开始传输: 

现在请求具有更高CAN优先级的非Tx FIFO消息。由于其优先级,它将被插入到输出管道中。TxMH执行所谓的“消息扫描”,以使输出管道与来自消息RAM的最高优先级消息保持同步。

在以下两个消息扫描之后,输出管道具有以下内容  

如果Tx FIFO消息1的传输不成功(丢失仲裁或CAN总线错误),则由具有更高CAN优先级的非Tx FIFO消息从输出管道中推送。

下面的扫描将Tx FIFO消息1重新插入到位置3的输出管道中:

Tx FIFO消息2在Tx FIFO消息1前面的输出管道中,它们按该顺序传输,导致消息序列反转。

在描述的情况下,可能会发生来自Tx FIFO的两个连续消息交换它们在发送序列中的位置

解决方法:硬件TX FIFO不应该与其他标准/多路复用对象混合。报文必须通过通过一个或多个TX object按照L-PDU优先级顺序发送,这个object可以是标准的也可以是多路复用的,

一个控制器最多有一个TX FIFO,还必须在最后的object里面。

  

记得勾选这里

当object(使用了FIFO)处理多个L-PDU时,使用Basic-Can;当只有一个L-PDU时,使用Full-Can 报文canid由硬件对象mailbox处理。

基本概念

Mailbox:邮箱,就是CAN驱动所具有的接收缓存区和发送缓存区,接收缓存区和发送缓存区均在RAM区。

HWObject:硬件对象,包含CAN ID、DLC、Data等信息的RAM区。

在这里注重声明下,由于很多公司的设计里面,把硬件对象的名字起为Mailbox导致很多人把邮箱和硬件对象搞混了,其实这是两个不同的东西。Mailbox是接收或者发送的缓存器,一个控制器只有两个,一个接收一个发送。分别包含了许多个硬件对象,用来跟HRH和HTH交互。

HRH:Hardware Receive Handle,接收句柄,一个HRH表示一个接收HWObject。

HTH:Hardware Transmit Handle,发送句柄,一个HTH表示一个发送HWObject。

Mailbox、HWObject、HRH、HTH、Controller、Transceiver之间的关系如下所示:

General

Can Change Baudrate Api使能Can_ChangeBaudrate和Can_CheckBaudrate接口

Development Error Detection开发者检测

Can Multiple CanIf Cbk将canif层的部分操作接口更加细化,原本是控制所有控制器,勾选可以按照控制器来单独控制

Provide Version Info API获取版本信息

Can Driver Index驱动索引,报错的时候检查用的,一般写0就行

Can Main Function Busoff Period接口Can_MainFunction_Busoff的调用周期,生成代码只会生成一个宏CAN_MAINFUNCTION_PERIOD_BUSOFF,给你在BSW层的SchM引用这个宏定义来控制调度周期。

Can Main Function Wakeup Period接口Can_MainFunction_Wakeup的调度周期,生成代码只会生成一个宏CAN_MAINFUNCTION_MODE_PERIOD,给你在BSW层的SchM引用这个宏定义来控制调度周期。

Can Main Function Mode Period接口Can_MainFunction_Mode,但一般没用,都是按照其他方式调用的。

Can Multiplexed Transmission支持多路传输。多路传输:如果当前mailbox繁忙,则搜索与传输到Can_Write的MB具有相同ObjectId的空闲mailbox,从而解决数据堵塞问题。

Can Hardware Cancellation支持硬件取消,调用Can_LLD_Cancel()接口。取消机制是用来给发送的can报文抢占的,当低优先级报文在发送的时候,高优先级报文来了,就取消低优先级报文的发送,让给高优先级的先发出去。

Can Identical Id Cancellation支持具有相同ID的硬件取消,需要勾选Can Hardware Cancellation才能勾选。

Can Timeout Duration处理函数超时时间,改不了,只能看

Can Timeout Cycle初始化/重启/切换模式等接口操作超时时间,一般不用动,如果你设置的mailbox太多才需要加大它。

Can L-Pdu Receive Callout Function接收到Can L-Pdu的回调函数,收到报文就会进去,入参是HRH的索引,报文ID,报文长度,报文数据

Can L-Pdu Custom receive Callout Function自定义的接口,在Can L-Pdu Receive Callout Function后面再回调一次,入参一样。

Can Controller Error Notification错误中断控制器通知,左上角没有点不能开启

Can RxFifo Warning Notification设置RxFifo警告通知函数的处理函数,左上角没有点不能开启

Can RxFifo Overflow Notification设置RxFifo溢出通知函数的处理函数,左上角没有点不能开启

Can RxFifo Non-Matching Filters Notification接收到的L-PDU与配置的任何过滤器不匹配的回调函数,左上角没有点不能开启

Can Extended ID Support支持扩展ID

Can MB Count Extension Support支持超过255个硬件对象

CanApiEnableMbAbort增加一个中止消息传输的接口

CanAbortOnlyOneMB让接口Can_AbortMb()只终止一路硬件对象的传输,否则就是终止所有硬件对象的传输

CanEnableDualClockMode使能双时钟模式

有些插件有Can Extended ID Support的选项,也就是扩展帧ID需要或上0x80000000,对于发送的mailbox来说,标准帧和扩展帧是通过ID最高位来区分的。

LOM仅监听模式,只会把CAN总线上被其他节点响应的报文接收进来。

LPB环回模式,是用来自检的,在芯片内部就把发送的报文接收回来。

CanMainFunctionRWPeriods

就是Can_MainFunction_Write和Can_MainFunction_Read两个函数的轮询周期,这里有一个就行,但是这个周期只会生成个宏定义,是不会直接用在调度上的,需要在BSW层的SchM模块里面再去用。

这两个函数需要Can Rx Processing Type和Can Tx Processing Type配置为轮询处理才有用,如果配置成中断处理,就用不上了。

CanConfigSet

CanController

General

Can Hardware Channel选择控制器下面的通道,每个芯片都有好几个CAN控制器,每个控制器下面又会有好几个通道,譬如CANSUB是控制器,MCAN是通道。

Can Controller Activation激活CAN控制器,一般勾选

Can Enable Clock Calibration使能时钟校准

Can Controller Base Address控制器基地址,一般在BSW层配置这个

Can Controller ID自己写的ID

Can Rx/Tx Processing Type收发的处理方式,可以选轮询或者中断,如果选择了轮询要在代码里面轮询调用Can_MainFunction_Read/Can_MainFunction_Write接口。如果选择了中断,收发报文的时候就会进入到中断函数。

Can BusOff Processing Type总线状态变成BusOff之后的处理方式,可以选轮询或者中断,如果选择了轮询就要在代码里面轮询调用Can_MainFunction_BusOff接口

Can Wakeup Processing Type总线唤醒的处理方式,可以选轮询或者中断,如果选择了轮询就要在代码里面轮询调用Can_MainFunction_Wakeup接口

Can Wakeup Support支持CAN总线唤醒

CanWakeupSourceRef总线唤醒源

Can Controller Default Baudrate默认波特率配置容器,也就是隔壁选项卡CanControllerBaudrateConfig里面的配置容器

Can CPU Reference Clock时钟源,只能选择对应控制器的那个时钟。

Can CPU Reference Clock Alternate备用时钟源

Can Test EnableMode (CCCR[TEST]) 使能外部回环模式测试用的,一般不使能

Can Bus Monitoring Mode (CCCR[MON])使能监控模式

Can ASM Mode (CCCR[ASM])  使能限制操作模式,是在不同的比特率情况下使用的

RX Processing on RX Buffers Interrupt Line Select选择接收buffer的中断线

TX Processing Interrupt Line Select选择发送处理的中断线

BusOff Processing Interrupt Line Select选择BusOff的中断线

Can Error Notification Enable使能错误通知

Error notification Interrupt Line Select错误通知中断线

Can Warning Int Enable (IR[EW])使能警告状态中断

Can RxFifo Enable使能接收FIFO,使用到接收FIFO需要勾选这个,并且在隔壁选项卡CanRxFIFOTable里面新建队列

RX Processing on Rx Fifo 0 Interrupt Line Select接收处理FIFO 0中断线

RX Processing on Rx Fifo 1 Interrupt Line Select接收处理FIFO 1中断线

上面这些中断线在设置的时候需要跟OS关联起来

Fifo Warning Notification Enable使能FIFO阈值警告

Warning Watermark Level [Rx Fifo 0] FIFO 0的警告阈值

Warning Watermark Level [Rx Fifo 1] FIFO 1的警告阈值

Fifo Overflow Notification Enable使能接收FIFO溢出通知

Warning/Error processing on Rx Fifo 0/1 Interrupt Line Select接收FIFO0/1警告错误处理中断线

CanControllerBaudrateConfig

波特率配置,当然你也可以加多几个配置,在控制器里面不引用,需要的时候再进行切换。

Can Time Segments Checking检查几个时间段是否合理

Can Automatic Time Segments Calculation勾选之后只需要能自动计算各个段的时间长度

Can Bus Length总线长度是多少米,一般默认就行

Can Propagation Delay Tranceiver收发器的传播延迟,一般默认就行

Can Controller Prescaler控制器的预分频

Can Controller Prescaler Alternate控制器的备用预分频

Can Controller BaudRate传输波特率

Can Propagation Segment/Can Phase Segment 1/Can Phase Segment 2/Synchronization Jump Width就是CAN传输的每段时间

CAN FD也是差不多的,区别在上面三个

Can Transceiver Delay Compensation使能延迟补偿

Can Transceiver Delay Compensation Offset延迟补偿偏移

Can Tx Bit Rate Switch发送比特率开关,勾选就是允许修改发送比特率。

CanFilterMask

过滤掩码,适用于整个通道。但是我实验的时候发现,这东西不会生成代码。

CanRxFIFOTable

Can RxFifo Frame Accepted Mode接收的是标准帧还是扩展帧

Can RxFifo Filter Type选择canID滤波类型,跟下面的Can RxFifo First Identifier 和Can RxFifo Second Identifier配合使用。

经典滤波:Can RxFifo First Identifier是基础ID,Can RxFifo Second Identifier是掩码。这个东西单看名字是看不出怎么用的,很多人都用错了。基础ID就是个例子,掩码的意思是关注具体哪一位。

例子1:想通过0x1XX的报文,只需要关注高4位从0开始计算的第3位,不关注低8位,那掩码设置为0x100。因为关注的位为1,则基础ID设置一个0x1XX的报文就行,什么0x300,0x123之类的都可以。

例子2:想通过0b xxxx xx01 xxxx 的报文,只需要关注从高位开始从0数的第6和第7位,掩码设置为0x30。因为关注的位,第6位为0,第7位为1,基础ID只需要满足:第6位为0,第7位为1,就可以了。

例子3:最常用的例子是基础ID设置为你要留下的ID,掩码设置为0x7FF,这样就只允许通过基础ID了。然后多新建几个CanRxFifoTable,设置到同一个FIFO里面就可以。

例子4:当不需要任何过滤的时候,可以把掩码设置为0,基础ID填什么都行。

范围滤波:允许通过从Can RxFifo First Identifier 到Can RxFifo Second Identifier之间的canid。

双ID滤波:允许通过Can RxFifo First Identifier 和Can RxFifo Second Identifier两个ID。

NonMatching:限制条件很多,一般用不上。

Can RxFifo Filter Configuration每个控制器里面有两个接收FIFO,这个表示通过滤波之后,放到FIFO0还是FIFO1

CanHardwareObject

就是一堆硬件对象,这里包含了所有控制器里面的硬件对象

Can Implementation Type一个硬件对象只能对应一条报文。如果一个mailbox对应一条报文,里面就只需要有一个硬件对象,就选择FULL。如果一个mailbox对应多条报文,就需要有多个硬件对象,选择BASIC

Can Hw Object Count接收硬件对象数量,跟full can还是basic can没关系。如果用上CanRxFifoTable,这里填写的就是接收FIFO的深度。如果没用上,就只能写1.

Can Multiple Transmit Object Type指定多路发送对象,队列或者FIFO。

Can ID Message Type报文类型,标准帧扩展帧还是混合帧。不够我这个工具有个问题,它不能区分扩展和混合,但凡配置为混合的,都认为是扩展。

CanIdValue报文ID,相当于一个过滤器,但只对接收报文有用,发送报文随便填写什么都是不起过滤作用的

Can Object ID保存HRH或HTH的句柄ID,从0开始,没有间隙,自己排列好就行,有一个要求是所有配置为接收类型的object的ID必须小于配置为发送类型的object

Can MB Type接收还是发送,同一个mailbox里面的报文要么全是发送的,要么全是接收的。

CAN-FD Frames Padding Byte使用CANFD的时候的填充值

Can Controller Reference在CanController里面的控制器

Can Filter Mask Reference接收过滤掩码

发送多路复用

多路复用的意思是,在调用Can_Write的时候,如果发现mailbox在busy,可以传输到其他相同objectID的其他mailbox

发送mailbox超过32个会报错

静态代码

Can_AbortMb终止报文缓冲区,终止一条或多条报文的发送,这个接口需要canif层调用,属于HTH模块。

Can_ChangeBaudrate改变波特率,一般只在初始化的时候调用。但我这边的静态代码没有调用这个接口,在初始化的时候调用到的是再下一层的Can_LLD_ChangeBaudrate接口,会重置硬件控制器,FIFO和收发缓冲区。

Can_CheckBaudrate检查波特率,在初始化之前调用,返回值代表检查的波特率跟设置的是否一致。

Can_CheckWakeup检查唤醒条件,返回值代表唤醒源有没有给控制器唤醒信号。

Can_DisableControllerInterrupts失能控制器中断,这个接口需要BSW层调用。

Can_EnableControllerInterrupts使能控制器中断,这个接口需要BSW层调用。

Can_GetVersionInfo获取版本信息

Can_Init初始化接口,这个也是通过上层调用的,譬如BSWM模块。先调用Can_LLD_ResetController接口,重启CAN控制器,操作寄存器配置can时钟校准。清除一些软件标志位,譬如mailbox的索引值,发送完成标志位,时钟停止标志位等。如果是CANFD还需要配置一些CANFD相关的寄存器。调用Can_LLD_ConfigureFIFOs配置控制器的寄存器为接收FIFO。调用Can_LLD_ConfigureRXBs和Can_LLD_ConfigureTXBs,配置接收和发送的mailbox,如果是CANFD则还需要配置一些CANFD相关的寄存器,如果使用了RXFIFO也要配置一些RXFIFO的寄存器。

Can_MainFunction_BusOff当你把Can BusOff Processing Type配置为轮询的时候才需要轮询调用来处理busoff事件,这个也是通过上层调用的,譬如OS轮询。如果出现busoff事件就进入Can_LLD_Process_BusOff。调用Can_LLD_SetControllerMode接口将Can模块设置为CANIF_CS_STOPPED状态,确保Can控制器不再参与网络。如果模式设置成功,则调用MCan_LLD_Process_BusOff清除busoff中断标志位和CanIf_ControllerBusOff向DET模块报告,将PDU的模式设置为OFFLINE,失能所有buffer。

Can_MainFunction_Read当你把Can Rx Processing Type配置为轮询的时候才需要轮询调用来处理报文接收。实际就是调用MCan_LLD_Process_Rx接口,将报文存储到接收缓存区。如果使用了接收FIFO就把FIFO里面的报文存储到接收缓存区。

Can_MainFunction_Wakeup当你把Can Wakeup Processing Type配置为轮询的时候才需要轮询调用来处理唤醒,我们不在轮询的时候调用它的原因是,另外做了手写代码的网络管理。当满足唤醒条件的时候,调用Can_LLD_Process_Wakeup接口,将控制器设置成唤醒模式,如果成功,则清除唤醒中断标志位。

Can_MainFunction_Write当你把Can Tx Processing Type配置为轮询的时候才需要轮询调用来处理报文发送。

实际就是调用MCan_LLD_Process_Tx接口,将发送缓存区的内容写到硬件寄存器里面去,根据情况调用CanIf_CancelTxConfirmation取消发送报文之后对应答的检查或者调用CanIf_TxConfirmation对发送报文进行应答检查。

CanIf_TxConfirmation在CAN报文发送出去之后调用这个接口

CanIf_RxIndication接收到CAN报文的时候调用这个接口

CanIf_CancelTxConfirmation当CAN消息在发送过程中被取消调用这个接口

CanIf_ControllerBusOff当CAN控制器进入BusOff调用这个接口

Can_SetClockMode切换时钟源,这个也是通过上层调用的,调用Can_LLD_SetClockMode函数操作时钟源配置寄存器。

Can_SetControllerMode设置控制器模式,这个也是通过上层调用的,一般在CanIf_SetControllerMode接口里面,可以选择开始/暂停/休眠/唤醒。

Can_Write检查HTH的硬件传输对象是否空闲,检查同一个HTH是否正在进行另一个Can_Write,如果没有的话,就用这个HTH把PDU的报文信息发出去。实际上是调用Can_LLD_Write接口,有四种情况:

1.硬件对象空闲,就把canid、DLC和SDU塞进去,加个互斥锁,启动传输,传输完成后释放互斥锁。

2.硬件对象繁忙,就什么都不做,返回CAN_BUSY,让canif去检查下一个HTH。

3.已经有别进程在操作这个HTH,就不能重入。

4.正在处理另一个优先级低于当前请求的L-PDU的发送请求,取消低优先级的请求,先处理当前请求。

CanErrorNotification控制器检测到错误进入的中断接口,入参是控制器的索引和中断线。

有一些关于中断的代码
 

#ifdef CAN_FCA_INDEX#if (CAN_INTERRUPT_LINE_0_ENABLE == STD_ON)ISR(Can_IsrFCA_IL0);#endif#if (CAN_INTERRUPT_LINE_1_ENABLE == STD_ON)ISR(Can_IsrFCA_IL1);#endif#endif

ISR是一个宏,#define ISR(x) void Os_Entry_##x(void)

所以ISR(Can_IsrFCA_IL0)其实是Os_Entry_Can_IsrFCA_IL0,这样才能查到对应的中断函数,这个函数在OS里面调用。看你每一个CAN控制器用了哪条中断线,用了中断线0,发生中断的时候就会进去Os_Entry_Can_IsrFCA_IL0中断函数,用了中断线1也是一样。

如果像上面那样配置,发生发送事件的时候,就会进去中断线1的中断。发生接收事件的时候,就会进去中断线0的中断。

CAN_COMBINED_ISR里面有个函数MCan_LLD_Isr_process_interrupt,这是个很重要的中断函数,常用的中断事件都会进这里,里面会使用中断的方式调用处理:

1、busoff接口Can_LLD_Process_BusOff

2、错误通知回调CanErrorNotification

3、错误警报MCan_LLD_Process_ErrorWarning

4、报文发送MCan_LLD_Process_Tx

5、报文接收MCan_LLD_Process_Rx_Buffers

6、接收FIFO MCan_LLD_Process_Rx_FIFO0或者MCan_LLD_Process_Rx_FIFO1

7、接收FIFO错误MCan_LLD_Process_Rx_FIFO0_Errs或者MCan_LLD_Process_Rx_FIFO1_Errs

全轮询模式流程

1.调用Can_Init进行初始化

2.Can_DisableControllerInterrupts失能控制器中断

3.Can_SetControllerMode将控制器模式设置为start

4.轮询调用Can_MainFunction_Write() 和Can_MainFunction_Read() 接口来进行处理

http://www.xdnf.cn/news/19258.html

相关文章:

  • 补题报告08
  • 【人工智能99问】参数调整技术(31/99)
  • docker中的mysql有中文显示问题跟大小写区分问题?
  • erpc框架流程学习1
  • 玄机靶场 | 冰蝎3.0-jsp流量分析
  • RAG教程5:多表示索引和ColBERT
  • 高精度三维扫描仪三维扫描测量扇叶叶轮尺寸-中科米堆CASAIM
  • pcl封装6 connection_cloud 提取聚簇后的每个点云
  • 为什么外贸企业管理需要外贸CRM系统
  • 如何将OFD文件转换为PDF?总结在线OFD转PDF方法
  • ArcGIS Pro中 Nodata和nan 黑边的处理
  • Azure Marketplace 和 Microsoft AppSource的区别
  • 【论文简读】MuGS
  • 《开发避坑指南:从异常中读懂系统的“求救信号”》
  • 基于脚手架微服务的视频点播系统界面布局部分(一):首页及播放界面布局
  • Windows Command Line Windows 命令行
  • 鸿蒙Next导航与路由指南:组件导航与页面路由的完美协作
  • 导入自定义模块的过程中出现ModuleNotFoundError错误
  • 新手法务合同审查,有什么建议?
  • 构建稳定和可扩展云基础设施的首选服务:AWS的EC2实例
  • 前端工程化深度实践:从构建优化到CI/CD的完整解决方案
  • vue3跨层级传递数据,比如:祖->孙
  • JS循环方法
  • kimi浏览器助手-月之暗面推出的智能浏览器扩展
  • 晨控CK-FR102ANS与欧姆龙NX系列PLC配置EtherNet/IP通讯连接手册
  • 过滤器和拦截器的区别?
  • 数据结构(C语言篇):(六)单链表算法题(下)
  • LinuxC语言系统开发——网络编程
  • 英文版在线客服系统支持海外客户的实时聊天解决方案
  • 透视文件IO:从C库函数的‘表象’到系统调用的‘本质’