在调用发送函数Can_17_McmCan_Write中,首次发送时,任意对应TxBuffer均会满足条件成立,从而能够分配得到Tx Buffer,得到Buffer之后,便会将对应Buffer的CanTxMask的Bit置位为0,进而锁住该Buffer,直到被释放之后才能够使用,如下图为锁住对应Tx Buffer代码: Q2:什么情况下会释放这个Tx Buffer所在的Bit位呢? Ans:通过分析...
MainFunction_Tx函数将调用PduR模块的PduR_ComTransmit函数,将数据传给PduR模块;PduR模块路由到CAN Interface模块,调用CanIf_Transmit函数,这样数据从PduR模块传给了下层的CAN Interface模块;CAN Interface模块再调用Can Driver模块的Can_Write函数,将数据写入相应的寄存器;与CAN接收功能一样,Can_Write函数将访问...
所以不难理解,Can_Write的输入参数Hth其实就是硬件对象的编号(id),而且实际上是已经定义好了硬件对象的编号与CAN ID的映射关系,比如下图16所示,如果想发送CAN ID 为0x001的数据,那么调用Can_Write函数的输入参数Hth应该为4。 图16 硬件对象的编号与CAN ID的映射关系 然后引用文档内容说明下Can_Write函数要执行主...
回到上面的两个问题,从前面文章可知,CAN发送时,对于CAN模块有两个操作:一是先访问硬件,将数据写入寄存器;二是发送成功后,向上层CAN Interface模块确认。 图11 CAN模块的写数据 图12 CAN模块的发送确认 针对写数据操作,CAN Interface模块调用Can_Write函数,其定义如下: 图13 CAN_Write的定义,引自[1] 这里首先要...
CAN Driver 模块是最底层的硬件驱动模块,通过操作硬件寄存器实现对硬件的控制。Can_Write( ) 是CAN Driver 模块的发送函数,具体流程如图 8 所示。 图8 Can_Write( ) 发送流程图 当硬件邮箱空闲时正常完成发送,当在被占用情况下会返回 CAN_BUSY,CAN IF 模块会根据返回值存储没能完成发送的数据信息。
Can_Write: 发送CAN帧。这个接口可以用来向CAN总线发送CAN帧,它需要提供一个CAN帧的数据结构,包括帧ID、数据长度和数据等信息。 Can_Read: 接收CAN帧。这个接口用于从CAN总线接收CAN帧,并将数据存储在指定的缓冲区中。 Can_MainFunction: CAN Driver主功能。这个接口用于处理CAN Driver的主要任务,如发送和接收CAN帧...
当使用多个CanDrv时,识别CanDrv 确定访问CAN硬件传输对象的HTH 调用CanDrv的Can_Write() 如果传输请求服务CanIf_Transmit()返回E_OK,则传输成功完成。 如果一个L-PDU被请求通过一个PDU通道模式来传输,这个模式等于CANIF_OFFLINE,那么CanIf应该向DET的Det_ReportRuntimeError()服务报告运行时的错误代码CANIF_E_STOP...
CAN Driver模块的Can_MainFunction_Write函数将访问CanController(硬件)有关寄存器,读取有关数据供向上层确认; 数据读取结束后,这时继续调用CAN Interface模块的CanIf_TxComfirmation函数,这样数据从CAN Driver模块传给了上层的CAN Interface模块; CAN Interface模块再调用PduR模块的PduR_TxConfirmation函数,将数据传到PduR...
Can_ReturnType Can_17_McmCan_Write(const Can_HwHandleType Hth, const Can_PduType *const PduInfo) 1. 2. 复制 这里面通过两个全局变量来获取CAN硬件的相关配置,和当前这帧报文的相关配置。 /* Variable to hold the pointers to variables holding core specific CAN ...
与CAN接收功能一样,Can_Write函数将访问仲裁,数据长度和数据寄存器,将数据写入。 图5也描述了数据发送后的确认过程,即: BSW调度器周期性调用CAN Driver模块的Can_MainFunction_Write函数; CAN Driver模块的Can_MainFunction_Write函数将访问CanController(硬件)有关寄存器,读取有关数据供向上层确认; ...