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断线之后重连,再也发送不出来的问题

Other Parts Discussed in Thread: TMS320F28335, ISO1050

是用TMS320F28335的can功能,MCU处于循环发送模式,用电脑的一个CAN模块做接受节点,当我把连接线端了之后在重新连接就再也通讯不上了。必须重启MCU才能再次发送。用的是ISO1050芯片。请问是什么原因。程序参考了ti的官方例程。使用SOC模式,16个邮箱发送,16个邮件做接受,每次发送同时使能16个邮箱。

  • // 为eCAN传输配置eCAN RX和TX引脚 EALLOW;

    ECanbShadow.CANTIOC.all = ECanbRegs.CANTIOC.all; //eCAN I/O控制寄存器
    ECanbShadow.CANTIOC.bit.TXFUNC = 1; //CANTX引脚用于CAN发送功能
    ECanbRegs.CANTIOC.all = ECanbShadow.CANTIOC.all;

    ECanbShadow.CANRIOC.all = ECanbRegs.CANRIOC.all; //eCAN I/O控制寄存器
    ECanbShadow.CANRIOC.bit.RXFUNC = 1; //CANRX引脚用于CAN发送功能
    ECanbRegs.CANRIOC.all = ECanbShadow.CANRIOC.all;
    EDIS;

    //禁用所有的邮箱。
    //因为写入整个寄存器(而不是一个位域),影子寄存器是不需要的。
    ECanbRegs.CANME.all = 0; //邮箱激活寄存器:激活或者屏蔽独立的邮箱

    //邮箱可以一次写入16位或32位。写入TRANSMIT邮箱的MSGID字段MBOX0-15。
    ECanbMboxes.MBOX0.MSGID.all = 0x9555AAA0; //邮箱标识符寄存器
    ECanbMboxes.MBOX1.MSGID.all = 0x9555AAA1;
    ECanbMboxes.MBOX2.MSGID.all = 0x9555AAA2;
    ECanbMboxes.MBOX3.MSGID.all = 0x9555AAA3;
    ECanbMboxes.MBOX4.MSGID.all = 0x9555AAA4;
    ECanbMboxes.MBOX5.MSGID.all = 0x9555AAA5;
    ECanbMboxes.MBOX6.MSGID.all = 0x9555AAA6;
    ECanbMboxes.MBOX7.MSGID.all = 0x9555AAA7;
    ECanbMboxes.MBOX8.MSGID.all = 0x9555AAA8;
    ECanbMboxes.MBOX9.MSGID.all = 0x9555AAA9;
    ECanbMboxes.MBOX10.MSGID.all = 0x9555AAAA;
    ECanbMboxes.MBOX11.MSGID.all = 0x9555AAAB;
    ECanbMboxes.MBOX12.MSGID.all = 0x9555AAAC;
    ECanbMboxes.MBOX13.MSGID.all = 0x9555AAAD;
    ECanbMboxes.MBOX14.MSGID.all = 0x9555AAAE;
    ECanbMboxes.MBOX15.MSGID.all = 0x9555AAAF;
    // 写入RECEIVE邮箱的MSGID字段MBOX16-31
    ECanbMboxes.MBOX16.MSGID.all = 0x9555AAA0;
    ECanbMboxes.MBOX17.MSGID.all = 0x9555AAA1;
    ECanbMboxes.MBOX18.MSGID.all = 0x9555AAA2;
    ECanbMboxes.MBOX19.MSGID.all = 0x9555AAA3;
    ECanbMboxes.MBOX20.MSGID.all = 0x9555AAA4;
    ECanbMboxes.MBOX21.MSGID.all = 0x9555AAA5;
    ECanbMboxes.MBOX22.MSGID.all = 0x9555AAA6;
    ECanbMboxes.MBOX23.MSGID.all = 0x9555AAA7;
    ECanbMboxes.MBOX24.MSGID.all = 0x9555AAA8;
    ECanbMboxes.MBOX25.MSGID.all = 0x9555AAA9;
    ECanbMboxes.MBOX26.MSGID.all = 0x9555AAAA;
    ECanbMboxes.MBOX27.MSGID.all = 0x9555AAAB;
    ECanbMboxes.MBOX28.MSGID.all = 0x9555AAAC;
    ECanbMboxes.MBOX29.MSGID.all = 0x9555AAAD;
    ECanbMboxes.MBOX30.MSGID.all = 0x9555AAAE;
    ECanbMboxes.MBOX31.MSGID.all = 0x9555AAAF;

    // 将邮箱0-15配置为Tx,将16-31配置为Rx
    // 由于这是写入整个寄存器(而不是位字段),所以不需要影子寄存器。
    ECanbRegs.CANMD.all = 0xFFFF0000; //邮箱方向寄存器

    // 启用所有邮箱
    // 由于这是写入整个寄存器(而不是位字段),所以不需要影子寄存器。
    ECanbRegs.CANME.all = 0xFFFFFFFF;

    // 指定8位将被发送/接收
    ECanbMboxes.MBOX0.MSGCTRL.bit.DLC = 8; //消息控制寄存器,DLC位中的数字决定了被发送或接受的字节数,合适的范围是0-8.
    ECanbMboxes.MBOX1.MSGCTRL.bit.DLC = 8;
    ECanbMboxes.MBOX2.MSGCTRL.bit.DLC = 8;
    ECanbMboxes.MBOX3.MSGCTRL.bit.DLC = 8;
    ECanbMboxes.MBOX4.MSGCTRL.bit.DLC = 8;
    ECanbMboxes.MBOX5.MSGCTRL.bit.DLC = 8;
    ECanbMboxes.MBOX6.MSGCTRL.bit.DLC = 8;
    ECanbMboxes.MBOX7.MSGCTRL.bit.DLC = 8;
    ECanbMboxes.MBOX8.MSGCTRL.bit.DLC = 8;
    ECanbMboxes.MBOX9.MSGCTRL.bit.DLC = 8;
    ECanbMboxes.MBOX10.MSGCTRL.bit.DLC = 8;
    ECanbMboxes.MBOX11.MSGCTRL.bit.DLC = 8;
    ECanbMboxes.MBOX12.MSGCTRL.bit.DLC = 8;
    ECanbMboxes.MBOX13.MSGCTRL.bit.DLC = 8;
    ECanbMboxes.MBOX14.MSGCTRL.bit.DLC = 8;
    ECanbMboxes.MBOX15.MSGCTRL.bit.DLC = 8;
    // 设置为没有请求远程帧
    // 由于RTR位在复位时未定义,因此必须将其初始化为适当的值
    ECanbMboxes.MBOX0.MSGCTRL.bit.RTR = 0; //消息控制寄存器远程发送请求位
    ECanbMboxes.MBOX1.MSGCTRL.bit.RTR = 0;
    ECanbMboxes.MBOX2.MSGCTRL.bit.RTR = 0;
    ECanbMboxes.MBOX3.MSGCTRL.bit.RTR = 0;
    ECanbMboxes.MBOX4.MSGCTRL.bit.RTR = 0;
    ECanbMboxes.MBOX5.MSGCTRL.bit.RTR = 0;
    ECanbMboxes.MBOX6.MSGCTRL.bit.RTR = 0;
    ECanbMboxes.MBOX7.MSGCTRL.bit.RTR = 0;
    ECanbMboxes.MBOX8.MSGCTRL.bit.RTR = 0;
    ECanbMboxes.MBOX9.MSGCTRL.bit.RTR = 0;
    ECanbMboxes.MBOX10.MSGCTRL.bit.RTR = 0;
    ECanbMboxes.MBOX11.MSGCTRL.bit.RTR = 0;
    ECanbMboxes.MBOX12.MSGCTRL.bit.RTR = 0;
    ECanbMboxes.MBOX13.MSGCTRL.bit.RTR = 0;
    ECanbMboxes.MBOX14.MSGCTRL.bit.RTR = 0;
    ECanbMboxes.MBOX15.MSGCTRL.bit.RTR = 0;

    // 写入邮箱MBOX0-15的RAM字段
    // 消息数据寄存器
    ECanbMboxes.MBOX0.MDL.all = 0x9555AAA0;
    ECanbMboxes.MBOX0.MDH.all = 0x89ABCDEF;
    ECanbMboxes.MBOX1.MDL.all = 0x9555AAA1;
    ECanbMboxes.MBOX1.MDH.all = 0x89ABCDEF;
    ECanbMboxes.MBOX2.MDL.all = 0x9555AAA2;
    ECanbMboxes.MBOX2.MDH.all = 0x89ABCDEF;
    ECanbMboxes.MBOX3.MDL.all = 0x9555AAA3;
    ECanbMboxes.MBOX3.MDH.all = 0x89ABCDEF;
    ECanbMboxes.MBOX4.MDL.all = 0x9555AAA4;
    ECanbMboxes.MBOX4.MDH.all = 0x89ABCDEF;
    ECanbMboxes.MBOX5.MDL.all = 0x9555AAA5;
    ECanbMboxes.MBOX5.MDH.all = 0x89ABCDEF;
    ECanbMboxes.MBOX6.MDL.all = 0x9555AAA6;
    ECanbMboxes.MBOX6.MDH.all = 0x89ABCDEF;
    ECanbMboxes.MBOX7.MDL.all = 0x9555AAA7;
    ECanbMboxes.MBOX7.MDH.all = 0x89ABCDEF;
    ECanbMboxes.MBOX8.MDL.all = 0x9555AAA8;
    ECanbMboxes.MBOX8.MDH.all = 0x89ABCDEF;
    ECanbMboxes.MBOX9.MDL.all = 0x9555AAA9;
    ECanbMboxes.MBOX9.MDH.all = 0x89ABCDEF;
    ECanbMboxes.MBOX10.MDL.all = 0x9555AAAA;
    ECanbMboxes.MBOX10.MDH.all = 0x89ABCDEF;
    ECanbMboxes.MBOX11.MDL.all = 0x9555AAAB;
    ECanbMboxes.MBOX11.MDH.all = 0x89ABCDEF;
    ECanbMboxes.MBOX12.MDL.all = 0x9555AAAC;
    ECanbMboxes.MBOX12.MDH.all = 0x89ABCDEF;
    ECanbMboxes.MBOX13.MDL.all = 0x9555AAAD;
    ECanbMboxes.MBOX13.MDH.all = 0x89ABCDEF;
    ECanbMboxes.MBOX14.MDL.all = 0x9555AAAE;
    ECanbMboxes.MBOX14.MDH.all = 0x89ABCDEF;
    ECanbMboxes.MBOX15.MDL.all = 0x9555AAAF;
    ECanbMboxes.MBOX15.MDH.all = 0x89ABCDEF;

    // 由于这是写入整个寄存器(而不是位字段),所以不需要影子寄存器。
    EALLOW;
    ECanbRegs.CANMIM.all = 0xFFFFFFFF; //邮箱中断屏蔽寄存器,该寄存器受EALLOE保护。邮 箱中断使能。

    // 请求权限来更改配置寄存器
    ECanbShadow.CANMC.all = ECanbRegs.CANMC.all; //主控制寄存器
    ECanbShadow.CANMC.bit.CCR = 1; //改变配置请求位
    ECanbRegs.CANMC.all = ECanbShadow.CANMC.all;
    EDIS;

    // 等待CPU被授予更改配置寄存器的权限
    // 等待CCE位置位
    do
    {
    ECanbShadow.CANES.all = ECanbRegs.CANES.all; //错误和状态寄存器
    } while(ECanbShadow.CANES.bit.CCE != 1 ); //更改配置使能位,该位显示了配置访问权限。

    // 配置eCAN时间
    EALLOW;
    ECanbShadow.CANBTC.all = ECanbRegs.CANBTC.all; //位时序配置寄存器,该寄存器在用户模式下是写保护的,并只能在初始化模式下进行写入。
    ECanbShadow.CANBTC.bit.BRPREG = 4; // 波特率欲调节。该寄存器为波特率设置进行预定义。(BRPREG+1)=10 提供一个15MHz的CAN时钟 (150/10=15)
    ECanbShadow.CANBTC.bit.TSEG2REG = 2; // 位定时 bit-time=(TSEG1+1)+(TSEG1+1)+1
    ECanbShadow.CANBTC.bit.TSEG1REG = 10; // Bit time = 15
    ECanbRegs.CANBTC.all = ECanbShadow.CANBTC.all;
    ECanbShadow.CANMC.all = ECanbRegs.CANMC.all;
    ECanbShadow.CANMC.bit.CCR = 0;
    ECanbRegs.CANMC.all = ECanbShadow.CANMC.all;
    EDIS;

    // 等到CPU不再有权更改配置寄存器
    do
    {
    ECanbShadow.CANES.all = ECanbRegs.CANES.all;
    } while(ECanbShadow.CANES.bit.CCE != 0 );

    // 将eCAN配置为自检模式
    // 启用eCAN的增强功能。
    EALLOW;
    ECanbShadow.CANMC.all = ECanbRegs.CANMC.all;
    ECanbShadow.CANMC.bit.STM = 0; // 将CAN配置为自检模式。在这种模式下,CAN模块能够产生它自己的应答信号(ACK),从而允许在没有总线连接到模块的情况下进行操作。
    ECanbShadow.CANMC.bit.SCB = 1; // SCC兼容性位:选择eCAN模式(需要访问32个邮箱)
    ECanbRegs.CANMC.all = ECanbShadow.CANMC.all;
    EDIS;
  • user1761043 说:

    当我把连接线端了之后在重新连接就再也通讯不上了。必须重启MCU才能再次发送。

    请问您现在是断开CANH CANL的其中一根还是都断开?目前是总线上只有这两个节点?

  • 你好,我也遇到同样的问题,can 网络中只有两个节点,一个DSP 28377s,另外一个是用can卡盒连接的上位机。dsp上电初始化后,上位机可以正常收发dsp的CAN数据,但当can卡断开,或者直接把can卡的CANH CANL连线都断开,再重新连接后,dsp就不再发数据了。

    观察CAN_ES 会看到EWarn位置1,但尝试软件复位或者重新做can外设初始化,均无法恢复正常。只能再次对dsp下电才可以。

    请问,到底要怎么做才能让28377s的can外设在出错后,通过软件操作进行恢复?

  • 您好,遇到同样的问题,请问问题解决了么?如何通过软件操作进性恢复?
  • 您好,遇到同样的问题,请问问题解决了么?如何通过软件操作进性恢复?
  • 当28335收到SE错误,该如何解决?
  • 请您将问题详细描述后(使用的软硬件情况,出现的问题等)重新发帖,谢谢
  • 已创建新问题,麻烦帮忙看看e2echina.ti.com/.../203202
  • 好的,我具体看一下哈