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.

TMS320F280039C: MCAN配置为DCAN的位配置

Part Number: TMS320F280039C
Other Parts Discussed in Thread: C2000WARE

项目需求将MCAN配置为普通CAN进行收发,参考C2000WARE的例程mcan_ex5_mask_filter_receive工程进行收发,配置过程中遇到疑惑:

1、MCAN_DBTP寄存器和MCAN_NBTP寄存器有=作用是什么,有什么区别?

2、例程里面的结构体MCAN_BitTimingParams参数有MCAN_DBTP和MCAN_NBTP的,为什么MCAN_setBitTime只用到了其中的MCAN_NBTP部分?

3、实现我的工程配置是否只需要配置MCAN_NBTP寄存器,然后使用MCAN_setBitTime()函数进行配置即可?

  • 为了将MCAN配置成普通CAN,是否需要MCAN_DBTP和MCAN_NBTP两个寄存器配置成位时间一致,如都配成500kbps

  • 如果MCAN配置成了普通CAN,接收到一帧CAN2.0报文后,MCAN_PSR.RFDF会置1吗

  • 感谢,我会持续关注

  • 有个新的问题,使用MCAN例程在LAUNCHXL板上做CAN收发,修改TX/RX引脚映射为GPIO4/5,同时将FD mode disable,将Bit rate switching disable,为什么修改后的例程只能接收一次CAN报文(非CANFD),第二次中断无法触发

  • 那边的工程师有回复了,请看一下有没有需要跟进的,我一并转达过去。

  • 回复的第五条他的理解不太对,是将MCAN模块配置成经典CAN后,收发到一个经典CAN报文后寄存器的表现方式

    另外就是上面提到的例程,例程工程名叫mcan_ex5_mask_filter_receive;

    我也使用过mcan_ex8_range_filter_receive工程测试过,同样只能触发第一次中断

  • 请问有后续消息吗

  • 我跟进过去了

  • 你好,自己测试解决了,中断的断点触发一次暂停后,继续运行会出现CCS打的断点无法触发,实际上代码已经运行过去了

  • 好的,方便分享一下解决方案吗?

  • 配置CAN接收为RX_FIFO_1接收,中断line select line 2,

    部分代码如下:

    uint8_t intr_cnt = 0;

    uint8_t new_msg_cnt = 0;

    __interrupt void MCANIntr1ISR(void)
    {
    uint32_t intrStatus;

    intr_cnt ++;

    intrStatus = MCAN_getIntrStatus(MCAN_MSG_RAM_BASE);

    //
    // Clearing the interrupt lineNum
    //
    HW_WR_FIELD32(MCAN_MSG_RAM_BASE + MCAN_MCANSS_EOI, MCAN_MCANSS_EOI, 0x2);

    //
    // Clear the interrupt Status.
    //
    MCAN_clearIntrStatus(MCAN_MSG_RAM_BASE, intrStatus);

    //
    // Check to see if the interrupt is caused by a new message being
    // received in RX FIFO 1
    //
    if((MCAN_INTR_SRC_RX_FIFO1_NEW_MSG & intrStatus) == MCAN_INTR_SRC_RX_FIFO1_NEW_MSG)
    {

    new_msg_cnt ++;


    MCAN_readMsgRam(MCAN_MSG_RAM_BASE, MCAN_MEM_TYPE_FIFO, 0U,
    MCAN_RX_FIFO_NUM_1, &rxMsg1);

    rxMsg[0] = rxMsg1;
    RxFS.num = MCAN_RX_FIFO_NUM_1;

    MCAN_writeRxFIFOAck(MCAN_MSG_RAM_BASE, MCAN_RX_FIFO_NUM_1,
    RxFS.getIdx);
    }
    else
    {

    //
    // Interrupt handling for other interrupt sources goes here
    //

    }

    //
    // Acknowledge this interrupt located in group 9
    //
    Interrupt_clearACKGroup(INTERRUPT_ACK_GROUP9);
    }

    通过上位机发送一帧经典CAN数据帧,CCS的expressions窗口实时监测intr_cnt值和new_msg_cnt值,可以观察到每次发送一帧数据帧,new_msg_cnt 增加1,intr_cnt增加2,可见中断函数的进入两次,而NEW_MSG处理部分只进入一次,使用官方的例程ex5稍微修改后就能复现这个现象。

    可以判断中断可以反复触发,但是如果使用CCS打断点进中断函数,每个断点只会停止一次,这个现象需要研究一下,我也没有头绪,但是通过new_msg_cnt 和intr_cnt的变化来看,实际中断都是会触发的