TI中文支持网
TI专业的中文技术问题搜集分享网站

TMS320F28335的can断线之后重连,再也发送不出来的问题

Other Parts Discussed in Thread:TMS320F28335, ISO1050

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

user1761043:

// 为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-31ECanbMboxes.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)+1ECanbShadow.CANBTC.bit.TSEG1REG = 10; // Bit time = 15ECanbRegs.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;

,

Susan Yang:

user1761043 说:

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

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

,

user1499422:

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

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

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

,

user3709090:

您好,遇到同样的问题,请问问题解决了么?如何通过软件操作进性恢复?

,

user3709090:

您好,遇到同样的问题,请问问题解决了么?如何通过软件操作进性恢复?

,

user3709090:

当28335收到SE错误,该如何解决?

,

Susan Yang:

请您将问题详细描述后(使用的软硬件情况,出现的问题等)重新发帖,谢谢

,

user3709090:

已创建新问题,麻烦帮忙看看e2echina.ti.com/…/203202

,

Susan Yang:

好的,我具体看一下哈

,

user3709090:

谢谢

赞(0)
未经允许不得转载:TI中文支持网 » TMS320F28335的can断线之后重连,再也发送不出来的问题
分享到: 更多 (0)