imx6 flexcan的初始化流程
复位
flexcan有两种复位模式:
1.包括芯片在内的硬复位,这时候会异步的清空所有映射的寄存器
2.MCR寄存器中的soft_rst位,该寄存器会同步的重置一部分映射的寄存器
软复位是需要时间的,在软复位期间,SOFT_RST该位会挂起,所以可以通过poll该位来判断软复位是否结束,注意的是在时钟模块没有开启的时候,不能进行软复位,在低功耗模式下,必须先恢复时钟,再进行软复位。
MDIS清零之后,flexcan会自动的进入的free模式,在freeze模式下,flexcan与can总线并不保持同步,MCR寄存器中的HALT和FRZ位置1,内部状态机被禁止,MCR寄存器中的FRZ_ACK和NOT_RDY位置1, Tx引脚处于隐性状态,FLEXCAN不会启动CAN帧的任何传输或接收
另外,消息缓冲区和rx的自己的掩码寄存器是不会被复位影响的,因此它们并不会被自动的初始化。
flexcan要求在进行任何改变和初始化的时候,需要进入freeze模式。
以下为具体的初始化过程:
1.初始化模块配置寄存器(Module Configuration Register)
•设置IRMQ位,启用individual filtering per MB和接收队列特性
•设置WRN_EN位置1使能警告中断
•将SRX_DIS位置1来禁用帧自接收,如果有需要的话
•通过将RFEN位置1使能FIFO
•通过将AEN位置1来使能中止机制
•通过将LPRIO_EN位置1使能本地优先级功能
2.初始化控制寄存器(Control Register )
•确定传输速率的时钟参数:PROPSEG,PSEG1,PSEG2,RJW
•确定传输速率的分频系数PRESDIV字段
•确定内部仲裁模式(LBUF位)
3.初始化消息缓存
•必须初始化所有消息缓冲区的控制和状态字
•如果启用了FIFO,则必须初始化8-enrty的ID表
•应根据需要初始化每个消息缓冲区中的其他条目
4.初始化rx mask寄存器(Rx Individual Mask Registers )
5.在IMASK寄存器中设置所需的中断屏蔽位(对于所有MB中断),在
CTRL寄存器(用于总线关闭和错误中断)和MCR寄存器用于唤醒
打断功能
6.对MCR中的HALT位清零
初始化流程over