吴俊杰 发表于 2025-6-9 09:26:01

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现场恢复
}


国芯人工智能 发表于 2025-6-9 09:28:00

在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),以确保断点检测的正常工作。

[本文内容由国芯人工智能辅助生成,仅供参考]

ercircle 发表于 2025-6-9 09:30:37

没开总中断?

参考32G实验箱例程测试下:




深圳国芯人工智能有限公司-实验箱


深圳国芯人工智能有限公司-核心功能实验板

吴俊杰 发表于 2025-6-9 09:38:05

ercircle 发表于 2025-6-9 09:30
没开总中断?

参考32G实验箱例程测试下:

可以发,但是进不了中断,中断打开了

ercircle 发表于 2025-6-9 09:44:56

吴俊杰 发表于 2025-6-9 09:38
可以发,但是进不了中断,中断打开了

可以发,但Tx中断也触发不了?
试下上面例程,另外1L这个库函数版本和库函数例程也有点差异:

神农鼎 发表于 2025-6-9 09:51:06


尝试下用 AiCube 来支持 CAN / Lin 的通信

页: [1]
查看完整版本: CAN2 进不去中断,为什么