用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[12]={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[0];
ACR1 = shezhi[1];
ACR2 = shezhi[2];
ACR3 = shezhi[3];//初始化标示码
AMR = shezhi[4];
AMR1 = shezhi[5];
AMR2 = shezhi[6];
AMR3 = shezhi[7];//初始化掩码
CDR = shezhi[8];//时钟分频; CDR.3=1--时钟关闭, CDR.7=0---basic CAN, CDR.7=1---Peli CAN
OCR = shezhi[9];// 配置输出控制寄存器
BTR0 = shezhi[10];
BTR1 = shezhi[11];//16M晶振,波特率10Kbps
IER = 0x01;// .0=1--接收中断使能; .1=0--关闭发送中断使能
CMR = 0x04;//命令寄存器;释放接收缓冲器
do{
MODR = 0x08;Judge = MODR; }while( Judge & 0x01 );//回到工作模式
} |