自己做了2个can通讯板出现一个很奇怪的问题。
用stc89c52+sja1000t+82250片选 P20
rst P23
250斜率电阻4.7k
4个led 分别是P27~P24
两个板子之间通过按键计数 让另一个板子上的led显示按键次数
问题是2个板子有时候能正常通信,有时候A板能显示B板的按键次数但B板不能显示A板的按键次数 有时候B板能显示A板的按键次数 而A板又不能显示B板的
正常通信的时候我测量了一下CS 和RST都是高电平
问题1 CS不是应该低电平有效吗?为什么是高电平的时候还能正常通信
问题2 当我测量过RST之后 板子会莫名的死机,按下MCU的复位后恢复正常。这个是什么原因?
波特率是10k
下面是sja的初始化程序
shezhi={0x11,0x22,0x33,0x44,0xff,0xff,0xff,0xff,0x88,0xaa,0x1f,0xff};
void CAN_init( uchar *shezhi )
{
uchar bdata Judge;
SJA_CS = 0;//CAN总线片选有效
SJA_RST = 0;
Delay(10);
SJA_RST = 1;//CAN总线复位管脚
EX1 = 1;//外部中断1使能;CAN总线接收中断
IT1 = 0;//低电平触发
do{//.0=1---reset MODRe,进入复位模式,以便设置相应的寄存器
MODR = 0x09;
Judge = MODR ;} while( !(Judge & 0x01) );//保证在复位模式下操作
ACR= shezhi;
ACR1 = shezhi;
ACR2 = shezhi;
ACR3 = shezhi;//初始化标示码
AMR= shezhi;
AMR1 = shezhi;
AMR2 = shezhi;
AMR3 = shezhi;//初始化掩码
CDR= shezhi;//时钟分频; CDR.3=1--时钟关闭, CDR.7=0---basic CAN, CDR.7=1---Peli CAN
OCR= shezhi;// 配置输出控制寄存器
BTR0 = shezhi;
BTR1 = shezhi;//16M晶振,波特率10Kbps
IER= 0x01;// .0=1--接收中断使能;.1=0--关闭发送中断使能
CMR= 0x04;//命令寄存器;释放接收缓冲器
do{
MODR = 0x08;Judge= MODR; }while( Judge & 0x01 );//回到工作模式
} 两个节点通讯频率如何?如果一直不停的发送,可能会导致错误太多,总线关闭.
可以设置A为主,B为从.每隔2秒A发送一次,当B接收到报文后再发送.
10k的波特率稍低了点,你提到200k试试看. CS的电平得看你的程序是怎么样设置的。
RST脚上接上拉电阻了吗?你可以查查C52的P23脚是不是开漏输出或是其他的什么,我记不清了。 问一下,你两块CAN板是通过什么相连的?是CAN1_H接CAN2_H,CAN1_L接CAN2_L的吗? 1、如果CS高电平,还能通信,那肯定有问题,应该是程序的问题,可能是BUFFER没清或者其他问题。因为硬件都没有使能,收发数据是不可能的。
2、用万用表或者示波器测RST电平,由于静电的影响,电路板抗干扰能力不强,会导致死机,这是正常的。 10k?
还要看你的收发芯片,TJA1050最低到20k,最小传输延迟决定
我用过PCA82C250,最低可以到5Kbps,用普通双绞线,传输了8km,BW:线是一卷一卷的,如果用
屏蔽,然后平铺的话,我估计是可以上10km的
页:
[1]