调试CAN通讯 SJA1000+PCA82C250 SJA1000工作在BasicCAN模式下,可进入软件复位,读写寄存器正常,退出复位后,循环发送一帧数据,TX0没有输出信号(正常输出模式下),查询寄存器的值,发现中断寄存器IR出现0xF0值。电路按照器件文档设计,检查没有问题。 软件如下:
#include <absacc.h> #include <reg51.h>
#define CAN_CR XBYTE[0x4000] #define CAN_CMR XBYTE[0X4001] #define CAN_SR XBYTE[0X4002]
#define CAN_ACR XBYTE[0X4004] #define CAN_AMR XBYTE[0X4005] #define CAN_BTR0 XBYTE[0X4006] #define CAN_BTR1 XBYTE[0X4007] #define CAN_OCR XBYTE[0X4008]
#define CAN_TEST XBYTE[0X4009] #define CAN_ID1 XBYTE[0X400A] #define CAN_ID2 XBYTE[0X400B] #define CAN_SENDBYTE1 XBYTE[0X400C] #define CAN_SENDBYTE2 XBYTE[0X400D] #define CAN_SENDBYTE3 XBYTE[0X400E] #define CAN_SENDBYTE4 XBYTE[0X400F] #define CAN_SENDBYTE5 XBYTE[0X4010] #define CAN_SENDBYTE6 XBYTE[0X4011] #define CAN_SENDBYTE7 XBYTE[0X4012] #define CAN_SENDBYTE8 XBYTE[0X4013]
#define CAN_CDR XBYTE[0X401F]
sbit WATCHDOG = P1 ^ 0;
unsigned char temp,i;
void delay() { unsigned char x1,x2; for (x1=0;x1<0xff;x1++) { for(x2=0;x2<0x5f;x2++); } } ///////////////////////////////////////////// void CAN_INIT(void) { delay();
CAN_CR |= 0X01; //enter reset mode temp=CAN_CR; delay(); if((temp&0x01)==0x01) { CAN_CDR = 0X40; // basic can 模式,CBP置位,外部时钟输出,2分频
CAN_ACR = 0X40; //验收代码寄存器 0100 0000 CAN_AMR = 0X00; //验收屏蔽寄存器 0000 0000
CAN_BTR0= 0X00; //tscl=2 x tclk,tsjw= tscl CAN_BTR1= 0X18; //sam=0 单次采样,tTseg1=9 x tscl,tTseg2=2 x tscl //12MHz /2 /12 = 500KHz 波特率 CAN_OCR = 0XFF; //上拉状态,时钟输出模式 } CAN_CR &= 0XFE; //quit reset mode delay(); } //////////////////////////////////////
void InitCpu(void) { IE = 0; /*中断允许寄存器*/ IP = 0; /*中断优先次序寄存器*/ TCON = 0; /*计时控制寄存器*/ TMOD = 0x11; /*定时器工作模式控制寄存器 计时器1和计时器0分为两个独立的8位计时器TH0 TL0*/ // TH0 = TH20ms; // TL0 = TL20ms; P1 = 0xff; //INT0 = 1; //INT1 = 1; }
/////////////////////////////////////////////////////// void SetCpu(void) { ET0 = 1; /* 允许计时器0中断 IE.1*/ ET1 = 1; /* 允许计时器1中断 IE.3*/ TR0 = 1; /* 定时器0启动控制位 TCON.4*/ TR1 = 1; /* 定时器1启动控制位 TCON.6*/ // EX0 = 1; /* 允许外部INT0中断 IE.0 */ // IT0 = 1; /* 下降沿产生外部中断 TCON.0*/ // EX1 = 1; /* 允许外部INT1中断 IE.2*/ // IT1 = 1; /* 下降沿产生外部中断 TCON.2*/ IP = 0x02; /* INT0 HIGH LEVEL */ EA = 0; } ///////////////////////////////////////////////////////////
main() { InitCpu(); CAN_INIT(); SetCpu(); for(;;) { delay(); //延时 CAN_ID1 = 0X40; CAN_ID2 = 0X28; CAN_SENDBYTE1=0X01; CAN_SENDBYTE2=0X02; CAN_SENDBYTE3=0X03; CAN_SENDBYTE4=0X04; CAN_SENDBYTE5=0X05; CAN_SENDBYTE6=0X06; CAN_SENDBYTE7=0X07; CAN_SENDBYTE8=0X08; CAN_CMR |= 0X01; delay(); } } |