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.

关于28377S的CAN接收中断的设置?



本人基于TI开发板LAUNCHPAD-XL TMS320F28377SPZPT结合ControlSuit中的例程《can_loopback》进行针对CAN通讯的调试。

将测试模式更改为正常模式下,如下注释掉测试模式:

//HWREG(CANA_BASE + CAN_O_CTL) |= CAN_CTL_TEST;
//HWREG(CANA_BASE + CAN_O_TEST) = CAN_TEST_EXL;

通过CANalyst进行测试,can上位机界面既可以读取来自DSP的数据,也可以向DSP成功发送数据,即DSP可以接收到CAN数据(此处DSP的CAN数据收发采用的是for主循环);

进一步,考虑到响应的实时性,想通过设置接收中断使能来触发一个CAN的接收中断,相应增加的部分代码如下:

CANIntEnable(CANA_BASE, CAN_INT_MASTER);//CAN_INT_STATUS);// | CAN_INT_ERROR |

EALLOW;
PieVectTable.CANA0_INT = CANIntHandler;
EDIS;

// Enable the CAN interrupt on the processor (PIE).
PieCtrlRegs.PIEIER9.bit.INTx5 = 1;
IER |= 0x0100; /* M_INT9 */
EINT;

CANGlobalIntEnable(CANA_BASE, CAN_GLB_INT_CANINT0);

以及增加参考例程lab30_can_loopback_interrupts中的中断处理函数interrupt void CANIntHandler(void);

最后在主循环中注释掉CAN接收处理函数(因为接收中断函数中有一个状态可以进入进行接收处理)

但这个好像一直响应着发送,却总也不能进入接收处理状态,不知道哪里没有设置到位还是???

  • 1.上位机确实有数据发过来了吗?

    2.can高与can低是否有接匹配电阻?

    3.单步测下程序是否有进中断服务程序。

  • Seven,

          谢谢你的分析!

    1、首先,上位机是有数据发送过来的,在DSP上can在for主循环中用循环查询方式收发数据的时候都是可以和上位机成功进行数据交互的。

    2、开发板上本来就有匹配电阻的。CANalyst也是选通了匹配电阻的。

    3、单步调试的时候根据CANIntEnable(CANA_BASE,CAN_INT_STATUS | CAN_INT_ERROR | CAN_INT_MASTER);中断源的选择而相应触发中断并进入中断,但是在进入中断后,无论如何也没有ulStatus = CANIntStatus(CANA_BASE, CAN_INT_STS_CAUSE)=2的情况出现,也就是怎么也没有响应接收中断。这里应该就是可以理解为CAN_INT寄存器中的INT0ID在进入中断后的值总不为2.因为只有当该值为2时才进行数据的读取,如下:

    ......

    else if(ulStatus == 2) // Check if the cause is message object 1, which what we are using for receiving messages.
    {
    // Get the received message
    CANMessageGet(CANA_BASE, 2, &sRXCANMessage, true);

    // Getting to this point means that the TX interrupt occurred on
    // message object 1, and the message TX is complete. Clear the
    // message object interrupt.
    CANIntClear(CANA_BASE, 2);

    // Increment a counter to keep track of how many messages have been
    // sent. In a real application this could be used to set flags to
    // indicate when a message is sent.
    g_ulRxMsgCount++;

    // Since the message was sent, clear any error flags.
    g_bErrFlag = 0;
    }

    ......