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.

[参考译文] TMS320F28335:CAN-A 或 CAN-B 不会间歇性工作。

Guru**** 2595805 points
Other Parts Discussed in Thread: TMS320F28335

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1195098/tms320f28335-can-a-or-can-b-does-not-work-intermittently

器件型号:TMS320F28335

CAN-A 或 CAN-B 不会间歇性工作。

我正在使用 TMS320F28335与其他板进行通信。
它通过 CAN-A 与8个电路板通信
它通过 CAN-B 与8个电路板通信

当在 CAN 通信期间出现间歇性停止的症状时、在检查 CANGIF0寄存器时、结果如下。

CANGIF0寄存器

名称 MTOF0 TCOF0 GMIF0 AAIF0 WDIF0 WUIF0 RMLIF0 BOIF0 EPIF0 WLIF0 保留 保留 保留 MIV0.4 MIV0.3 MIV0.2 MIV0.1 MIV0.0
CANA 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0
卡布 0 1 1 0 1 0 1 0 0 0 0 0 0 1 0 0 1 1
从上面的情况来看、中断似乎没有在邮箱19中被清除。
在这种情况下、当 CANRMP 寄存器被读取时、所有位都清零。
要解决此问题、我需要检查什么?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    同时上传源代码。

    void InitCana (void)//初始化 eCAN-A 模块

    /*为 CAN 控制寄存器创建影子寄存器结构。 这是
    因为只允许对这些寄存器进行32位访问。 16位访问
    这些寄存器可能会损坏寄存器内容或返回
    错误数据。 在对某个位进行写入/读取操作时尤其如此
    位16 - 31 */之间的(或位组)

    struct eCAN-regs ECanaShadow;

    InitECanaGpio();

    EALLOW;// EALLOW 启用对受保护位的访问

    /*使用 eCAN 寄存器为 CAN 操作配置 eCAN RX 和 TX 引脚*/

    ECanaShady.CANTIOC.ALL = ECanaRegs.CANTIOC.ALL;
    ECanaShady.CANTIOC.bit.TXFUNC = 1;
    ECANaRegs.CANTIOC.ALL = ECANaShady.CANTIOC.ALL;

    ECanaShady.CANRIOC.ALL = ECanaRegs.CANRIOC.ALL;
    ECanaShady.CANRIOC.bit.RXFUNC = 1;
    ECANaRegs.CANRIOC.ALL = ECANaShady.CANRIOC.ALL;

    /*将 eCAN 配置为 HECC 模式-(需要访问邮箱16至31)*/
    // HECC 模式也启用时间戳功能

    ECanaShady.CANMC.ALL = ECanaRegs.CANMC.ALL;
    ECanaShading.CANMC.bit.SCB = 1;
    ECanaRegs.CANMC.ALL = ECanaShadure.CANMC.ALL;

    /*将"主控场"的所有位初始化为零*/
    // MSGCTRL 寄存器的某些位出现在未知状态。 为确保正常运行、
    // MSGCTRL 的所有位(包括保留位)都必须初始化为零

    ECANaMboxs.MBOX0.MSGCTRL.ALL = 0x00000000;
    ECANaMboxs.MBOX1.MSGCTRL.ALL = 0x00000000;
    ECANaMboxs.MBOX2.MSGCTRL.ALL = 0x00000000;
    ECANaMboxs.MBOX3.MSGCTRL.ALL = 0x00000000;
    ECANaMboxs.MBOX4.MSGCTRL.ALL = 0x00000000;
    ECANaMboxs.MBOX5.MSGCTRL.ALL = 0x00000000;
    ECANaMboxs.MBOX6.MSGCTRL.ALL = 0x00000000;
    ECANaMboxs.MBOX7.MSGCTRL.ALL = 0x00000000;
    ECANaMboxs.MBOX8.MSGCTRL.ALL = 0x00000000;
    ECANaMboxs.MBOX9.MSGCTRL.ALL = 0x00000000;
    ECANaMboxs.MBOX10.MSGCTRL.ALL = 0x00000000;
    ECANaMboxs.MBOX11.MSGCTRL.ALL = 0x00000000;
    ECANaMboxs.MBOX12.MSGCTRL.ALL = 0x00000000;
    ECANaMboxs.MBOX13.MSGCTRL.ALL = 0x00000000;
    ECANaMboxs.MBOX14.MSGCTRL.ALL = 0x00000000;
    ECANaMboxs.MBOX15.MSGCTRL.ALL = 0x00000000;
    ECANaMboxs.MBOX16.MSGCTRL.ALL = 0x00000000;
    ECANaMboxs.MBOX17.MSGCTRL.ALL = 0x00000000;
    ECANaMboxs.MBOX18.MSGCTRL.ALL = 0x00000000;
    ECANaMboxs.MBOX19.MSGCTRL.ALL = 0x00000000;
    ECANaMboxs.MBOX20.MSGCTRL.ALL = 0x00000000;
    ECANaMboxs.MBOX21.MSGCTRL.ALL = 0x00000000;
    ECANaMboxs.MBOX22.MSGCTRL.ALL = 0x00000000;
    ECANaMboxs.MBOX23.MSGCTRL.ALL = 0x00000000;
    ECANaMboxs.MBOX24.MSGCTRL.ALL = 0x00000000;
    ECANaMboxs.MBOX25.MSGCTRL.ALL = 0x00000000;
    ECANaMboxs.MBOX26.MSGCTRL.ALL = 0x00000000;
    ECANaMboxs.MBOX27.MSGCTRL.ALL = 0x00000000;
    ECANaMboxs.MBOX28.MSGCTRL.ALL = 0x00000000;
    ECANaMboxs.MBOX29.MSGCTRL.ALL = 0x00000000;
    ECANaMboxs.MBOX30.MSGCTRL.ALL = 0x00000000;
    ECANaMboxs.MBOX31.MSGCTRL.ALL = 0x00000000;

    // TAN、RMPn、GIFn 位在复位时都为零并且再次被清零
    //作为预防措施。

    ECANARegs.CANTA.ALL = 0xFFFFFFFF;//清除所有 Tan 位*/

    ECANaRegs.CANRMP.ALL = 0xFFFFFFFF;//清除所有 RMPn 位*/

    ECANaRegs.CANGIF0.ALL = 0xFFFFFFFF;//清除所有中断标志位*/
    ECANaRegs.CANGIF1.ALL = 0xFFFFFFFF;


    /*为 eCANA*/配置位定时参数
    ECanaShady.CANMC.ALL = ECanaRegs.CANMC.ALL;
    ECanaShady.CANMC.bit.CCR = 1;//设置 CCR = 1
    ECanaRegs.CANMC.ALL = ECanaShadure.CANMC.ALL;

    ECanaShady.canes.all = ECanaRegs.canes.all;

    操作

    ECanaShady.canes.all = ECanaRegs.canes.all;
    } while (ECanaShading.canes.bit.CCE!= 1);//等待 CCE 位被置位。

    ECanaShady.CANBTC.ALL = 0;

    DSP2833x_Examples.h 中定义了#IF (CPU_FRQ_150MHz)// CPU_FRQ_150MHz
    /*针对所有150MHz SYSCLKOUT (75MHz CAN 时钟)的以下模块-缺省值。 比特率= 1Mbps
    请参阅文件末尾的注释*/
    ECanaShady.CANBTC.bit.BRPREG = 9;// 4 -> 9 (500Kbps)-> 19 (250kbps)-> 39 (125Kbps)
    ECANaShady.CANBTC.bit.TSEG2REG = 2;// 2.
    ECANaShady.CANBTC.bit.TSEG1REG = 10;// 10
    #endif
    DSP2833x_Examples.h 中定义了#IF (CPU_FRQ_100MHz)// CPU_FRQ_100MHz
    /*以下块仅用于100MHz SYSCLKOUT (50MHz CAN 时钟)。 比特率= 1Mbps
    请参阅文件末尾的注释*/
    ECanaShady.CANBTC.bit.BRPREG = 4;
    ECANaShady.CANBTC.bit.TSEG2REG = 1;
    ECANaShady.CANBTC.bit.TSEG1REG = 6;
    #endif


    ECanaShading.CANBTC.bit.SAM = 1;
    ECANaRegs.CANBTC.ALL = ECANaShady.CANBTC.ALL;

    ECanaShady.CANMC.ALL = ECanaRegs.CANMC.ALL;
    ECanaShady.CANMC.bit.CCR = 0;//设置 CCR = 0
    ECanaRegs.CANMC.ALL = ECanaShadure.CANMC.ALL;

    ECanaShady.canes.all = ECanaRegs.canes.all;

    操作

    ECanaShady.canes.all = ECanaRegs.canes.all;
    } while (ECanaShading.canes.bit.CCE!= 0);//等待 CCE 位被清除。

    /*禁用所有邮箱*/
    ECANaRegs.CANME.ALL = 0;//在写入 MSGID 之前需要

    EDIS;

    void InitCanb (void)//初始化 eCAN-B 模块

    /*为 CAN 控制寄存器创建影子寄存器结构。 这是
    因为只允许对这些寄存器进行32位访问。 16位访问
    这些寄存器可能会损坏寄存器内容或返回
    错误数据。 在对某个位进行写入/读取操作时尤其如此
    位16 - 31 */之间的(或位组)

    struct eCAN-regs ECanbShadow;

    InitECanbGpio();

    EALLOW;// EALLOW 启用对受保护位的访问

    /*使用 eCAN 寄存器为 CAN 操作配置 eCAN RX 和 TX 引脚*/

    ECanbShady.CANTIOC.ALL = ECanbRegs.CANTIOC.ALL;
    ECANbShading.CANTIOC.bit.TXFUNC = 1;
    ECanbRegs.CANTIOC.ALL = ECanbShady.CANTIOC.ALL;

    ECanbShady.CANRIOC.ALL = ECanbRegs.CANRIOC.ALL;
    ECanbShady.CANRIOC.bit.RXFUNC = 1;
    ECanbRegs.CANRIOC.ALL = ECanbShady.CANRIOC.ALL;

    /*将 eCAN 配置为 HECC 模式-(需要访问邮箱16至31)*/

    ECanbShady.CANMC.ALL = ECanbRegs.CANMC.ALL;
    ECANbShading.CANMC.bit.SCB = 1;
    ECanbRegs.CANMC.ALL = ECanbShady.CANMC.ALL;

    /*将"主控场"的所有位初始化为零*/
    // MSGCTRL 寄存器的某些位出现在未知状态。 为确保正常运行、
    // MSGCTRL 的所有位(包括保留位)都必须初始化为零

    ECANbMboxs.MBOX0.MSGCTRL.ALL = 0x00000000;
    ECANbMboxs.MBOX1.MSGCTRL.ALL = 0x00000000;
    ECANbMboxs.MBOX2.MSGCTRL.ALL = 0x00000000;
    ECANbMboxs.MBOX3.MSGCTRL.ALL = 0x00000000;
    ECANbMboxs.MBOX4.MSGCTRL.ALL = 0x00000000;
    ECanbMboxs.MBOX5.MSGCTRL.ALL = 0x00000000;
    ECANbMboxs.MBOX6.MSGCTRL.ALL = 0x00000000;
    ECANbMboxs.MBOX7.MSGCTRL.ALL = 0x00000000;
    ECANbMboxs.MBOX8.MSGCTRL.ALL = 0x00000000;
    ECANbMboxs.MBOX9.MSGCTRL.ALL = 0x00000000;
    ECANbMboxs.MBOX10.MSGCTRL.ALL = 0x00000000;
    ECanbMboxs.MBOX11.MSGCTRL.ALL = 0x00000000;
    ECANbMboxs.MBOX12.MSGCTRL.ALL = 0x00000000;
    ECANbMboxs.MBOX13.MSGCTRL.ALL = 0x00000000;
    ECANbMboxs.MBOX14.MSGCTRL.ALL = 0x00000000;
    ECANbMboxs.MBOX15.MSGCTRL.ALL = 0x00000000;
    ECANbMboxs.MBOX16.MSGCTRL.ALL = 0x00000000;
    ECANbMboxs.MBOX17.MSGCTRL.ALL = 0x00000000;
    ECANbMboxs.MBOX18.MSGCTRL.ALL = 0x00000000;
    ECANbMboxs.MBOX19.MSGCTRL.ALL = 0x00000000;
    ECANbMboxs.MBOX20.MSGCTRL.ALL = 0x00000000;
    ECANbMboxs.MBOX21.MSGCTRL.ALL = 0x00000000;
    ECANbMboxs.MBOX22.MSGCTRL.ALL = 0x00000000;
    ECANbMboxs.MBOX23.MSGCTRL.ALL = 0x00000000;
    ECANbMboxs.MBOX24.MSGCTRL.ALL = 0x00000000;
    ECANbMboxs.MBOX25.MSGCTRL.ALL = 0x00000000;
    ECANbMboxs.MBOX26.MSGCTRL.ALL = 0x00000000;
    ECANbMboxs.MBOX27.MSGCTRL.ALL = 0x00000000;
    ECANbMboxs.MBOX28.MSGCTRL.ALL = 0x00000000;
    ECANbMboxs.MBOX29.MSGCTRL.ALL = 0x00000000;
    ECANbMboxs.MBOX30.MSGCTRL.ALL = 0x00000000;
    ECANbMboxs.MBOX31.MSGCTRL.ALL = 0x00000000;

    // TAN、RMPn、GIFn 位在复位时都为零并且再次被清零
    //作为预防措施。

    ECanbRegs.CANTA 全部= 0xFFFFFFFF;//清除所有 Tan 位*/

    ECANbRegs.CANRMP.ALL = 0xFFFFFFFF;//清除所有 RMPn 位*/

    ECANbRegs.CANGIF0.ALL = 0xFFFFFFFF;//清除所有中断标志位*/
    ECANbRegs.CANGIF1.ALL = 0xFFFFFFFF;


    /*为 eCANB*/配置位时序参数

    ECanbShady.CANMC.ALL = ECanbRegs.CANMC.ALL;
    ECanbShady.CANMC.bit.CCR = 1;//设置 CCR = 1
    ECanbRegs.CANMC.ALL = ECanbShady.CANMC.ALL;

    ECanbShading.canes.all = ECanbRegs.canes.all;

    操作

    ECanbShading.canes.all = ECanbRegs.canes.all;
    } while (ECanbShading.canes.bit.CCE!= 1);//等待 CCE 位被清除。

    ECanbShady.CANBTC.ALL = 0;

    DSP2833x_Examples.h 中定义了#IF (CPU_FRQ_150MHz)// CPU_FRQ_150MHz
    /*针对所有150MHz SYSCLKOUT (75MHz CAN 时钟)的以下模块-缺省值。 比特率= 1Mbps
    请参阅文件末尾的注释*/
    ECanbShady.CANBTC.bit.BRPREG = 9;
    ECANbShady.CANBTC.bit.TSEG2REG = 2;
    ECanbShady.CANBTC.bit.TSEG1REG = 10;
    #endif
    DSP2833x_Examples.h 中定义了#IF (CPU_FRQ_100MHz)// CPU_FRQ_100MHz
    /*以下块仅用于100MHz SYSCLKOUT (50MHz CAN 时钟)。 比特率= 1Mbps
    请参阅文件末尾的注释*/
    ECanbShady.CANBTC.bit.BRPREG = 4;
    ECANbShady.CANBTC.bit.TSEG2REG = 1;
    ECANbShady.CANBTC.bit.TSEG1REG = 6;
    #endif

    ECANbShading.CANBTC.bit.SAM = 1;
    ECanbRegs.CANBTC.ALL = ECanbShady.CANBTC.ALL;

    ECanbShady.CANMC.ALL = ECanbRegs.CANMC.ALL;
    ECanbShady.CANMC.bit.CCR = 0;//设置 CCR = 0
    ECanbRegs.CANMC.ALL = ECanbShady.CANMC.ALL;

    ECanbShading.canes.all = ECanbRegs.canes.all;

    操作

    ECanbShading.canes.all = ECanbRegs.canes.all;
    } while (ECanbShading.canes.bit.CCE!= 0);//等待 CCE 位被清除。

    /*禁用所有邮箱*/
    ECANbRegs.CANME.ALL = 0;//在写入 MSGID 之前需要

    EDIS;

    空 InitMailBoxA (空)

    struct eCAN-regs ECanaShadow;

    /********
    *可以输入*
    (二 /
    //邮件可以一次写入16位或32位
    //写入发送邮箱 MBOX0 - 15的 messgeId 字段
    //펌웨어 버전 데이터- MBOX0로 고정。
    ECANaMboxs.MBOX0.MSGID.ALL = 0x8000000 + CAN_M2C_FWDCMD_MSGID;
    ECANaMboxs.MBOX1.MSGID.ALL = 0x8000000 + CAN_M2C_CMD_BASEID;

    //写入接收邮箱 MBOX16 - 31的 messgeId 字段
    ECANaMboxs.MBOX16.MSGID.ALL = 0xC0000000 + CAN_C2M_MONI_BASEID;
    ECanaLAMRegs.LAM16.ALL = 0x8000FFFF;
    ECANaMboxs.MBOX17.MSGID.ALL = 0xC0000000 + CAN_C2M_ERR_BASEID;
    ECanaLAMRegs.LAM17.ALL = 0x8000FFFF;
    ECANaMboxs.MBOX18.MSGID.ALL = 0xC0000000 + CAN_C2M_STAT_BASEID;
    ECanaLAMRegs.LAM18.all = 0x8000FFFF;
    ECANaMboxs.MBOX19.MSGID.ALL = 0xC0000000 + CAN_C2M_FIRST_BASEID;
    ECanaLAMRegs.LAM19.ALL = 0x8000FFFF;
    ECANaMboxs.MBOX20.MSGID.ALL = 0xC0000000 + CAN_C2M_TRAK_BASEID;
    ECanaLAMRegs.LAM20.all = 0x8000FFFF;

    //将邮箱0-15配置为 Tx,将16-31配置为 Rx
    //因为该写入是对整个寄存器(而不是位)的
    //字段)不需要影子寄存器。
    // ECanaRegs.CANMD.all = 0xFFFFFF0000;
    ECANaRegs.CANMD.ALL = 0x001F0000;//오동작 방지를 위해 쓰지 않는 박스는 TX로 설정。

    //启用所有邮箱*/
    //因为该写入是对整个寄存器(而不是位)的
    //字段)不需要影子寄存器。
    // ECanaRegs.CANME.ALL = 0x07FF07FF;
    ECANaRegs.CANME.ALL = 0x001F0003;//오동작 방지를 위해 쓰지 않는 박스는 Diable로 설정

    //指定将发送/接收8位
    ECANaMboxs.MBOX0.MSGCTRL.bit.DLC = 8;
    ECANaMboxs.MBOX1.MSGCTRL.bit.DLC = 8;
    // ECANaMboxs.MBOX2.MSGCTRL.bit.DLC = 8;
    // ECANaMboxs.MBOX3.MSGCTRL.bit.DLC = 8;
    // ECANaMboxs.MBOX4.MSGCTRL.bit.DLC = 8;
    // ECanaMboxs.MBOX5.MSGCTRL.bit.DLC = 8;
    // ECANaMboxs.MBOX6.MSGCTRL.bit.DLC = 8;
    // ECANaMboxs.MBOX7.MSGCTRL.bit.DLC = 8;
    // ECANaMboxs.MBOX8.MSGCTRL.bit.DLC = 8;
    // ECANaMboxs.MBOX9.MSGCTRL.bit.DLC = 8;
    // ECANaMboxs.MBOX10.MSGCTRL.bit.DLC = 8;

    ECANaMboxs.MBOX16.MSGCTRL.bit.DLC = 8;
    ECANaMboxs.MBOX17.MSGCTRL.bit.DLC = 8;
    ECANaMboxs.MBOX18.MSGCTRL.bit.DLC = 8;
    ECANaMboxs.MBOX19.MSGCTRL.bit.DLC = 8;
    ECANaMboxs.MBOX20.MSGCTRL.bit.DLC = 8;
    // ECANaMboxs.MBOX21.MSGCTRL.bit.DLC = 8;
    // ECANaMboxs.MBOX22.MSGCTRL.bit.DLC = 8;
    // ECANaMboxs.MBOX23.MSGCTRL.bit.DLC = 8;
    // ECANaMboxs.MBOX24.MSGCTRL.bit.DLC = 8;
    // ECANaMboxs.MBOX25.MSGCTRL.bit.DLC = 8;
    // ECANaMboxs.MBOX26.MSGCTRL.bit.DLC = 8;

    //因为该写入是对整个寄存器(而不是位)的
    //字段)不需要影子寄存器。
    EALLOW;
    // ECANaRegs.CANMIM.ALL = 0x07FF0000;
    ECANaRegs.CANMIM.ALL = 0x001F0000;

    ECanaShady.CANMC.ALL = ECanaRegs.CANMC.ALL;
    ECanaShady.CANMC.bit.DBO = 1;// 0:大端字节序、1:小端字节序
    ECanaShady.CANMC.bit.ABO = 1;//自动总线打开
    ECanaRegs.CANMC.ALL = ECanaShadure.CANMC.ALL;

    ECANaRegs.CANMIL.ALL = 0x00000000;
    // ECANaRegs.CANGAM.ALL = 0xFFFFFFFF;

    ECANaRegs.CANGIM.bit.I0EN = 1;//中断0使能
    EDIS;

    //#pragma CODE_SECTION (InitMailBoxB、"ramfuncs);
    空 InitMailBoxB (空)

    struct eCAN-regs ECanbShadow;
    /********
    * CAN B 初始化*
    (二 /
    //邮件可以一次写入16位或32位
    //写入发送邮箱 MBOX0 - 15的 messgeId 字段

    ECANbMboxs.MBOX0.MSGID.ALL = 0x8000000 + CAN_M2C_FWDCMD_MSGID;
    ECANbMboxs.MBOX1.MSGID.ALL = 0x8000000 + CAN_M2C_CMD_BASEID;
    // ECANbMboxs.MBOX2.MSGID.ALL = 0x80000402;
    // ECanbMboxs.MBOX3.MSGID.ALL = 0x80000403;
    // ECanbMboxs.MBOX4.MSGID.ALL = 0x80000404;
    // ECanbMboxs.MBOX5.MSGID.ALL = 0x80000405;
    // ECANbMboxs.MBOX6.MSGID.ALL = 0x80595306;
    // ECANbMboxs.MBOX7.MSGID.ALL = 0x80595307;
    // ECANbMboxs.MBOX8.MSGID.ALL = 0x80595308;
    // ECANbMboxs.MBOX9.MSGID.ALL = 0x80595309;
    // ECanbMboxs.MBOX10.MSGID.ALL = 0x8059530A;

    //写入接收邮箱 MBOX16 - 31的 messgeId 字段
    ECANbMboxs.MBOX16.MSGID.ALL = 0xC0000000 + CAN_C2M_MONI_BASEID;
    ECANbLARegs.LAM16.ALL = 0x8000FFFF;
    ECANbMboxs.MBOX17.MSGID.ALL = 0xC0000000 + CAN_C2M_ERR_BASEID;
    ECANbLARegs.LAM17.ALL = 0x8000FFFF;
    ECANbMboxs.MBOX18.MSGID.ALL = 0xC0000000 + CAN_C2M_STAT_BASEID;
    ECanbLARegs.LAM18.all = 0x8000FFFF;
    ECANbMboxs.MBOX19.MSGID.ALL = 0xC0000000 + CAN_C2M_FIRST_BASEID;
    ECANbLARegs.LAM19.ALL = 0x8000FFFF;
    ECANbMboxs.MBOX20.MSGID.ALL = 0xC0000000 + CAN_C2M_TRAK_BASEID;
    ECANbLARegs.LAM20.ALL = 0x8000FFFF;

    // ECANbMboxs.MBOX16.MSGID.ALL = 0xC0010000;
    // ECanbLAMRegs.LAM16.ALL = 0x8000FFFF;
    // ECanbMboxs.MBOX17.MSGID.ALL = 0xC0020000;
    // ECanbLAMRegs.LAM17.all = 0x800000FF;
    // ECANbMboxs.MBOX18.MSGID.ALL = 0xC0030000;
    // ECanbLAMRegs.LAM18.all = 0x8000FFFF;
    // ECANbMboxs.MBOX19.MSGID.ALL = 0x90595303;
    // ECANbMboxs.MBOX20.MSGID.ALL = 0x90595304;
    // ECANbMboxs.MBOX21.MSGID.ALL = 0x90595305;
    // ECanbMboxs.MBOX22.MSGID.all = 0x90595306;
    // ECANbMboxs.MBOX23.MSGID.ALL = 0x90595307;
    // ECanbMboxs.MBOX24.MSGID.ALL = 0x90595308;
    // ECANbMboxs.MBOX25.MSGID.ALL = 0x90595309;
    // ECanbMboxs.MBOX26.MSGID.all = 0x9059530A;

    //将邮箱0-15配置为 Tx,将16-31配置为 Rx
    //因为该写入是对整个寄存器(而不是位)的
    //字段)不需要影子寄存器。
    // ECanbRegs.CANMD.all = 0xFFFFFF0000;
    ECANbRegs.CANMD.ALL = 0x001F0000;//오동작 방지를 위해 쓰지 않는 박스는 TX로 설정。

    //启用所有邮箱*/
    //因为该写入是对整个寄存器(而不是位)的
    //字段)不需要影子寄存器。
    // ECanbRegs.CANME.ALL = 0x07FF07FF;
    ECANbRegs.CANME.ALL = 0x001F0003;//오동작 방지를 위해 쓰지 않는 박스는 Diable로 설정

    //指定将发送/接收8位
    ECANbMboxs.MBOX0.MSGCTRL.bit.DLC = 8;
    ECANbMboxs.MBOX1.MSGCTRL.bit.DLC = 8;
    ECANbMboxs.MBOX2.MSGCTRL.bit.DLC = 8;
    ECANbMboxs.MBOX3.MSGCTRL.bit.DLC = 8;
    ECANbMboxs.MBOX4.MSGCTRL.bit.DLC = 8;
    ECANbMboxs.MBOX5.MSGCTRL.bit.DLC = 8;
    ECANbMboxs.MBOX6.MSGCTRL.bit.DLC = 8;
    ECANbMboxs.MBOX7.MSGCTRL.bit.DLC = 8;
    ECANbMboxs.MBOX8.MSGCTRL.bit.DLC = 8;
    ECANbMboxs.MBOX9.MSGCTRL.bit.DLC = 8;
    ECANbMboxs.MBOX10.MSGCTRL.bit.DLC = 8;

    ECANbMboxs.MBOX16.MSGCTRL.bit.DLC = 8;
    ECANbMboxs.MBOX17.MSGCTRL.bit.DLC = 8;
    ECANbMboxs.MBOX18.MSGCTRL.bit.DLC = 8;
    ECANbMboxs.MBOX19.MSGCTRL.bit.DLC = 8;
    ECANbMboxs.MBOX20.MSGCTRL.bit.DLC = 8;
    ECANbMboxs.MBOX21.MSGCTRL.bit.DLC = 8;
    ECANbMboxs.MBOX22.MSGCTRL.bit.DLC = 8;
    ECANbMboxs.MBOX23.MSGCTRL.bit.DLC = 8;
    ECANbMboxs.MBOX24.MSGCTRL.bit.DLC = 8;
    ECANbMboxs.MBOX25.MSGCTRL.bit.DLC = 8;
    ECANbMboxs.MBOX26.MSGCTRL.bit.DLC = 8;

    //因为该写入是对整个寄存器(而不是位)的
    //字段)不需要影子寄存器。
    EALLOW;
    // ECanbRegs.CANMIM.ALL = 0x07FF0000;
    ECANbRegs.CANMIM.ALL = 0x001F0000;

    ECanbShady.CANMC.ALL = ECanbRegs.CANMC.ALL;
    ECanbShady.CANMC.bit.DBO = 1;// 0:大端字节序、1:小端字节序
    ECanbShady.CANMC.bit.ABO = 1;//自动总线打开
    ECanbRegs.CANMC.ALL = ECanbShady.CANMC.ALL;

    ECANbRegs.CANMIL.ALL = 0x00000000;
    // ECANaRegs.CANGAM.ALL = 0xFFFFFFFF;

    ECANbRegs.CANGIM.bit.I0EN = 1;//中断0使能
    EDIS;

    中断空 ECANA_Rx_ISR (空)

    struct eCAN-regs ECanaShadow;
    CANARXIsrCount++;
    ECanaShady.CANRMP.ALL = ECanaRegs.CANRMP.ALL;
    CanaRxDataPush (&ECanaShadow);
    ECANaRegs.CANRMP.ALL = ECANaShady.CANRMP.ALL;
    PieCtrlRegs.PIEACK.bit.ACK9 = 1;

    中断空 ECANb_Rx_ISR (空)

    struct eCAN-regs ECanbShadow;
    CANBRXIsrCount++;
    ECanbShady.CANRMP.ALL = ECanbRegs.CANRMP.ALL;
    CanbRxDataPush (&ECanbShadow);
    ECanbRegs.CANRMP.ALL = ECanbShady.CANRMP.ALL;
    PieCtrlRegs.PIEACK.bit.ACK9 = 1;

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

    Minseung、

                 在论坛上、我们无法支持调试您的代码。 请确保您的问题与 www.ti.com/lit/SPRZ272第11页中的" eCAN:意外停止传输操作"通报无关

    不确定" CAN 通信期间的间歇性停止"是什么意思。 正在停止的是发送操作还是接收操作?  如果未清除中断标志、请参阅 www.ti.com/lit/SPRA876中的示例。 有一些示例向您展示了如何处理中断。