发表于:2004-02-05 16:37:00
楼主
我们新做了两个CAN节点,硬件组合为AT89C51+SJA1000+P82C250,6N137实现光电隔离。检查电路无误,代码编写完全符合数据手册。试验条件如下:
1.系统中仅有两个节点,采用PeliCan方式;
2.每个节点的AMR0~3均设为0xFF,即接收任何节点发送的信息;
3.波特率设置为40KB;
4.Rs采用47K欧姆,CBP位相应置0;
5.采用中断方式接收,下降沿触发,且中断经试验确认可以响应。
试验时,可以看到发出的波形,问题是:
1.节点发送时,对方始终无法接收;
2.所发送的波形并非只出现10次,然后因总线关闭而消失,而是始终存在;
试验时CAN的初始化源代码如下:
#define CAN_BASE 0x0100 //P2.1作为SJA1000的片选
void CanInit()
{
uchar temp,k;
//使CAN控制器进入设置模式
do{
CAN_MODE = 0x01;
temp = CAN_MODE;
}while(temp&0x01==0);
CAN_CDR = 0x88;
CAN_INTEN = 0x0D;
for (k=0;k<4;k++)
XBYTE[CAN_AMRADDR+k] = 0xFF;//AMR全部为0
temp = XBYTE[IDADDR]; //获得节点ID
CAN_ACR = 0x00; //接收代码寄存器
XBYTE[CAN_ACRADDR+1] = 0x00; //ACR0和ACR1存储接收广播报文时用的ID,为0000H
XBYTE[CAN_ACRADDR+2] = 0x00; //ACR2和ACR3存储接收数据报文时用的ID,为节点自身ID
XBYTE[CAN_ACRADDR+3] = temp; //接收代码寄存器ACR3赋初值
CAN_BTR0 = 0x07; //总线时钟寄存器0
CAN_BTR1 = 0xFF; //总线定时寄存器1,设置波特率40KPBS
CAN_OCR = 0xAA; //输出控制寄存器
CAN_RBSA = 0x00; //设置接收缓存器FIFO起始地址为0
CAN_TXERR= 0x00; //发送错误计数寄存器,清除发送错误计数寄存器
temp = CAN_ECC; //错误代码捕捉寄存器,清除错误代码捕捉寄存器
//使CAN进入正常模式
do{
CAN_MODE = 0x00; //方式寄存器,设置双滤波接收方式,并返回工作状态
temp = CAN_MODE;
}while(temp&0x01);
}
试验时的接收源代码:
void CanReceive() interrupt 0 using 1
{
uchar temp;
temp = CAN_STATUS;
if (temp&0x01)
{
//数据处理 ////@@@@@@@@@始终到不了这里!!!!!!!!!
}
}
各位大侠,可否帮忙分析一下是什么原因?多谢多谢了!