can总线的初始化,是can总线程序的基础,也是难点,因为初始化需要完成各个寄存器的设置,这就需要对can协议的扎实掌握和对can术语的深刻理解。
can总线的初始化主要包括模式寄存器的设置,中断方式的设置,波特率的设置,还有错误警告,发送优先级模式寄存器的设置等。can总线的初始化程序如下所示:
void InitCAN(eCANNUM CanNum)
{
HwEnCAN(CanNum); //硬件使螚can控制器,包括引脚初始化,外部。具体分析如下HwEnCAN函数。
SoftRstCAN(CanNum); //通过在can控制器的某位写入1,来达到软件复位的目的。具体分析如下SoftRstCAN函数。
CANEWL(CanNum).Bits.EWL_BIT = USE_EWL_CAN[CanNum];//设置错误警告寄存器,错误警告默认计数为96. 在CAN 操作过程中,该值与Tx 和Rx 错误计数器的计数器相比较,如果其中一个计数值与该值相等,CANSR 的错误状态(ES)位置位。ES为1时-错误状态:发送和接收错误计数器的计数值或其中一个的计数值已经达到出错警告界限寄存器中设置的阈值。
CANBTR(CanNum).Word = USE_BTR_CAN[CanNum];// 初始化波特率。
//初始化中断为非向量中断
VICDefVectAddr =(UINT32)CANIntPrg;
VICIntEnable |=(1<<19)|(1<<(20+ CanNum))|(1<<(26+ CanNum));//每个CAN 控制器可产生3 种中断请求:接收、发送和“其它状态”,这里