这个是发送的程序: /************************************************************************ * 广州周立功单片机发展有限公司 http://www.zlgmcu.com * ************************************************************************/ /************************************************************************ * * * SJA1000 BasicCAN模式的通讯测试 * * * ************************************************************************/ /************************************************************************ * * * 目的: 建立直观的BasicCAN测试平台 * * 文件名: main.c * * * * 模块名: sjanetdemo * * * * 目标系统: 任何基于任何兼容8051指令的微处理器同SJA1000组成的CAN系统* * * * 应用语言: Keil C51 * * * ************************************************************************ * 版本 :V1.0 * * * ************************************************************************ * 广州周立功单片机发展有限公司 保留所有的版权 * ************************************************************************/
#include <REG51.H> #include <intrins.h> #include "time_module.C" #include "sja_bcanFunc.C" //#include "sja_peliConf.h" #include "seriele.c" //#include "keyled.c" //数据类型定义 #define uchar unsigned char #define ulong unsigned long #define uint unsigned int
//设置系统数据缓冲区 static uchar data SetSystemBuf[10]; //系统设置数据缓冲区
static uchar data BandRateBuf; //设置总线波特率值缓冲区
static uchar idata EditMsSendCount; //编辑自动发送的频率 static uchar idata EditMsSendSave; //保存自动发送的频率
static uchar idata SendDataCount; //发送数据显示
//键盘操作函数 extern void Write_Xdata(uint Xadr,uchar Info); // 将info送入外部地址xadr中 extern uchar Read_Xdata(uint Xadr); //从外部地址xadr中读取数据 extern void Key_Scan(void); //键盘扫描程序 extern uchar Key_Get(void); //取键盘值 extern void PushKey(uchar keynum); //将键值送入按键处理队列 extern uchar PopKey(void); //
void Key_handle(void); //处理键值
void FundationKey(void); //功能键 void MoveKey(void); //移位键 void SearchKey(void); //检索键 void EnterKey(void); //确认键 void IncKey(void); //增加键 void QuitKey(void); //退出键 void CanSendKey(void); //发送键
void EnterNext(void); //按确认键后进入下一小项处理 //led 送显 #define LED_SelBit() disp_pt++;if(disp_pt>4)disp_pt=0//位选 extern void Show_LED(void); //显示处理 extern void Write_DispBuf(uchar buf0,uchar buf1,uchar buf2,uchar buf3,uchar buf4);//写入显示缓冲区 extern uchar GetLedData(void); //将显示的值换算 extern void Error_disp(uchar ErrByte); //将错误字送显
void InitCPU(void); //初始化函数 // 配置sja1000 uchar Config_SJA(void); //配置sja1000 void CanRcv_Prg(void); //can总线数据接收后处理 void CanSend_Prg(void); //can发送数据 void CanErr_Prg(void); //发现错误后处理 void CanDtOver_Prg(void); //超载处理 void CanWui_Prg(void); //唤醒中断处理
void UartRcv_Prg(void); //串口接收到数据处理
void DrecDisplay(uchar *databuf); //直通显示处理函数 void TestDispPrg(void); //测试处理函数 void ClearDispPrg(uchar *databuf); //消隐处理函数 void FlightDispPrg(uchar *databuf); //闪烁处理函数 void LiftCrcDispPrg(uchar *databuf); //左循环显示处理 void RightCrcDispPrg(uchar *databuf); //右循环显示处理
void AutoSendDataToCanBus(void); //自动发送
// 外部中断0 static uchar bdata CanBusFlag=0; //can标志 sbit CanRcv_Good=CanBusFlag^0; //成功接收标志 sbit CanSend_Good=CanBusFlag^1; //成功发送标志 sbit CanErrFlag=CanBusFlag^2; //can总线错误标志 sbit CanDtOverFlag=CanBusFlag^3; //can总线超载标志 sbit CanWuiFlag=CanBusFlag^4; //can总线唤醒中断
/*------------------------------------------------------------------------------------------- 外部中断0处理程序 -------------------------------------------------------------------------------------------*/ void ex0_Val(void) interrupt 0 using 1 { SJA_BCANAdr=REG_INTERRUPT; CanBusFlag=*SJA_BCANAdr; //保存sja1000中断标志 P1=CanBusFlag; } void Error_disp(uchar ErrByte) { uchar temp=ErrByte; P1=ErrByte; } /*------------------------------------------------------------------------------------------- main程序 -------------------------------------------------------------------------------------------*/ void main(void) { uchar status; //状态字 Delay_50us(100) ; //50us*100=5ms status=Config_SJA(); //配置sja1000 InitCPU(); //初始化 if(status!=0) { // status=0X01; // Error_disp(status); //配置sja1000出现错误 Exe_Scon(0xa1,0,0); Delay_50us(100) ; } else { // status=0X03; // Error_disp(status); // Disp_Can(); //无措显示CAN1 Exe_Scon(0xaa,0,0); Delay_50us(100) ; } //设置并行方式 TimeOut_Start(20); //20*50us=1ms,定时周期1ms P1=0X00; while(1) { if(_testbit_(T0IR)) //1ms时间到 { AutoSendDataToCanBus(); TimeOut_Start(20); //20*50us=1ms,定时周期1ms } // CanBusFlag=Read_Xdata(REG_INTERRUPT); if(_testbit_(CanRcv_Good)) { CanRcv_Prg(); //是接收中断标志 // Error_disp(0x01); } else if(_testbit_(CanSend_Good)) { CanSend_Prg(); //是发送中断标志 // Error_disp(0x03); } else if(_testbit_(CanErrFlag)) { CanErr_Prg(); //是错误中断标志 // Error_disp(0x07); } else if(_testbit_(CanDtOverFlag)) { CanDtOver_Prg();//是超载中断标志 // Error_disp(0x0f); } else if(_testbit_(CanWuiFlag)) { CanWui_Prg(); //是唤醒中断标志 // Error_disp(0x1f); } else if(_testbit_(UartRcvGood)) { UartRcv_Prg(); //串口接收成功标志 } /*else { Error_disp(0x3f); }*/ }
}
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 CanRcv_Prg(void) { }
void CanSend_Prg(void) //can发送数据 { // Error_disp(0x03); } void CanErr_Prg(void) //发现错误后处理 { // Error_disp(CAN_BUS_ERR); Config_SJA(); // } void CanDtOver_Prg(void) //超载处理 { // BCAN_CMD_PRG(COS_CMD); } void CanWui_Prg(void) //唤醒中断处理 { }
void UartRcv_Prg(void) //串口接收到数据处理 { BCAN_DATA_WRITE(RcvBuf); //将编辑的数据发送到can总线 BCAN_CMD_PRG(TR_CMD); }
//自动发送 void AutoSendDataToCanBus(void) { uchar i; SetSystemBuf[0]=0x08; SetSystemBuf[1]=0x08; for(i=2;i<10;i++) SetSystemBuf=0x08; BCAN_DATA_WRITE(SetSystemBuf); //将编辑的数据发送到can总线 BCAN_CMD_PRG(TR_CMD); } 这个是接收的程序: /************************************************************************ * 广州周立功单片机发展有限公司 http://www.zlgmcu.com * ************************************************************************/ /************************************************************************ * * * SJA1000 BasicCAN模式的通讯测试 * * * ************************************************************************/ /************************************************************************ * * * 目的: 建立直观的BasicCAN测试平台 * * 文件名: main.c * * * * 模块名: sjanetdemo * * * * 目标系统: 任何基于任何兼容8051指令的微处理器同SJA1000组成的CAN系统* * * * 应用语言: Keil C51 * * * ************************************************************************ * 版本 :V1.0 * * * ************************************************************************ * 广州周立功单片机发展有限公司 保留所有的版权 * ************************************************************************/
#include <REG51.H> #include <intrins.h> #include "time_module.C" #include "sja_bcanFunc.C" //#include "sja_peliConf.h" #include "seriele.c" //#include "keyled.c" //数据类型定义 #define uchar unsigned char #define ulong unsigned long #define uint unsigned int
//设置系统数据缓冲区 static uchar data SetSystemBuf[10]; //系统设置数据缓冲区
static uchar data BandRateBuf; //设置总线波特率值缓冲区
static uchar idata EditMsSendCount; //编辑自动发送的频率 static uchar idata EditMsSendSave; //保存自动发送的频率
static uchar idata SendDataCount; //发送数据显示
//键盘操作函数 extern void Write_Xdata(uint Xadr,uchar Info); // 将info送入外部地址xadr中 extern uchar Read_Xdata(uint Xadr); //从外部地址xadr中读取数据 extern void Key_Scan(void); //键盘扫描程序 extern uchar Key_Get(void); //取键盘值 extern void PushKey(uchar keynum); //将键值送入按键处理队列 extern uchar PopKey(void); //
void Key_handle(void); //处理键值
void FundationKey(void); //功能键 void MoveKey(void); //移位键 void SearchKey(void); //检索键 void EnterKey(void); //确认键 void IncKey(void); //增加键 void QuitKey(void); //退出键 void CanSendKey(void); //发送键
void EnterNext(void); //按确认键后进入下一小项处理 //led 送显 #define LED_SelBit() disp_pt++;if(disp_pt>4)disp_pt=0//位选 extern void Show_LED(void); //显示处理 extern void Write_DispBuf(uchar buf0,uchar buf1,uchar buf2,uchar buf3,uchar buf4);//写入显示缓冲区 extern uchar GetLedData(void); //将显示的值换算 extern void Error_disp(uchar ErrByte); //将错误字送显
void InitCPU(void); //初始化函数 // 配置sja1000 uchar Config_SJA(void); //配置sja1000 void CanRcv_Prg(void); //can总线数据接收后处理 void CanSend_Prg(void); //can发送数据 void CanErr_Prg(void); //发现错误后处理 void CanDtOver_Prg(void); //超载处理 void CanWui_Prg(void); //唤醒中断处理
void UartRcv_Prg(void); //串口接收到数据处理
void DrecDisplay(uchar *databuf); //直通显示处理函数 void TestDispPrg(void); //测试处理函数 void ClearDispPrg(uchar *databuf); //消隐处理函数 void FlightDispPrg(uchar *databuf); //闪烁处理函数 void LiftCrcDispPrg(uchar *databuf); //左循环显示处理 void RightCrcDispPrg(uchar *databuf); //右循环显示处理
void AutoSendDataToCanBus(void); //自动发送
// 外部中断0 static uchar bdata CanBusFlag=0; //can标志 sbit CanRcv_Good=CanBusFlag^0; //成功接收标志 sbit CanSend_Good=CanBusFlag^1; //成功发送标志 sbit CanErrFlag=CanBusFlag^2; //can总线错误标志 sbit CanDtOverFlag=CanBusFlag^3; //can总线超载标志 sbit CanWuiFlag=CanBusFlag^4; //can总线唤醒中断
/*------------------------------------------------------------------------------------------- 外部中断0处理程序 -------------------------------------------------------------------------------------------*/ void ex0_Val(void) interrupt 0 using 1 { SJA_BCANAdr=REG_INTERRUPT; CanBusFlag=*SJA_BCANAdr; //保存sja1000中断标志 P1=CanBusFlag; } void Error_disp(uchar ErrByte) { uchar temp=ErrByte; P1=ErrByte; } /*------------------------------------------------------------------------------------------- main程序 -------------------------------------------------------------------------------------------*/ void main(void) { uchar status; //状态字 Delay_50us(100) ; //50us*100=5ms status=Config_SJA(); //配置sja1000 InitCPU(); //初始化 if(status!=0) { // status=0X01; // Error_disp(status); //配置sja1000出现错误 Exe_Scon(0xa1,0,0); Delay_50us(100) ; } else { // status=0X03; // Error_disp(status); // Disp_Can(); //无措显示CAN1 Exe_Scon(0xaa,0,0); Delay_50us(100) ; } //设置并行方式 TimeOut_Start(20); //20*50us=1ms,定时周期1ms P1=0X00; while(1) { if(_testbit_(CanRcv_Good)) { CanRcv_Prg(); //是接收中断标志 // Error_disp(0x01); } else if(_testbit_(CanSend_Good)) { CanSend_Prg(); //是发送中断标志 // Error_disp(0x03); } else if(_testbit_(CanErrFlag)) { CanErr_Prg(); //是错误中断标志 // Error_disp(0x07); } else if(_testbit_(CanDtOverFlag)) { CanDtOver_Prg();//是超载中断标志 // Error_disp(0x0f); } else if(_testbit_(CanWuiFlag)) { CanWui_Prg(); //是唤醒中断标志 // Error_disp(0x1f); } else if(_testbit_(UartRcvGood)) { UartRcv_Prg(); //串口接收成功标志 } /* else { Error_disp(0x3f); }*/ } } 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 CanRcv_Prg(void) { }
void CanSend_Prg(void) //can发送数据 { // Error_disp(0x03); } void CanErr_Prg(void) //发现错误后处理 { // Error_disp(CAN_BUS_ERR); Config_SJA(); // } void CanDtOver_Prg(void) //超载处理 { // BCAN_CMD_PRG(COS_CMD); } void CanWui_Prg(void) //唤醒中断处理 { }
void UartRcv_Prg(void) //串口接收到数据处理 { BCAN_DATA_WRITE(RcvBuf); //将编辑的数据发送到can总线 BCAN_CMD_PRG(TR_CMD); }
//自动发送 /*void AutoSendDataToCanBus(void) { uchar i; SetSystemBuf[0]=0x08; SetSystemBuf[1]=0x08; for(i=2;i<10;i++) SetSystemBuf=0x08; BCAN_DATA_WRITE(SetSystemBuf); //将编辑的数据发送到can总线 BCAN_CMD_PRG(TR_CMD); /* uchar i; if((DispBuf[1]==0x05)&&(DispBuf[2]==0x0d)) { if(EditMsSendCount ==0){ EditMsSendCount = EditMsSendSave; SendDataCount++; SetSystemBuf[0]++; SetSystemBuf[1]=0x08; for(i=2;i<10;i++) SetSystemBuf=SendDataCount; BCAN_DATA_WRITE(SetSystemBuf); //将编辑的数据发送到can总线 BCAN_CMD_PRG(TR_CMD); DispBuf[3]=SendDataCount>>4; DispBuf[4]=SendDataCount&0x0f; } else{ EditMsSendCount--; } }*/ 我是按照ZLG的PHILIPS CAN控制器SJA1000的BasicCAN控制模块改的。大家可知道什么问题? |