CAN和LIN 的中断标志位 CANIF、LINIF工作原理?
看数据手册,在13.4.2中断请求寄存器这节介绍,CANIF、CAN2IF、LINIF 三个中断标志位是只读。我理解就是只能读,不能修改;
但是在31.2.2 CAN总线中断控制寄存器介绍中,CANIF 和 CAN2IF 是CAN 总线中断请求标志位,需软件清零。但在实例程序中没有看到对CANIF 软件清零的程序。
32.2.2 LIN 总线中断控制寄存器(LINICR)介绍中,LINIF:LIN 总线中断请求标志位,硬件清零(读取 LSR 清零)。
所有想让大佬们帮忙给我权威的解释。
实例程序中:
开启CAN中断
- CANICR = 0x02; //CAN 中断使能
- AUXR2 |= 0x02; //CAN 模块被使能
复制代码
CAN中断中断程序- void CANBUS_Interrupt(void) interrupt 28
- {
- u8 isr;
- isr = CanReadReg(ISR);
- if((isr & 0x04) == 0x04)
- {
- CANAR = 0x03;
- CANDR = 0x04; //CLR FLAG
- }
- if((isr & 0x08) == 0x08)
- {
- CANAR = 0x03;
- CANDR = 0x08; //CLR FLAG
- CAN_ID = CanReadMsg(RX_BUF); //接收 CAN 总线数据
- CanSendMsg(CAN_ID+1,RX_BUF); //CANID 加 1,原样发送 CAN 总线数据
- }
- }
复制代码
LIN中断初始化程序
- LINICR = 0x02; //LIN 模块中断使能
- AUXR2 |= 0x01; //LIN 模块被使能
复制代码
LIN中断程序
- void LinBUS_Interrupt(void) interrupt LIN_VECTOR
- {
- u8 isr;
- isr = LinReadReg(LSR);
- if((isr & 0x03) == 0x03) //接收到 Header, 处于 Ready 状态
- {
- isr = LinReadReg(LER);
- if(isr == 0x00) //没有产生错误
- {
- P46 = ~P46;
- isr = LinReadReg(LID);
- if(isr == 0x12) //判断是否从机响应 ID
- {
- LinTxResponse(TX_BUF); //返回响应数据
- }
- else
- {
- RxFlag = 1;
- }
- }
- }
- else
- {
- isr = LinReadReg(LER); //读取清除错误寄存器
- }
- }
复制代码
|