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