以下是我写的,在发送端芯片上烧的程序,用的Basic模式,目前已知情况:<br />1、寄存器已定义好(通过串口查询的寄存器值跟书上说的一致);<br />2、发送两次以后就停止工作啦;<br />3、接收端没有任何反应,也没进入中断;<br />/********************************************************************/<br /><br />#include<reg51.h><br />#include<intrins.h><br />#define uchar unsigned char<br />#define uint unsigned int<br />sbit L=P1^3; //指示灯<br />uchar TXB[10]={0xFF,0xFF,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x15};<br />/********************************************************************/<br />//CAN控制器初始化程序(12兆晶振,波特率为250kbs)<br />init_can(void)<br />{<br /> CR_CAN=0x01; //进入复位模式<br />// CDR_CAN=0x08; //通过有无频率输出,检测初始化是否成功<br /> CDR_CAN=0x40; //(新添加)设置CBP位,根据P_82;<br /> BTR0_CAN=0x00; //12兆晶振,波特率为250kbs<br /> BTR1_CAN=0x5F;<br /> OCR_CAN=0x1A; //选择正常模式<br /> ACR_CAN=0xFF; //验收代码<br /> AMR_CAN=0xFF; //屏蔽代码<br /> CR_CAN=0x7E; //使能接收中断<br /> CMR_CAN=0x60; //<br />// CDR_CAN=0x08; //通过有无频率输出,检测是否回到了工作状态<br />}<br />/********************************************************************/<br />//发送程序<br />send_can(void)<br />{<br /> uchar xdata *pt; //定义一个外部指针变量<br /> uchar i; //定义一个变量<br /> if(SR_CAN&0x40) //判断总线是否空闲<br /> {<br /> pt=0x7F0A; //发送缓冲器的起始地址(有疑问)<br /> for(i=0;i<10;i++)<br /> {<br /> *(pt++)=TXB; //将数组中的数字送入发送缓冲区<br /> }<br /> CMR_CAN=0x61; //启动发送命令,发送数据<br /> delayms(1500); //3秒延时,在此延长指示灯的跳变时间<br /> }<br />}<br />/********************************************************************/<br />main()<br />{<br /> init_can(); //初始化SJA1000<br /> while(1) //循环发送<br /> { <br /> send_can(); //调发送函数,发送数据<br /> delayms(200); //0.4秒延时<br /> L=!L; //指示灯变化<br /> }<br />}<br />/********************************************************************/ |
|