飞思卡尔S12系列单片机CAN总线无法发送数据
void MSCAN_Init(void)
{
CANCTL1 =0X80; //enable the MSCAN ,no loopback mode
CANCTL0 =0X01;
while(!CANCTL1_INITAK);
CANBTR0 =0X43; //波特率500K
CANBTR1 =0X14;
CANIDAC =0X00; //two 32bit filter for extended id
CANIDAR0 = 0xff;
CANIDAR1 = 0xfe|(SlaveID & 0x80)>>7;
CANIDAR2 = 0x01|(SlaveID & 0x7f)<<1;
CANIDAR3 = 0xff;
CANIDMR0 = 0xff;
CANIDMR1 = 0xfe;
CANIDMR2 = 0x01;
CANIDMR3 = 0xff;
CANIDAR4 = 0xff;
CANIDAR5 = 0xfe|(BroadCastID & 0x80)>>7;
CANIDAR6 = 0x01|(BroadCastID & 0x7f)<<1;
CANIDAR7 = 0xff;
CANIDMR4 = 0xff;
CANIDMR5 = 0xfe; //debug
CANIDMR6 = 0x01; //debug
CANIDMR7 = 0xff;
CANCTL0 =0; //exit init mode
while(CANCTL1_INITAK);
while(!CANCTL0_SYNCH); //wait until the synchronous with the bus
CANRFLG =0XC3;//reset Rx flag
发送代码如下:
while(!CANTFLG);
CANTBSEL =CANTFLG;
txbuffer =CANTBSEL;
CANTXIDR0 =0xc0;
CANTXIDR1 =0X0A;
CANTXIDR2 =0X23;
CANTXIDR3 =0XFA;
CANTXDSR0 =0X56;
CANTXDLR =0X01;
CANTXTBPR =0X80;
CANTFLG =txbuffer;
while(!(CANTFLG & txbuffer));
TURN_ON_LED1;
一个很简单的CAN模块测试程序,通过CAN总线发送一个数0x56发送出去,但是程序运行时会死在
while(!(CANTFLG & txbuffer));这一句,经过硬件仿真后发现是因为清零CANTFLG的相应位使能发送后寄存器CANRFLG里的TSTAT0,TSTAT1这两个标志位一直在10和11之间跳动,导致单片机的CAN模块一直在bus-off和主动错误状态之间跳变,导致数据发不出去,波特率设置没有问题,因为能正常接收到CAN数据,通过请问各位大神有没有遇到过这种情况,怎么解决?
谢谢大家,问题解决了,CAN配置没有问题,是CAN所在的IO口没有配置
在程序里将PM0(RXCAN0)配置成输入,将PM1(TXCAN0)配置成输出,再将PM0设置成上拉输入,并在PORT M的数据寄存器里PM0,PM1位写1就可以正常收发了。
BUS-OFF, 表示TEC>255,说明连续发送失败;
主动错误是到达BUS-OFF后,在总线上检测到128次11个连续的隐性位就会回到主动错误,并有恢复时间,大约200ms.
因此大致问题是你的线路有问题,你可以检查一下你的线路是否有问题,CAN是否通畅,120欧的终端电阻是否存在,是否有其他非CAN设备连接在一起。
希望对你有用。问题解决了吗?最后发现是什么问题了吗?
自己顶一下。。
还没有解决,我也怀疑线路有问题,准备拿个示波器看一下,我的驱动芯片用的是TJA1042,但是接收正常啊,没理由啊。兄台有没有S12单片机的CAN模块发送程序,发给我对比一下,562371938@qq.com
谢谢大家,问题解决了,CAN配置没有问题,是CAN所在的IO口没有配置
在程序里将PM0(RXCAN0)配置成输入,将PM1(TXCAN0)配置成输出,再将PM0设置成上拉输入
大家如果遇到相同的问题的话可以参考下
小编你好,我现在刚好在做S12Z的CAN底层配置,你能提供一下你的初始化配置思路和发送接收函数吗。万分感谢
小编!有MC9S12G64好一点的资料么,最好是中文的,怎么官方资料怎么官方资料都那么多错误?
不好意思,这个属于公司的机密,不方便透露
没有,不过还是建议你看英文资料,更权威
还是看英文的吧,刚开始很难懂,看到第三遍就能明白一些
我有关于CAN总线的一些资料,需要的话可以私信我。
好ONIU HAONIU好牛。
