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.

TMS320F28388D: 使用官方MCAN代码无法正常收发信息

Part Number: TMS320F28388D
Other Parts Discussed in Thread: TMDSCNCD28388D, SYSCONFIG, C2000WARE

您好!
我正在使用TMS320F28388D的CANFD通信代码,我在使用官方提供的代码时发现问题如下:
我使用的例程是MCAN_ex3_loopback_syscfg;在下载程序后进行仿真发现代码卡在while循环里面:
具体位置如下:


在这个例程中我只修改了我的晶振时钟和引脚,由25MHz变为了20Mhz,引脚由原本的GPIO30,31改为了GPIO36,37,使用了软件配置,具体如下:


请问我该如何解决这个问题,来实现CANFD的通信收发代码?
感谢答复!!

  • 您好,

    已经收到了您的案例,调查需要些时间,感谢您的耐心等待

  • 感谢您的答复,我在使用其他案例是也不能通信,编译工程也没有报错,是否是我环境配置的不对,例程直接下载就可以使用嘛?

  • 您是否使用TMDSCNCD28388D控制卡?如果是这样,默认时钟是来自带时钟分离器U5的野猪振荡器Y1的25MHz时钟。只是想仔细检查一下,我是否有正确的硬件信息来测试这个例子。

  • 感谢答复,

    我没有使用TMDSCNCD28388D控制卡,是自制的板子,我的晶振电路为:


    但我已经在程序中将25Mhz改为了20Mhz,操作为:



    再次感谢答复!

  • 我使用的是GPIO36和GPIO37做CANFD通信引脚,这两个引脚也可以配置为CAN通信,在我使用官方例程配置为CAN通信时能够正常收发信号,我想我的电路应该没有问题,我的CANFD收发电路为:


    我使用的芯片最高波特率为1Mbps,但我看官方代码配置为仲裁段为500Kbps,数据段为1Mbps;
    使用MCAN_ex1_loopback;例程时发现代码可以运行,不会卡在 while(isrIntr1Flag){}循环里面,但上位机接收到的通信时序不对,还请解答是什么问题?

  • 你好,

    内部环回测试不需要外部MCAN引脚或收发器,因此无论配置了哪些引脚,示例环回测试用例都应该运行。以下代码卡住的循环表示MCAN配置不正确:

    在振荡器电路上,由于F28388D的内部振荡器具有内置反馈电阻器,因此不需要X1和X2之间的1Meg。还要确保所选的XTAL符合CL和最大ESR的数据表规范。我怀疑该设备没有正确计时,这可能会导致MCAN初始化出现问题。你能监测X1和X2引脚上的时钟活动吗?

  • 您好,上述图片我看不到,我使用示波器检测时钟活动正常,为正常的20Mhz。此外我还做了以下测试:
    我使用另外一块开发板做测试,它的晶振电路为:

    使用的是官方给定的原理图例程,也发生了同样的问题(一直卡在while(isrIntr1Flag){}),
    当我配置我使用的引脚为CAN通信或者将MCAN作为CAN通信时传输是正常的。
    所以我怀疑不是晶振的原因。

  • 您好!
    图片貌似加载不出:

  • 您好,

    请参考下面的图片

  • 好的,我使用了我的F28388D控制卡,使用了您在帖子中显示的25MHz时钟源,在运行MCAN示例测试用例时没有看到任何问题。控制卡和软件示例均未进行任何更改。

    你能验证你的设置中可能发生了什么变化吗?

  • 您好,整个例程中我没有做过任何修改,唯一的修改就是选则了我使用的芯片


    我的主函数代码为:

    Fullscreen
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    //
    // Include Files
    //
    #include "driverlib.h"
    #include "device.h"
    #include "inc/stw_dataTypes.h"
    #include "inc/stw_types.h"
    #include <string.h>
    #include "board.h"
    //
    // Defines
    //
    #define MCAN_EXT_ID_AND_MASK (0x1FFFFFFFU)
    #define MCAN_MSG_INT (0x81200)
    //
    // Global Variables.
    //
    volatile uint32_t isrIntr0Flag = 1U;
    volatile uint32_t isrIntr1Flag = 1U;
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    我的sysconfig的配置为:


    上述配置为打开之后的默认配置,
    代码编译也没有错误,有一个警告说#179-D function "MCANFilterConfig" was declared but never referenced ,删除没有调用的这行代码警告会消失

  • 我还测试了MCAN_ex1_loopback的例程,这个例程可以使用

  • 好吧,看来时钟不是问题。现在,以mcan_ex3_loopback为例,您能否在ISR例程中设置一个断点,如下所示,然后运行以查看代码是否到达中断?

  • 您好,

    我试了几种方法,发现均进不了中断

  • 看来时钟不是问题。现在,以mcan_ex3_loopback为例,您能否在ISR例程中设置一个断点,如下所示,然后运行以查看代码是否到达中断?

  • 您好,我设置了断点,无法进入中断,程序依然卡在这里:


     

  • 不知道是否是环境的原因,我使用的环境为CCS_12_8_1,C2000Ware_5_04_00_00,sysconfig_1_21_0

  • 抱歉,我不确定问题是什么,所以我无法发表评论。我以为你有一个设置,可以通过while(IsrIntr1Flag)轮询例程。您能否获取或识别成功运行while轮询例程的设置?我认为我们混淆了这些问题。