我是按照ZLGMCU网站上的“PHILIPS CAN控制器SJA1000的BasicCAN控制模块”资料(http://www.zlgmcu.com/download/downs.asp?ID=668,那个资料很详细)做的CAN收发器,只是去除与PC的串行通信,改用7279在数码管上显示相关信息。电路基本上按照资料上的“图6节点接口简图”。区别只是: 1、不用光偶直接将TX0和RX0连到TXD和RXD; 2、TX1悬空,RX1连至82C250的Vref,万用表测电压2.49V; 3、/RESET采用RC复位,R=10K,C=10uF,书上说RC复位R=50K,C=1uF,算算时间常数应该可以。 软件 在其基础上稍微改改,所有子程序没有改一个字符。 发送程序如下: void main(void) { uchar status; //状态字 Delay_50us(100) ; //50us*100=5ms status=Config_SJA(); //配置sja1000 InitCPU(); //初始化 if(status!=0) write7279(DECODE1,status&0x0f); //配置sja1000出现错误,显示错误代码 else write7279(DECODE1,0); //配置sja1000正常显示0 }
SetSystemBuf[0]=0xaa; //简单的发送测试,送一个字节0X55 SetSystemBuf[1]=0x03; SetSystemBuf[2]=0x55; if(BCAN_DATA_WRITE(SetSystemBuf)) write7279(DECODE1+1,2); else write7279(DECODE1+1,3); //写入缓冲区正常显示3,不正常显示2 if(BCAN_CMD_PRG(TR_CMD)) write7279(DECODE1,2); else write7279(DECODE1,3); //启动发送正常正常显示3,不正常显示2
loop:goto loop; } //以下的InitCPU和Config_SJA子程序和资料上一模一样,没改过。 void InitCPU(void) { EA =1; IT0 =1; EX0 =1; PX0 =1; //InitUart(); //初始化串口 } //// uchar Config_SJA(void) { uchar data status=0; Delay_50us(100) ; TimeOut_Start(20); BandRateBuf = ByteRate_1000k; BCAN_ENTER_RETMODEL(); if(BCAN_CREATE_COMMUNATION())// { status = CAN_INTERFACE_ERR; return(status); } if(BCAN_SET_BANDRATE(BandRateBuf))//初始化系统默认值波特率100kbps { status = CAN_INITBTR_ERR ; return(status); } if(BCAN_SET_OBJECT(0xaa,0x00)) { status =CAN_INITOBJECT_ERR; return(status); } if(BCAN_SET_OUTCLK(0xaa,0x48)) { status =CAN_INITOUTCTL_ERR; return(status); } if(BCAN_QUIT_RETMODEL()) { status = CAN_QUITRESET_ERR; return(status); } SJA_BCANAdr=REG_CONTROL; *SJA_BCANAdr=0X1E; return status; }
接收程序: void ex0_Val(void) interrupt 0 using 1 { SJA_BCANAdr=REG_INTERRUPT; CanBusFlag=*SJA_BCANAdr; //保存sja1000中断标志 //////////////////////////////////////////////////////////////// //接收测试:若有帧收到产生中断,在数码管上显示8,没有帧收到初始化正常显示0,初始化不正常显示错误代码。我的机器上一直显示0 write7279(DECODE1,8); loop1:goto loop1; ////////////////////////////////////////////////////// }
void main(void) { uchar status; //状态字 Delay_50us(100) ; //50us*100=5ms status=Config_SJA(); //配置sja1000 InitCPU(); //初始化 if(status!=0) write7279(DECODE1,status&0x0f);//Error_disp(status); //配置sja1000出现错误 else { write7279(DECODE1,0); //初始化正常显示0 }
while(1) {if(_testbit_(CanRcv_Good)) CanRcv_Prg();//是接收中断标志 if(_testbit_(CanSend_Good)) CanSend_Prg();//是发送中断标志 if(_testbit_(CanErrFlag)) CanErr_Prg();//是错误中断标志 if(_testbit_(CanDtOverFlag))CanDtOver_Prg();//是超载中断标志 if(_testbit_(CanWuiFlag)) CanWui_Prg();//是唤醒中断标志 } } InitCPU和Config_SJA子程序和资料上一模一样,没改过。 我的接收节点一直显示0,表示没有进入/INT0,没有收到帧,不知为何?麻烦各位指点迷津。 |