基于SJA1000的CAN总线测试程序

发布者:北极星小鹏最新更新时间:2016-07-28 来源: eefocus关键字:SJA1000  CAN总线  测试程序 手机看文章 扫描二维码
随时随地手机看文章

代码如下:

/*************定义地址指针,指向基址***********/
unsigned char xdata *SJA_base_Adr = SJA_BaseAdr;

/*************定义SJA1000读写缓冲区的数据结构***********/
struct BASICCAN_BUFStruct{
                  unsigned char IDH8;
                  unsigned char IDL_R_DLC;
                  unsigned char Frame_Data[2];
                }receive_BUF,send_BUF;

 /****************************************************************
 *函数功能:写SJA1000的寄存器
 *入口参数:地址 SJAREG_ADR,数据 setting
 *出口参数:无
 ****************************************************************/
void Write_SJA1000(unsigned char SJAREG_ADR, unsigned char setting)
{
  *(SJA_base_Adr+SJAREG_ADR)=setting;
}

/****************************************************************
 *函数功能:读SJA1000的寄存器
 *入口参数:地址 SJAREG_ADR,数据 setting
 *出口参数:无
 ****************************************************************/
unsigned char Read_SJA1000(unsigned char SJAREG_ADR)
{
  unsigned char SJAREG_data;

  SJAREG_data=*(SJA_base_Adr+SJAREG_ADR);

  return(SJAREG_data);
}

/****************************************************************
 *函数功能:测试SJA1000是否正常连接
 *入口参数:无
 *出口参数:connect_OK
 ****************************************************************/
bit Judge_SJA1000_connect(void)
{
   bit connect_OK=0;

   Write_SJA1000(REG_TEST,0xAA); //写AA到测试寄存器(地址09)

   if(Read_SJA1000(0x09)==0xAA)
   {
     connect_OK=1;                         //连接正常 
   }
   else 
   {
  connect_OK=0;                         //连接故障
   }
   return(connect_OK);  
}

/****************************************************************
 *函数功能:设置SJA1000为工作模式
 *入口参数:无
 *出口参数:SJA_mode
 ****************************************************************/
bit Setting_SJA1000_workingmode(void)
{
 bit SJA_mode;
 unsigned char CONTROL_REGdata;
  
 CONTROL_REGdata=Read_SJA1000(REG_CONTROL);
 CONTROL_REGdata&=0xFE;

 Write_SJA1000(REG_CONTROL,CONTROL_REGdata);
 
 if((Read_SJA1000(REG_CONTROL)&0x01)!=0x01) 
 {
   SJA_mode=1;                        //置工作模式成功
 }
 else 
 {
   SJA_mode=0;                        //置工作模式失败
 } 
 
 return(SJA_mode); 
}

/****************************************************************
 *函数功能:设置SJA1000为复位模式
 *入口参数:无
 *出口参数:SJA_mode
 ****************************************************************/
bit Setting_SJA1000_resetmode(void)
{
 bit SJA_mode;
 unsigned char CONTROL_REGdata;
   
 CONTROL_REGdata=Read_SJA1000(REG_CONTROL);
 CONTROL_REGdata|=0x01;

 Write_SJA1000(REG_CONTROL,CONTROL_REGdata);

 if((Read_SJA1000(REG_CONTROL)&0x01)==0x01) 
 {
   SJA_mode=1;                        //置复位模式成功
 }
 else 
 {
   SJA_mode=0;                        //置复位模式失败
 }
 
 return(SJA_mode);  
}

/****************************************************************
 *函数功能:设置SJA1000波特率
 *入口参数:无
 *出口参数:setting_success
 ****************************************************************/
bit Setting_SJA1000_rate(void)
{
 bit setting_success;
   
 while(Setting_SJA1000_resetmode()==0)
 {
   Setting_SJA1000_resetmode();                   //设置SJA工作在复位模式
 }

    Write_SJA1000(REG_BTR0,SJA_BTR0);
 Write_SJA1000(REG_BTR1,SJA_BTR1);

    if((Read_SJA1000(REG_BTR0)==SJA_BTR0)&(Read_SJA1000(REG_BTR1)==SJA_BTR1))
 {
      setting_success=1;                        //波特率设置成功
 }
 else 
 {
   setting_success=0;                         //波特率设置失败
 }
    
 return(setting_success);
}

/****************************************************************
 *函数功能:设置SJA1000的滤波寄存器和屏蔽寄存器
 *入口参数:无
 *出口参数:setting_success
 ****************************************************************/
