- 打卡等级:初来乍到
- 打卡总天数:3
- 最近打卡:2025-06-09 09:26:01
已绑定手机
新手上路
- 积分
- 24
|
void CANInit(void)
{
CAN_InitTypeDef CAN_InitStructure; //结构定义
P_SW3 &= ~0x03; //CAN2: CAN2RX(P0.2), CAN2TX(P0.3)
CAN_InitStructure.CAN_Enable = ENABLE; //CAN功能使能 ENABLE,DISABLE
CAN_InitStructure.CAN_IMR = 0xff; //CAN中断寄存器 CAN_DOIM,CAN_BEIM,CAN_TIM,CAN_RIM,CAN_EPIM,CAN_EWIM,CAN_ALIM,CAN_ALLIM,DISABLE
CAN_InitStructure.CAN_SJW = SJW; //重新同步跳跃宽度 0~3
CAN_InitStructure.CAN_SAM = SAM; //总线电平采样次数 0:采样1次; 1:采样3次
CAN_InitStructure.CAN_TSG1 = TSG1; //同步采样段1 0~15
CAN_InitStructure.CAN_TSG2 = TSG2; //同步采样段2 1~7 (TSG2 不能设置为0)
CAN_InitStructure.CAN_BRP = BRP; //波特率分频系数 0~63
CAN_InitStructure.CAN_ACR0 = 0x00; //总线验收代码寄存器 0~0xFF
CAN_InitStructure.CAN_ACR1 = 0x00;
CAN_InitStructure.CAN_ACR2 = 0x00;
CAN_InitStructure.CAN_ACR3 = 0x00;
CAN_InitStructure.CAN_AMR0 = 0xff; //总线验收屏蔽寄存器 0~0xFF
CAN_InitStructure.CAN_AMR1 = 0xff;
CAN_InitStructure.CAN_AMR2 = 0xff;
CAN_InitStructure.CAN_AMR3 = 0xff;
CAN_Inilize(CAN2, &CAN_InitStructure); //初始化CAN1 CAN1,CAN2
CANSEL = 1; //选择CAN2模块
// CANICR = 0x02; //CAN中断使能
CANICR |= 0x20; //CAN中断使能
}
void CAN2_ISR_Handler(void) interrupt CAN2_VECTOR
{
u8 isr;
u8 store;
u8 arTemp;
P31=1;
arTemp = CANAR; //先CANAR现场保存,避免主循环里写完 CANAR 后产生中断,在中断里修改了 CANAR 内容
store = AUXR2; //后AUXR2现场保存
AUXR2 |= 0x08; //选择CAN2模块
isr = CanReadReg(ISR); //读取中断寄存器
CanWriteReg(ISR, isr); // 直接写ISR寄存器清除标志位
if((isr & CAN_TIM) == CAN_TIM) //TI 发送中断
{
CAN_TX_Flag = 0; //发送完成,CAN发送状态标记清零
}
if((isr & CAN_RIM) == CAN_RIM) //RI 接收中断
{
CAN_RX_Flag = 1; //接收完成,CAN接收状态标记置1
//ReadID = CanReadStandardFrame(CAN_RX_BUF); // 读取ID和数据
}
if((isr & CAN_EWIM) == CAN_EWIM) //EWI 错位警告中断
{
CANAR = MR;
CANDR &= ~0x04; //清除 Reset Mode, 从BUS-OFF状态退出
}
if((isr & CAN_ALIM) == CAN_ALIM) //ALI 仲裁丢失中断
{ }
if((isr & CAN_EPIM) == CAN_EPIM) //EPI 被动错位中断
{ }
if((isr & CAN_BEIM) == CAN_BEIM) //BEI 总线错位中断
{ }
if((isr & CAN_DOIM) == CAN_DOIM) //DOI 接收溢出中断
{ }
AUXR2 = store; //先AUXR2现场恢复
CANAR = arTemp; //后CANAR现场恢复
}
|
|