high_water 发表于 2010-7-8 14:11

自己做了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 );//回到工作模式
}

lnskngdc 发表于 2010-7-8 20:01

两个节点通讯频率如何?如果一直不停的发送,可能会导致错误太多,总线关闭.
可以设置A为主,B为从.每隔2秒A发送一次,当B接收到报文后再发送.
10k的波特率稍低了点,你提到200k试试看.

hankchen86 发表于 2010-7-9 13:57

CS的电平得看你的程序是怎么样设置的。
RST脚上接上拉电阻了吗?你可以查查C52的P23脚是不是开漏输出或是其他的什么,我记不清了。

ATM_Emerson 发表于 2010-10-26 15:03

问一下,你两块CAN板是通过什么相连的?是CAN1_H接CAN2_H,CAN1_L接CAN2_L的吗?

kinggowen 发表于 2010-10-30 13:56

1、如果CS高电平,还能通信,那肯定有问题,应该是程序的问题,可能是BUFFER没清或者其他问题。因为硬件都没有使能,收发数据是不可能的。
2、用万用表或者示波器测RST电平,由于静电的影响,电路板抗干扰能力不强,会导致死机,这是正常的。

有意思 发表于 2010-11-1 11:40

10k?
还要看你的收发芯片,TJA1050最低到20k,最小传输延迟决定

我用过PCA82C250,最低可以到5Kbps,用普通双绞线,传输了8km,BW:线是一卷一卷的,如果用
屏蔽,然后平铺的话,我估计是可以上10km的
页: [1]
查看完整版本: 自己做了2个can通讯板出现一个很奇怪的问题。