void Can_Init(const Can_ConfigType* Config)
初始化函数,输入为CAN模块配置结构体指针,在MCU启动时调用,初始化CAN模块的时钟、波特率、引脚、接收发送邮箱等一系列寄存器。完毕后将CAN控制器的状态由CAN_CS_UNINIT转换为CAN_CS_STOPPED。
Std_ReturnType Can_SetBaudrate(uint8 Controller,uint16 BaudRateConfigID)
设置CAN模块某个控制器的波特率,输入为控制器ID和波特率ID,所有波特率要被定义为一个结构体,并分配ID,共波特率切换时调用。
Std_ReturnType Can_SetControllerMode(uint8 Controller,Can_ControllerStateType Transition)
转换某个CAN控制器的状态。CAN控制器在初始化完毕后处于STOPPED状态,要调用这个函数转换为STARTED状态后才能参与网络通信。
轮询函数要在应用程序中被周期性调用。
void Can_MainFunction_Write(void)
当发送成功确认没有被配置为中断模式时,该函数中会逐个查询当前是否有Hth的报文发送成功,如果有,就会调用下面这个函数一层层向上层报告发送成功:
CanIf_TxConfirmation(PduIdType CanTxPduId)
Hth通常对应一个MO或报文发送邮箱。CanTxPduId、Hth ID和MO ID是一一对应的。
void Can_MainFunction_Read(void)
当报文接收没有被配置为中断模式时,该函数会查询当前所有MO或接收报文邮箱是否有报文被成功接收,如果有,就会下面这个函数来向上层报告有报文被接收:
CanIf_RxIndication(const Can_HwHandleType Hrh, const Can_IdType CanId, const PduInfoType* PduInfoPtr)
Hrh ID、MO ID或接收报文邮箱ID是一一对应的。
void Can_MainFunction_BusOff(void)
当Busoff处理方式没有被配置为中断模式时,该函数会检查CAN 控制器是否处于Busoff状态,如果是,则会报相应的故障,并将CAN控制器状态转换为CAN_CS_STOPPED,并调用下面的函数向上层报告CAN Busoff:
CanIf_ControllerBusOff(uint8 ControllerId)
Std_ReturnType Can_Write(Can_HwHandleType Hth, const Can_PduType* PduInfo)
typedef struct
{
PduIdType swPduHandle;
uint8 length;
Can_IdType id;
uint8* sdu;
} Can_PduType;
Can_Write函数是供CANIF层发送报文调用的接口,在下面的函数中被调用:
Std_ReturnType CanIf_Transmit(PduIdType TxPduId, const PduInfoType* PduInfoPtr)
输入参数1 Hth对应着使用哪个MO或发送邮箱进行发送,输入参数2 PduInfoPtr是要发送的内容,包含的参数如代码中的结构体所示,有CAN ID、数据、长度以及PDU ID。在发送该帧报文的时候会把PDU ID和Hrh的对应关系记录下来,在Can_MainFunction_Write函数中进行发送成功确认的时候,要使用相同的对应关系。
Can_Irq.c文件中是CAN接收、发送和Busoff中断处理函数,如果定义CAN接收、发送成功确认和Busoff为中断模式,则上面的三个轮询函数不再起作用,而是在中断中调用CANIF层的相应函数进行处理。
Can_Cfg.c/h文件是CAN驱动配置文件,在配置文件中药配置CAN控制器的属性、波特率、Hrh、Hth等信息,具体配置内容参考《AUTOSAR_SWS_CANDriver》中10.2章节。
本文只是简要梳理一下MCAL CAN Driver中的常用API,不全面,详细内容请参考《AUTOSAR_SWS_CANDriver》。