CAN Driver在CAN通讯中的位置
一个CAN Hardware Uint由一个或多个Controller组成,Controller可以位于芯片上,也可以作为外部独立的设备。一个Controller对应一个CAN节点即一个物理通道,一个一般包含多个报文邮箱(Mailbox)。
CAN模块驱动状态机有两个状态,在上电或重置后,CAN模块进入CAN_UNINIT状态(未初始化状态),初始化后,CAN模块进入CAN_READY状态,这时可执行一些与读、写、总线关闭、唤醒和控制器状态设置相关的功能。
CAN Controller状态机比CAN Driver状态机复杂点,分为四个状态:
CAN模块提供三个服务:Can_Init, Can_SetBaudrate, Can_SetControllerMode。当切换CAN状态机时,调用这些服务设置对应的寄存器。
CAN状态机的跳转如下图所示:
上电后, CAN首先进入UINIT状态,直到调用Can_Init()函数,进行CAN模块初始化,然后CAN模块进入STOPPED状态,此时表示CAN模块已经初始化完成,但是并不参与总线通信。
然后当函数Can_SetControllerMode(CAN_CS_STARTED)被调用后, CAN模块进入STARTED模式,在STARTED模式下CAN模块正常工作,可进行CAN报文的收发。
当函数Can_SetControllerMode(CAN_CS_STOPPED)被调用后, CAN状态进入STOPPED状态,此时CAN模块停止参与总线通信。
当函数Can_SetControllerMode(CAN_CS_SLEEP)被调用后, CAN状态由STOPPED状态进入SLEEP状态。当Can_Delnit()被调用后,CAN状态机进入UNINIT状态。
另外,除了由软件触发的CAN模块状态机跳转,以下硬件条件也可触发CAN状态机跳转。
如上图所示,每个硬件对象由ID,DLC,SDU组成。ID是硬件对象的编号,DLC是数据长度,SDU是要接收或者发送的数据。
用来存储接收数据的硬件对象被称为HRH(Hardware Recieve Handle)
用来存储发送数据的硬件对象被称为HTH(Hardware Transmit Handle)。