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