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

DSP28335 ecan busoff 问题

我在配置时,将CANMC.ABO=0 ;即不开启自动BUS ON功能,手动来进行,使用下述代码:

struct ECAN_REGS ECanaShadow;
u16 counter =5000;
EALLOW; ECanaShadow.CANMC.all = ECanaRegs.CANMC.all;  
if(ECanaShadow.CANMC.bit.CCR==1)      ////  当节点BUSOFF后,CANMC.CCR会置1,故我查询该位,
{
do

{
counter–;

DELAY_US(1); 

ECanaShadow.CANREC.all=ECanaRegs.CANREC.all;

}while((ECanaShadow.CANREC.all<128)&&(counter>0));  //等待128*11个隐形位,并存在超时,避免程序死在循环中,

                                                                                                          //选择5000,记得128*11个隐形位,大约3-5ms;
ECanaShadow.CANMC.bit.CCR= 0;                                          //依据手册,将CCR位clear
ECanaRegs.CANMC.all = ECanaShadow.CANMC.all;
//ECanaShadow.CANES.all = ECanaRegs.CANES.all;
//Wait for normal mode
}
EDIS;

使用上述代码使can模块回复通信,

但是,失败了!!

失败了!

请教一下,问题所在??

wei li28:

我看过stm32的CAN模块,大概是需要先进入配置模式,然后再出来,DSP28335也需要这样么?

我在配置时,将CANMC.ABO=0 ;即不开启自动BUS ON功能,手动来进行,使用下述代码:

struct ECAN_REGS ECanaShadow;
u16 counter =5000;
EALLOW; ECanaShadow.CANMC.all = ECanaRegs.CANMC.all;  
if(ECanaShadow.CANMC.bit.CCR==1)      ////  当节点BUSOFF后,CANMC.CCR会置1,故我查询该位,
{
do

{
counter–;

DELAY_US(1); 

ECanaShadow.CANREC.all=ECanaRegs.CANREC.all;

}while((ECanaShadow.CANREC.all<128)&&(counter>0));  //等待128*11个隐形位,并存在超时,避免程序死在循环中,

                                                                                                          //选择5000,记得128*11个隐形位,大约3-5ms;
ECanaShadow.CANMC.bit.CCR= 0;                                          //依据手册,将CCR位clear
ECanaRegs.CANMC.all = ECanaShadow.CANMC.all;
//ECanaShadow.CANES.all = ECanaRegs.CANES.all;
//Wait for normal mode
}
EDIS;

使用上述代码使can模块回复通信,

但是,失败了!!

失败了!

请教一下,问题所在??

wei li28:

回复 wei li28:

问题已经解决,先将CCR置1,然后将CCR置1,好像就OK了

我在配置时,将CANMC.ABO=0 ;即不开启自动BUS ON功能,手动来进行,使用下述代码:

struct ECAN_REGS ECanaShadow;
u16 counter =5000;
EALLOW; ECanaShadow.CANMC.all = ECanaRegs.CANMC.all;  
if(ECanaShadow.CANMC.bit.CCR==1)      ////  当节点BUSOFF后,CANMC.CCR会置1,故我查询该位,
{
do

{
counter–;

DELAY_US(1); 

ECanaShadow.CANREC.all=ECanaRegs.CANREC.all;

}while((ECanaShadow.CANREC.all<128)&&(counter>0));  //等待128*11个隐形位,并存在超时,避免程序死在循环中,

                                                                                                          //选择5000,记得128*11个隐形位,大约3-5ms;
ECanaShadow.CANMC.bit.CCR= 0;                                          //依据手册,将CCR位clear
ECanaRegs.CANMC.all = ECanaShadow.CANMC.all;
//ECanaShadow.CANES.all = ECanaRegs.CANES.all;
//Wait for normal mode
}
EDIS;

使用上述代码使can模块回复通信,

但是,失败了!!

失败了!

请教一下,问题所在??

wei li28:

回复 wei li28:

我还有个问题,关于28335CAN控制器的,当消息发送成功时,相应的TA位被置1(由内部逻辑置位),相应的TRS被清0(也是由内部逻辑清0);那么问题来了:

1、CAN消息发送成功的标志是什么?一个帧的完整么?(包括控制场,数据场,CRC,ACK。。。。)只有这些全完整时,TA才会被置1么?同时TRS清0?

2、TRS被清0,有两种方式,数据成功发送,或是transmition   is aborted,这个取消发送是由用户取消(相应TRR置位),还是由控制器自己取消(发生错误帧)。

3、我同时监控TRS位和TA位,我发现两者并不一致,即有时TA置(发送成功),TRS请0(发送成功);有时TA仍是0(发送未成功),TRS被清0(发送成功或取消),但我并未检测到错误帧。。。

赞(0)
未经允许不得转载:TI中文支持网 » DSP28335 ecan busoff 问题
分享到: 更多 (0)