bit Setting_SJA1000_dataselect(void)
{
  bit setting_success;
   
  while(Setting_SJA1000_resetmode()==0)
  {
    Setting_SJA1000_resetmode();                   //设置SJA工作在复位模式
  }

  Write_SJA1000(REG_ACR,SJA_ACR);
  Write_SJA1000(REG_AMR,SJA_AMR);

  if((Read_SJA1000(REG_ACR)==SJA_ACR)&(Read_SJA1000(REG_AMR)==SJA_AMR))
  {
    setting_success=1;                        //滤波器设置成功
  }
  else 
  {
    setting_success=0;                         //滤波器设置失败
  }
   
  return(setting_success);
}

/****************************************************************
 *函数功能:设置SJA1000的时钟分频器
 *入口参数:无
 *出口参数:setting_success
 ****************************************************************/
bit Setting_SJA1000_CDR(void)
{
  bit setting_success;
   
  while(Setting_SJA1000_resetmode()==0)
  {
    Setting_SJA1000_resetmode();                   //设置SJA工作在复位模式
  }

  Write_SJA1000(REG_CDR,SJA_CDR);

  if(Read_SJA1000(REG_CDR)==SJA_CDR)
  {
    setting_success=1;                        //滤波器设置成功
  }
  else 
  {
    setting_success=0;                         //滤波器设置失败
  }
   
  return(setting_success);
}

/****************************************************************
 *函数功能:设置SJA1000的输出控制寄存器
 *入口参数:无
 *出口参数:setting_success
 ****************************************************************/
bit Setting_SJA1000_OCR(void)
{
  bit setting_success;
   
  while(Setting_SJA1000_resetmode()==0)
  {
    Setting_SJA1000_resetmode();                   //设置SJA工作在复位模式
  }

  Write_SJA1000(REG_OCR,SJA_OCR);

  if(Read_SJA1000(REG_OCR)==SJA_OCR)
  {
    setting_success=1;                        //滤波器设置成功
  }
  else 
  {
    setting_success=0;                         //滤波器设置失败
  }
   
  return(setting_success);
}

/****************************************************************
 *函数功能:初始化SJA1000
 *入口参数:无
 *出口参数:setting_success
 ****************************************************************/
void Initial_SJA1000(void)
{
  while(Judge_SJA1000_connect==0);
  
  do
  {
   Setting_SJA1000_resetmode(); 
  }
  while(Setting_SJA1000_resetmode()==0);

  while(Setting_SJA1000_CDR()==0);
  while(Setting_SJA1000_rate()==0);
  while(Setting_SJA1000_OCR()==0);
  while(Setting_SJA1000_dataselect()==0)

  do
  {
   Setting_SJA1000_workingmode(); 
  }
  while(Setting_SJA1000_workingmode()==0);

}

 /****************************************************************
 *函数功能:初始化发送数据
 *入口参数:无 
 *出口参数:setting_success,指示初始化是否成功
 ****************************************************************/
bit Initial_transmitter_BUF(void)
{
 bit setting_success=0;

 send_BUF.IDH8  = 0x30;
 send_BUF.IDL_R_DLC = 0x22;                  //IDL_R_DLC。4即为RTR位,数据=0,远程=1;
 send_BUF.Frame_Data[0] = 0x10;
 send_BUF.Frame_Data[1] = 0x00;
 
 setting_success = 1;

 return(setting_success);
}

/****************************************************************
 *函数功能:对SJA1000发送数据
 *入口参数:无
 *出口参数:无
 ****************************************************************/
 void Transmitter_SJA1000(void)
 {
   unsigned char state;
   unsigned char i;
  
   do
   {
     Setting_SJA1000_workingmode(); 
   }
   while(Setting_SJA1000_workingmode()==0);

   while(Initial_transmitter_BUF()==0);   //初始化发送数据

   do
   {
     state = Read_SJA1000(REG_STATUS); //REG_STATUS为SJA1000的状态寄存器
   }
   //查询SJA1000是否处于接收状态,发送完毕状态,或者发送缓存器被锁;
   while( ((state&0x10)==0x10) & ((state&0x08)!=0x08) & ((state&0x04)!=0x04) );

   Write_SJA1000(REG_TxBuffer1,send_BUF.IDH8);
   Write_SJA1000(REG_TxBuffer2,send_BUF.IDL_R_DLC);
   for(i=0;i<2;i++)
   {
     Write_SJA1000(REG_TxBuffer3+i,send_BUF.Frame_Data[i]);
   }

   Write_SJA1000(REG_COMMAND,TR_CMD);

   do
   {
     state = Read_SJA1000(REG_STATUS); //REG_STATUS为SJA1000的状态寄存器
   }
   while( (state&0x08)!=0x08); //查询SJA1000是否发送完毕状态
 }
 
