This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] TMS320F28031:使 ECAN0INTA 中断在 CAN 接收上运行

Guru**** 2387060 points
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/715642/tms320f28031-getting-the-ecan0inta-interrupt-operational-on-can-reception

器件型号:TMS320F28031

您好!  

我正在尝试启用 ECAN0INTA 中断以进行接收、然后使用 ECAN0INTA_ISR 函数对其进行服务、该函数是 DSP2803x_DefaultIsr.c 文件的一部分。 以下是我已执行的步骤:

步骤1:配置中断:  (请注意、CAN 通信工作正常、目前我们通过查询 CANRMP 寄存器来使用中断、但我们需要 ISR 额外工作。)

//在 CAN 上配置中断的示例模板和步骤

//####################################################################################################################################################################################################################

// MBOX15是接收分布式控制输出的 RX 邮箱。 因为接收具有时间关键型

//从这个邮箱使用中断进行控制

//首先、除邮箱 TX-RX 中断外的所有 CAN 中断都将被禁用。 以下寄存器包含

//启用/禁用除 RX-TX 以外的所有事件的控制(例如、 总线关闭、超时、中止确认等)

ECANaRegs.CANGIM.ALL = 0;

//下一步选择特定邮箱的中断线路。 我们有2种选择:ECAN1INT 或 ECAN0int 线路。

// 0:选择 ECAN0INT 电平

// 1:选择 ECAN1INT 电平

//我们将使用 ECAN0INT

ECanaShady.CANMIL.ALL = ECanaRegs.CANMIL.ALL;

ECANaShady.CANMIL.bit.MIL15 = ECAN0INT_LEVEL_SELECT;//选择 ECAN0INT 电平以生成 MBOX15中断

//{默认情况下、其他也配置为 ECAN0INT 级别、但我们无关)

ECanaRegs.CANMIL.ALL = ECanaShady.CANMIL.ALL;

//启用 MBOX15邮箱中断

ECanaShady.CANMIM.ALL = ECanaRegs.CANMIL.ALL;

ECanaShady.CANMIM.bit.MIP15 = ENABLE_INT;

ECANaRegs.CANMIM.ALL = ECANaShady.CANMIM.ALL;

//在外设级别启用 ECAN0INT

ECanaShadure.CANGIM.ALL = ECanaRegs.CANMIL.ALL;

//  ECanaShading.CANGIM.bit.I0EN = ENABLE_INT;

ECanaShadure.CANGIM.ALL = 0xFFFFFFFF;

ECANARegs.CANGIM.ALL = ECANaShadure.CANGIM.ALL;

//####################################################################################################################################################################################################################

EDIS;



如您所见、我只是将接收邮箱15的中断设置为0级。

 

步骤2:配置 ISR 处理:

 EALLOW;

 /*使用默认 ISR 矢量*/

 PieVectTable.ADCINT1 = ADCINT1_ISR;

 PieVectTable.ECAP1_INT = ECAP1_INT_ISR;

 PieVectTable.SCIRXINTA = SCIRXINTA_ISR;

 PieVectTable.ECAN0INTA = ECAN0INTA_ISR;

 PieVectTable.ECAN1INTA = ECAN1INTA_ISR;

 /*在 PIE 级别启用中断*/

 PieCtrlRegs.PIEIER1.bit.INTx1 = ENABLE_INT_PIE_LEVEL;// ADCINT1中断

 PieCtrlRegs.PIEIER4.bit.INTx1 = ENABLE_INT_PIE_LEVEL;// ECAP1_INT 中断

 PieCtrlRegs.PIEIER9.bit.INTx1 = ENABLE_INT_PIE_LEVEL; //Scia Rx 中断

 确认_Group_interrupt (PIEACK_group9);   

 EDIS;

 /*步骤9:在 CPU 级别启用中断*/

 IER |=(M_INT9 | M_INT4 | M_INT1);//在 CPU 级别启用组9、组4和组1中断(M_INT9只是0x0100)

 我这样做是为了启用组9 (请注意、ADC_ISR、SCI_ISR、ECAN_ISR 工作正常。 实际上、SCI_ISR 与 ECAN 的组9)位于同一组中。


我无法通过执行上述操作使 ECAN0INT_ISR 正常工作。 我是否遗漏了什么?  

 

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Hrishikesh、

    您是否了解了 app.note SPRA876B 中的工作示例“CAN_RXINT_A”?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Hareesh、  

    感谢您的回复。 这就解决了问题。  

    我失踪了:
    PieCtrlRegs.PIEIER9.bit.INTx5 = 1; //启用 INT9的 INTx.5 (eCAN0INT)

    这不是步骤的一部分、这使得 PieCtrlRegs.PIEACk.bit.ACK9行似乎  被忽略了、它负责所有的工作。

    谢谢!