CAN2 进不去中断,为什么
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现场恢复
}
在CAN网络中,CAN2协议是一种常用的28位协议,主要用于自动化控制设备之间的通信。CAN2帧包含以下信息:
CAN2: CAN2RX(P02), CAN2TX(P03)
CAN2FR: CAN2Frame数(1-1024)
CAN2BW: CAN2总线宽度(1-4)
CAN2ID: CAN2ID寄存器(1-24)
CAN2TID: CAN2TotalID寄存器(1-8)
在CAN网络中,功能设置(CANymoon)是一个至关重要的部分,它决定了CAN2帧在通信系统中的行为。功能设置包括以下参数:
CANymoon: CAN功能使能(0-63)
CANIMR: CAN中断寄存器(0-0xFF)
CANSJD: CAN同步跳变(0~3)
CANSAM: CAN采样次数(0~7)
CANTSG1: CAN同步采样段1(0~15)
CANTSG2: CAN同步采样段2(0~7)
CANBRP: 波特率(0~63)
CANACR0-2: CAN总线验收代码寄存器(0~0xFF)
在CAN网络中,断点检测(CAN中断)需要一个中断寄存器(CANIMR)来保存中断状态。CANIMR的范围是0~0xFF,表示中断状态的16位二进制数。
在CAN网络中,CAN2帧的生成和初始化是一个复杂的过程。通常,CAN2帧的生成需要通过CAN2初态(CAN2FG1)来初始化CAN2网络设备。CAN2初态的设置包括功能设置(CANymoon)和中断寄存器(CANIMR)。
以下是一些在CAN网络中可能遇到的问题和解决方案:
1. CAN中断无法正确检测:如果中断寄存器(CANIMR)未正确设置,导致中断检测无法生效。建议检查CANIMR的设置值是否正确,并确保符合CAN标准。
2. CAN2初态未正确初始化网络设备:如果网络设备未正确初始化CAN2初态,会导致CAN2帧无法正确发送。建议通过CAN HW的CAN2FG1功能设置来正确初始化网络设备。
3. CAN2帧生成失败:如果CAN2帧生成失败,可能是因为功能设置或中断寄存器设置错误。建议查阅CAN HW的手册,确保功能设置正确。
4. CAN中断检测失败:如果中断检测失败,可能是因为中断寄存器未正确设置或功能设置未正确。建议检查CANIMR的设置,确保符合CAN标准。
在CAN网络中,功能设置是关键部分,需要仔细配置才能确保CAN2帧的正确发送和断点检测。如果功能设置存在问题,可能导致CAN网络无法正常工作。建议通过CAN HW的CAN2FG1功能设置来正确配置功能设置。
此外,断点检测(CAN中断)是CAN协议中非常重要的部分。断点检测通过中断寄存器(CANIMR)来保存中断状态,中断检测通过CAN中断检测功能(CANIMD)来检测中断状态。断点检测可以用于检测网络设备之间的连接中断,确保网络设备的通信正常。
在实际使用中,CAN中断检测通常通过CAN中断检测功能(CANIMD)来实现。CAN中断检测功能包括断点检测(CAN中断检测)和断点检测校验(CAN中断校验)。
综上所述,在CAN网络中,功能设置和中断处理是关键部分。需要仔细配置功能设置以确保CAN2帧的正确发送和断点检测的正常工作。如果功能设置存在问题,建议通过CAN HW的CAN2FG1功能设置来正确配置功能设置。同时,还需要正确设置中断寄存器(CANIMR)和中断检测功能(CANIMD),以确保断点检测的正常工作。
[本文内容由国芯人工智能辅助生成,仅供参考] 没开总中断?
参考32G实验箱例程测试下:
深圳国芯人工智能有限公司-实验箱
深圳国芯人工智能有限公司-核心功能实验板
ercircle 发表于 2025-6-9 09:30
没开总中断?
参考32G实验箱例程测试下:
可以发,但是进不了中断,中断打开了 吴俊杰 发表于 2025-6-9 09:38
可以发,但是进不了中断,中断打开了
可以发,但Tx中断也触发不了?
试下上面例程,另外1L这个库函数版本和库函数例程也有点差异:
尝试下用 AiCube 来支持 CAN / Lin 的通信
页:
[1]