/***************************************************
***************************************************/

void main(void)
{
  unsigned char i;
  Initial_SJA1000();
  delay1ms(1);

  while(1)
  {     
    if((P1_0==0)|(P1_1==0)|(P1_2==0))
 {
   delay1ms(5);

   if((P1_0==0)|(P1_1==0)|(P1_2==0))
   {
     while((P1_0==0)|(P1_1==0)|(P1_2==0));
  for(i=0;i<100;i++)
     {
       Transmitter_SJA1000();
     }
   }   
    } 
  }
}

关键字:SJA1000  CAN总线  测试程序 引用地址:基于SJA1000的CAN总线测试程序

上一篇:51单片机 同时扩展ROM,RAM的具体实现及kiel的具体设置
下一篇:[C51代码]4*4键盘扫描

推荐阅读最新更新时间:2024-03-16 15:02

基于CMOS图像传感器的纳型卫星遥感系统设计
  纳型卫星是指质量在1~10kg 之间的卫星。与微型卫星相比, 纳型卫星对遥感系统在质量、体积、功耗等方面的要求更加苛刻。目前广泛用于微型卫星遥感系统的电荷耦合器件CCD很难满足纳型卫星的使用要求。CMOS图像传感器采用标准的CMOS 技术, 继承了CMOS 技术的优点, 如静态功耗低、动态功耗与工作频率成比例、噪声容限大、抗干扰能力强、特别适合于噪声环境恶劣条件下工作、工作速度较快、只需要单一工作电源等。虽然 CMOS 器件的研究还未完全成熟, 如电离环境下暗电流稍大等问题还没有很好地解决,还不能完全取代CCD, 但不可否认CMOS 器件将是未来遥感传感器的发展方向。本文设计了一套纳型卫星CMOS 遥感系统, 并对其进行了热循
[工业控制]
基于AT89C52的CAN总线无功补偿控制设计
1 引言 根据资料统计,输电线路、高压配电网、低压用户三个部分的线损中,低压用户线损最大,因此,降损节能应主要围绕低压380V用户进行。长期以来,我国低压配电网网架薄弱,自然功率因数低,而且结构复杂,降低了电网的经济效益。目前,电力部门一般采用就地无功补偿的方法解决这一问题。目前市场上所投入使用的低压无功补偿装置有很多种,但大部分补偿单元基本上都是由主控制器的CPU直接驱动的,系统有多少组电容器,就会从CPU引出相应路数的线,从无功补偿器引出的线路很多,同时传输距离也很有限。这给安装、检修、维护和扩展带来了极大的不方便。 CAN(Controller Area Network)总线属于现场总线的范畴,它是德国Bosch
[工业控制]
基于AT89C52的<font color='red'>CAN总线</font>无功补偿控制设计
CAN总线实现工业网络分布式测控系统
  1 引言   现场总线技术是当今自动化领域发展的热点,can总线以其独特的设计、低成本、高可靠性、实时性、抗干扰能力强等特点得到了广泛的应用。本文选用can总线设计了分布式热电阻智能节点,利用can总线连接各个网络节点,可以直接与主控卡或上位机通信,组建成工业网络分布式测控系统。   2 热电阻智能节点硬件设计   2.1智能节点整体结构   本热电阻智能节点设有4路输入通道,支持3线制方式,支持热电阻类型有cu50、cu100和pt100,采用freescale mc9s12d64单片机作为微控制器,其内部有一个can通信模块(mscan),符合can2.0a/b标准,所以不需要扩展can通讯控制器。can接
[嵌入式]
CAN总线与MSP430红外检测系统电路
  本文介绍的是一种新的检测系统,选用红外CO传感器和MSP430单片机作为核心信号处理电路,结合数字滤波、温度补偿运算.具有检测浓度范围宽、使用寿命长等优点。   系统组成及硬件设计   该系统由红外CO气体传感器、MSP430单片机、CAN总线接口及远程监控系统组成。该系统在检测现场通过单片机处理检测的数据、控制 LCD显示、声光报警,同时还配备CAN总线控制器,可以轻松获取浓度、温度以及报警记录等相关信息,实现了智能化的工业现场、远程同时监控功能。系统的组成框图如图1所示。      CAN总线接口设计   该系统CAN接口由独立的CAN总线控制器SJA1000、CAN数据收发器TJA1050组成。SJA1000是独立
