我在配置时,将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(发送成功或取消),但我并未检测到错误帧。。。