[单片机]
<font color='red'>CAN总线</font>与MSP430红外检测系统电路
基于CAN总线的智能馈线终端的研究
1 前言 随着国民经济的发展,电力用户对供电质量和供电可靠性的要求越来越高,实现配电自动化是配电系统提高供电可靠性的最有效手段。在配电自动化系统中,馈线自动化是配电自动化系统的基础。而作为馈线自动化系统中核心设备的馈线终端则成为配电自动化系统成功实施的关键。 馈线终端简称FTU(Feeder Terminal Unit),它主要用来监控柱上负荷开关,重合器等一次设备。向配电主站/子站提供配电系统运行工况和提供各种参数:包括开关状态,电能参数,相间和接地故障及故障时的参数信息,并执行配电主站/子站对配电设备的控制及调节指令。 CAN总线作为具有国际标准,主要为工业现场设计的开放式总线,具有可靠性高,实时性强,组网灵活,成本低廉等优
[模拟电子]
基于<font color='red'>CAN总线</font>的智能馈线终端的研究
基于CAN总线的旋转编码器采集模块设计
随着工业生产自动化水平的提高,各种传感器的应用也越来越多。旋转编码器作为速度和位移反馈的传感器,主要应用于数控机床、高精度的闭环调速系统、伺服电动机、异步电动机、步进电动机、电梯曳引机、电梯门机乃至机械轴等需要对运动速度和位移信息反馈的自动化控制场合,以保证机械的高精度稳定运转,进而提高生产效率和保障安全运营。 本文针对旋转编码器在工业现场中的应用,基于LPCI768硬件平台,设计出一种旋转编码器采集模块,该模块内部具有高精度分析、整形、解码电路,可同时对2路编码器输入信号进行分析、解码。经过处理的旋转信号通过高性能处理器进行采集及数字滤波。旋转编码器同时还对2路编码器信号进行角速度计算,最终模块通过CAN总线将采集到的旋转
[单片机]
基于<font color='red'>CAN总线</font>的旋转编码器采集模块设计
基于C8051F040的CAN总线智能节点设计
引言 “X型火控系统”根据实际需要采用了CAN总线方式来实现其内部单体间的通信。CAN总线是一种用于各种设备检测及控制的现场总线,它是一种多主总线,在高速网络和低成本的节点系统中应用都很广泛。CAN总线与一般的通信总线相比,它的数据通信具有突出的可靠性、实时性和灵活性。其特点如下: *可以多主方式工作。 *CAN节点只需对报文的标识符滤波即可实现点对点、一点对多点及全局广播方式发送和接收数据。 *CAN总线通信格式采用短帧格式。 *采用非破坏性总线仲裁技术。 *直接通信距离最大可达10km (速率5kb/s以下),最高通信速率可达1Mb/s (此时距离最长为40m),节点数可达110个,通信介质可以是双绞线、同轴电缆或光导纤维。
[工业控制]
热门资源推荐
热门放大器推荐
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
  • 学习ARM开发(16)
    ARM有很多东西要学习,那么中断,就肯定是需要学习的东西。自从CPU引入中断以来,才真正地进入多任务系统工作,并且大大提高了工作效率。采 ...
  • 学习ARM开发(17)
    因为嵌入式系统里全部要使用中断的,那么我的S3C44B0怎么样中断流程呢?那我就需要了解整个流程了。要深入了解,最好的方法,就是去写程序 ...
  • 学习ARM开发(18)
    上一次已经了解ARM的中断处理过程,并且可以设置中断函数,那么它这样就可以工作了吗?答案是否定的。因为S3C44B0还有好几个寄存器是控制中 ...
  • 嵌入式系统调试仿真工具
    嵌入式硬件系统设计出来后就要进行调试,不管是硬件调试还是软件调试或者程序固化,都需要用到调试仿真工具。 随着处理器新品种、新 ...
  • 最近困扰在心中的一个小疑问终于解惑了~~
    最近在驱动方面一直在概念上不能很好的理解 有时候结合别人写的一点usb的例子能有点感觉,但是因为arm体系里面没有像单片机那样直接讲解引脚 ...
  • 学习ARM开发(1)
  • 学习ARM开发(2)
  • 学习ARM开发(4)
  • 学习ARM开发(6)
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved