打印
[CAN-bus/DeviceNet]

哪个高手来帮忙弄下程序(新手求教)

[复制链接]
1874|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
monday1147|  楼主 | 2008-5-19 18:23 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
数据采集模块CAN与报警模块的CAN直接连接   用89C51+SJA1000+82C250   2个模块82C250直接连接  中间没CAN总线网络 硬件电路我已经做好了,就是程序不会写   2个CAN之间通信  需要把数据采集模块的数据传给报警模块

数据采集     温度  开关  速度  温度  开关  速度
        地址 1001  1002  1003  1004  1005  1006
3个一组这样循环存储20次  不知道怎么写把它传过去  看了好多资料 越看越糊涂

相关帖子

沙发
monday1147|  楼主 | 2008-5-19 18:26 | 只看该作者

哪个高手来帮忙弄下程序(新手求教)

哪个大哥帮忙写下程序 非常感谢

使用特权

评论回复
板凳
xuxiaozhao| | 2008-5-19 23:11 | 只看该作者

CAN程序

没有报酬的事是没有人做的了.
给个程序你参考,基本相同的硬件.已经测试成功的.
//------------------------------------connet MCU and SJA1000----------------------------------
//                       MCU                          SJA1000
//                       INT0             ---->       INT0
//                       INT1(p3.4)       ---->       /RST
//                       P2.7             ---->       /CS
//                       P0               ---->       DATA
//---------------------------------------------------------------------------------------------


/***********************************************************************************************
*          define SJA1000 REG(sfr)
***********************************************************************************************/
#include <AT89X55.h>
#include <absacc.h>

#define  SJA_REG_BaseADD        0x7800
#define  REG_MODE               XBYTE[SJA_REG_BaseADD+0x00] //模式寄存器
#define  REG_CMD                XBYTE[SJA_REG_BaseADD+0x01]  //命令寄存器
#define  REG_SR                 XBYTE[SJA_REG_BaseADD+0x02]  //状态寄存器
#define  REG_IR                 XBYTE[SJA_REG_BaseADD+0x03]  //中断寄存器
#define  REG_IR_ABLE            XBYTE[SJA_REG_BaseADD+0x04]  //中断使能寄存器
#define  REG_BTR0               XBYTE[SJA_REG_BaseADD+0x06]  //05保留 总线定时寄存器0
#define  REG_BTR1               XBYTE[SJA_REG_BaseADD+0x07]  //总线定时寄存器0
#define  REG_OCR                XBYTE[SJA_REG_BaseADD+0x08]  //输出控制寄存器
#define  REG_TEST               XBYTE[SJA_REG_BaseADD+0x09]  //测试寄存器
#define  REG_ALC                XBYTE[SJA_REG_BaseADD+0x0b]  //0a保留 仲裁丢失捕捉寄存器
#define  REG_ECC                XBYTE[SJA_REG_BaseADD+0x0c]  //错误代码捕捉寄存器
#define  REG_EMLR               XBYTE[SJA_REG_BaseADD+0x0d]  //错误报警限制
#define  REG_RXERR              XBYTE[SJA_REG_BaseADD+0x0e]  //RX错误计数器
#define  REG_TXERR              XBYTE[SJA_REG_BaseADD+0x0f]  //TX错误计数器

#define  REG_ACR0               XBYTE[SJA_REG_BaseADD+0x10]  //验收代码0
#define  REG_ACR1               XBYTE[SJA_REG_BaseADD+0x11]  //验收代码1
#define  REG_ACR2               XBYTE[SJA_REG_BaseADD+0x12]  //验收代码2
#define  REG_ACR3               XBYTE[SJA_REG_BaseADD+0x13]  //验收代码3

#define  REG_AMR0               XBYTE[SJA_REG_BaseADD+0x14]  //验收屏蔽0
#define  REG_AMR1               XBYTE[SJA_REG_BaseADD+0x15]  //验收屏蔽1
#define  REG_AMR2               XBYTE[SJA_REG_BaseADD+0x16]  //验收屏蔽2
#define  REG_AMR3               XBYTE[SJA_REG_BaseADD+0x17]  //验收屏蔽3    

#define  REG_RxBuffer0          XBYTE[SJA_REG_BaseADD+0x10]  //接收缓冲区0
#define  REG_RxBuffer1          XBYTE[SJA_REG_BaseADD+0x11]  //接收缓冲区1
#define  REG_RxBuffer2          XBYTE[SJA_REG_BaseADD+0x12]  //接收缓冲区2
#define  REG_RxBuffer3          XBYTE[SJA_REG_BaseADD+0x13]  //接收缓冲区3
#define  REG_RxBuffer4          XBYTE[SJA_REG_BaseADD+0x14]  //接收缓冲区4    

#define  REG_TxBuffer0          XBYTE[SJA_REG_BaseADD+0x10]  //发送缓冲区0
#define  REG_TxBuffer1          XBYTE[SJA_REG_BaseADD+0x11]  //发送缓冲区1
#define  REG_TxBuffer2          XBYTE[SJA_REG_BaseADD+0x12]  //发送缓冲区2
#define  REG_TxBuffer3          XBYTE[SJA_REG_BaseADD+0x13]  //发送缓冲区3
#define  REG_TxBuffer4          XBYTE[SJA_REG_BaseADD+0x14]  //发送缓冲区4   

#define  REG_DataBuffer1        XBYTE[SJA_REG_BaseADD+0x15]  //数据缓冲区0
#define  REG_DataBuffer2        XBYTE[SJA_REG_BaseADD+0x16]  //数据缓冲区1
#define  REG_DataBuffer3        XBYTE[SJA_REG_BaseADD+0x17]  //数据缓冲区2
#define  REG_DataBuffer4        XBYTE[SJA_REG_BaseADD+0x18]  //数据缓冲区3
#define  REG_DataBuffer5        XBYTE[SJA_REG_BaseADD+0x19]  //数据缓冲区4
#define  REG_DataBuffer6        XBYTE[SJA_REG_BaseADD+0x1a]  //数据缓冲区5
#define  REG_DataBuffer7        XBYTE[SJA_REG_BaseADD+0x1b]  //数据缓冲区6
#define  REG_DataBuffer8        XBYTE[SJA_REG_BaseADD+0x1c]  //数据缓冲区7

#define  REG_RBSA               XBYTE[SJA_REG_BaseADD+0x1e]   //RX缓冲区起始地址
#define  REG_CDR                XBYTE[SJA_REG_BaseADD+0x1f]   //时钟分濒器
#define  REG_Receive_Counter    XBYTE[SJA_REG_BaseADD+0x1d]   //RX报文计数器

//--------------------------------LED on and off value------------------------------------
#define  OFF   1
#define  ON    0

//--------------------------------mode value ---------------------------------------------
#define  RM_MODE  0x01          //复位模式
#define  LOM_MODE 0x02          //只听模式(只听不答)
#define  STM_MODE 0x04          //自检测模式(没有活动节点也能发送成功)
#define  AFM_MODE 0x08          //单验收滤波器和正常模式

//------------------------------commd value------------------------------------------------
#define  TR_CMD   0x01          //发送请求
#define  AT_CMD   0x02          //中止发送(正在等待的信息)
#define  RRB_CMD  0X04          //释放接收缓冲器
#define  CDO_CMD  0x08          //清除数据溢出
#define  SRR_CMD  0x10          //自接收

//-------------------------------SJA1000 status-------------------------------------------
#define  RBS_SR   0x01          //接收绶冲器状态  1.有可用的信息
#define  DOS_SR   0x02          //数据溢出状态    1.RXFIFO中没有足够空间保存信息
#define  TBS_SR   0x04          //发送缓冲器状态  1.可向缓冲器写数据
#define  TCS_SR   0x08          //发送完毕状态    1.最近一次发送被成功处理
#define  RS_SR    0x10          //接收状态        1.SJA1000正在接收信息
#define  TS_SR    0x20          //发送状态        1.SJA1000正在发送信息
#define  ES_SR    0x40          //出错信息        1.出错
#define  BS_SR    0x80          //总线状态        1.总线关闭  0.总线开始

//--------------------------------SJA1000 inrrupt-----------------------------------------
#define   RI_IR    0x01           //接收中断  接收FIFO不空都会产生中断
#define   TI_IR    0x02           //发送中断  发送缓冲区状态从0->1都产生中断
#define   EI_IR    0x04           //错误报警中断
#define   DOI_IR   0x08           //数据溢出中断
#define   WUI_IR   0x10           //唤醒中断
#define   EPI_IR   0x20           //错误消极中断
#define   ALI_IR   0x40           //仲裁丢失中断
#define   BEI_IR   0x80           //总线错误中断

//-------------------------------LED to MCU and switch-------------------------------------
sbit  LED0 = P1^0;
sbit  LED1 = P1^1;
sbit  LED2 = P1^2;

sbit  SWITCH0 = P1^3;
sbit  SWITCH1 = P1^4;
sbit  SWITCH2 = P1^5;
sbit  SWITCH3 = P1^6;
sbit  SWITCH4 = P1^7;
sbit  SJARst  = P3^3;  //SJA1000复位控制

//------------------------------- RX buffer struct----------------------------------------
typedef struct
{
       unsigned char dlen;
       unsigned char did1;
       unsigned char did2;
       unsigned char did3;
       unsigned char did4;
       unsigned char ddata[8];
}CAN_FRAME_STRUCT;

//-----------------------------system FLAY---------------------------------------------------
extern unsigned char bdata ERR_flag;

#define  hard_ERR  0x01   //对REG写AA和55值判断其硬件接口情况
#define  Init_ERR  0x02   //不能复位即初始化失败
#define  no_TCS    0x04   //未发送完
#define  no_TBS    0x08   //发送缓冲器没有释放

使用特权

评论回复
地板
xuxiaozhao| | 2008-5-19 23:13 | 只看该作者

CAN程序


#include <AT89X55.H>
#include <intrins.h>
#include "MARCO.H"
#include "main.h"

//-------------------------------------extern variable---------------------------------------
extern CAN_FRAME_STRUCT Tx_buffer;
extern CAN_FRAME_STRUCT Rx_buffer;


/************************************************************************
*函数原型:  T0_ISR( )
*参数说明:  no
*返回值:
*             此函数可以根据用户需在更改和删除
*说明:主要产生一个定时发送时时候使用.
************************************************************************/
void T0_ISR(void) interrupt 1 using 2
{
        TR0 = 0;            //stop T0 count
        TL0 = 0x00;         //delay 50ms
        TH0 = 0x4C;
        TR0 = 1;            //endle T0
        T0_Num++;
}

/************************************************************************
*函数原型:  INT0_ISR( )
*参数说明:  no
*返回值:
*             此函数可以根据用户需在更改和删除
*说明:外部中断产生接收中断然后读取中断寄存器
************************************************************************/
void INT0_ISR(void) interrupt 0  using 1
{
        IR_Data = REG_IR;
}
/************************************************************************
*函数原型:  INT0_ISR_APL( )
*参数说明:  no
*返回值:
*             此函数可以根据用户需在更改和删除
*说明:中断方式接收,用于测试,接收到节点信息然后加以处理接收信息
************************************************************************/
void INT0_ISR_APL()
{
    unsigned char temp_IR;
    temp_IR = IR_Data;
    if( (temp_IR & RI_IR) == RI_IR )
    {
        //IR_Data = (IR_Data & (~RI_IR));
        Rx_data();
    }
    temp_IR = IR_Data;
    if( (temp_IR & DOI_IR) == DOI_IR)
    {
        REG_CMD = CDO_CMD;
        delay(125);
    }
    temp_IR = IR_Data;
    if( (temp_IR & BEI_IR) == BEI_IR )
    {
        REG_CMD = AT_CMD;
        delay(125);
    }
    IR_Data = 0x00;
}

/************************************************************************
*函数原型:      delay(int i)                               *
*参数说明:    i:为延时ims                *
*返回值:                          *
*说明:       为整形变量                                         *
***********************************************************************/
void delay( int i )
{
    while( -- i )
        ;
}

/*********************************************************************************************
** 函数名称: MCU_Init
** 功能描述: init MCU T0 and INT0, LED
** 输   入: no
** 输   出: no
** 全局变量: no
** 调用模块: no
** 作   者:
** 日   期: 2007年10月23日
***********************************************************************************************/
void MCU_Init()
{
        LED0 = OFF;  //all LED close
        LED1 = OFF;
        LED2 = OFF;
        SJARst = 1;    //rest SJA1000
        //-------------------------------------
        EA = 0;       //close tatol interrupt
        TR0 = 0;
        //TMOD:    GATE C/T M1 M0  GATE C/T M1 M0
        TMOD = 0x01;  //T0 方式1  16位定时器
    TL0 = 0x00;
    TH0 = 0x4C;
        //IE:EA ET2 ES ET1 EX1 ET0 EX0
        ET0 = 1;       //endle  T0 interrupt
        //TCON:    TF1 TR1 TF0 TR0
        TR0 = 1;       //endle T0_count  start T0

        PX0 = 1;
        EX0 = 1;
        EA  = 1;

}
/************************************************************************
*函数原型:     CAN_APL(int i)                              *
*参数说明:    i:为延时ims               *
*返回值:                        *
*说明:       应用涵数,现只作测试用,
***********************************************************************/
void CAN_APL()
{
       int No = 0;       //define count
       Tx_buffer.dlen = 8;
       if(F0 == 0)
       {
              while(No<8)
               {
                Tx_buffer.ddata[No] = Rx_buffer.ddata[No];
                No ++;
               }
     }
     else
      {
                while(No<8)
                {
                 Tx_buffer.ddata[No] = 0;
                 No ++;
                 }
    }
}

/**********************************************************************
** 函数名称: main()
** 功能描述: main function enter
** 输   入: no
** 输   出: no
** 全局变量:
** 调用模块:
** 作   者:
** 日   期: 2007年10月23日
**********************************************************************/
void main()
{
        delay( 5000 );     //wait MCU normal work
        MCU_Init();        //init MCU
        SJA_Init();        //init SJA1000
        delay( 5000 );
        SJA_ERR();

        LED1 = ON;        //system normal
        T0_Num = 0;       //T0 inrrupt count
        while(1)
        {
            if( (IR_Data & RI_IR) == RI_IR)
            {
                //INT0_ISR_APL();
                //CAN_APL();
                Tx_data();
                LED2 = ~LED2;
                Rx_node_Num();
            }
            INT0_ISR_APL();
            CAN_APL();
            Rx_node_Num();

            //delay(5000);
            //Tx_data();
            //Rx_node_Num();
           // can_test();
            /*
            if( (IR_Data & 0x01) ==0x01)
            {
                IR_Data = 0x00;
                Rx_data();
                CAN_APL();
                can_test();
                delay(5000);
                Tx_data();
            }
            Rx_node_Num();
            delay(5000);  */
            //can_test();



                  /*
                  Rx_node_Num();
                  if(T0_Num > 20)
                  {
                        Rx_data();

                        CAN_APL();
                        delay(500);
                        Tx_data();
                        delay(1000);

                        can_test();
                        T0_Num = 0;
                        LED2 = ~LED2;
                   }*/

         }
}

使用特权

评论回复
5
xuxiaozhao| | 2008-5-19 23:25 | 只看该作者

程序

#include "CANBUS.H"

//-------------------------------------define  variable------------------------------------
unsigned char receive_counter = 0;
unsigned char alc = 1;
unsigned char ecc = 1;

/************************************************************************
*函数原型:  bit   CAN_CREATE_COMMUNATION(void)
*参数说明:  无
*返回值:                                                                *
*             0 ; 表示SJA1000接口正常
*             1 ; 表示SJA1000与处理器接口不正常
*
*说明:该函数用于检测CAN控制器的接口是否正常
************************************************************************/
bit   CAN_CREATE_COMMUNATION(void)
{
    unsigned char temp_data;
    bit Flag;
    REG_TEST = 0xAA;         //写入测试值
    temp_data = REG_TEST;
    if(temp_data == 0xaa)
    {
       Flag=0;                   //读测试正确
    }
    else
    {
       Flag=1;
    }
    if(!Flag)
    {
       REG_TEST = 0x55;      //写入测试值
       temp_data = REG_TEST;
       if(temp_data == 0x55)
       {
           Flag=0;          //读测试正确
           REG_TEST = 0x00;
       }
       else
       {
           Flag=1;
       }
    }
    return (Flag);
}
/************************************************************************
*函数原型:      bit   CAN_ENTRY_RETMODEL(void)                         *
*参数说明:  无                                                         *
*返回值:                                                               *
*           0 ; 表示成功进入复位工作模式                               *
*           1 ; 表示不能进入复位工作模式                               *
*                                                                      * 
*说明:      CAN控制器进入复位工作模式                                  *
************************************************************************/ 
bit   CAN_ENTRY_RETMODEL(void)
{
     bit flag;
     unsigned char ErrorCount=20;
     unsigned char temp_data = REG_MODE;
     while(ErrorCount --)
     {
          REG_MODE = temp_data|RM_MODE;
          temp_data =  REG_MODE;              
          if( (temp_data & RM_MODE) != 0)
          {
           flag=0;                               
           break;
       }
       else
       {
           flag=1;                             
       }
      }
      return(flag);
}

/************************************************************************
*函数原型:      bit    CAN_QUIT_RETMODEL(void)    
*参数说明:  无                    
*返回值:                    
*           0 ; 表示成功退出复位工作模式    
*           1 ; 表示不能退出复位工作模式                                                                            
*说明:      CAN控制器退出复位工作模式     
***********************************************************************/ 
bit CAN_QUIT_RETMODEL(void)
{
     bit flag;
     unsigned char ErrorCount=20;
     unsigned char temp_data = REG_MODE;
     while(ErrorCount --)
     {
          REG_MODE = temp_data&0xfe;
          temp_data = REG_MODE;              
          if((temp_data&0x01) == 0)
          {
          flag=0;                               
          break;
      }
      else
      {
          flag=1;                             
      }
     }
     return(flag);
}

/*********************************************************************************
**函数原型:  char SJASetBandRateStandard(unsigned char     BandRateSize)
**参数说明:  BandRateSize           标准常用波特率(Kbps)          
**              0             5
**              1             10
**              2             20
**              3             40
**              4             50
**              5             80
**              6             100
**              7             125
**              8             200
**              9             250
**              10              400
**              11              500
**              12              666
**              13              800
**              14              1000           
**返回值:         
**           0                ; 设置总线定时器成功
**           SJA_SETBTR_ERR       ; 设置总线定时器错
**           SJA_NOBTRSIZE        ;波特率不能设为此值
**
**说明:     该函数用于设定在系统晶体为16MHZ时,常用的标准波特率的值。
**          参数BandRateSize只能为0~14,其它的值会返回SJA_NOBTRSIZE错误
**          本函数只能用于复位模式
***************************************************************************************/
unsigned  char  code     SJA_BTR_CODETAB[]={
     0xbf,0xff,                     //;5KBPS的预设值
     0x67,0x2f,                     //;10KBPS的预设值
     0x53,0x2F,                     //;20KBPS的预设值
     0x87,0xFF,                     //;40KBPS的预设值
     0x47,0x2F,                     //;50KBPS的预设值
     0x83,0xFF,                     //;80KBPS的预设值
     0x43,0x2f,                     //;100KBPS的预设值
     0x03,0x1c,                     //;125KBPS的预设值
     0x81,0xfa,                     //;200KBPS的预设值
     0x01,0x1c,                     //;250KBPS的预设值
     0x80,0xfa,                     //;400KBPS的预设值
     0x00,0x1c,                     //;500KBPS的预设值
     0x80,0xb6,                     //;666KBPS的预设值
     0x00,0x16,                     //;800KBPS的预设值
     0x00,0x14                    //;1000KBPS的预设值
};
bit CAN_SET_BANDRATE(unsigned char CAN_ByteRate)
{
    bit ErrorFlag =1;
    unsigned char temp_data;         
    unsigned char ErrorCount = 0x20;              //32次报错
    if(CAN_ByteRate>14)
    {
        ErrorFlag =1;
    }
    else{
        while(--ErrorCount)
        {
             REG_BTR0 = SJA_BTR_CODETAB[CAN_ByteRate*2];
             REG_BTR1 = SJA_BTR_CODETAB[CAN_ByteRate*2+1];
             temp_data = REG_BTR0;
             if(temp_data != SJA_BTR_CODETAB[CAN_ByteRate*2])
             {
                  continue;
             }
             temp_data = REG_BTR1;
             if(temp_data != SJA_BTR_CODETAB[CAN_ByteRate*2+1])
             {
              continue;
             }
             ErrorFlag=0;
             break;
         }//while结束
         
     }
     return  ErrorFlag ;
}

/*************************************************************************
*函数原型:    CAN_SET_OBJECT             
*参数说明:                     
*    CAN_ACR0-3:存放验收代码寄存器(ACR)的参数设置
*    CAN_AMR0-3:存放接收屏蔽寄存器(AMR)的参数设置
*返回值:                    
*           0 ;通信对象设置成功        
*           1 ;通信对象设置失败        
*说明:设置CAN节点的通讯对象,允许接收的报文ID号
*     允许接收的报文,是由AMR和ACR共同决定的.
*    满足以下条件的ID号的报文才可以被接收     
*[(ID.29-ID.0)≡(AC.29-AC.0)]||(AM.29-AM.0)≡11111111     
*    该子程序只能用于复位模式                                                                                                                     *             
*************************************************************************/
bit CAN_SET_OBJECT(unsigned char  CAN_ACR0,unsigned char  CAN_ACR1,
                   unsigned char  CAN_ACR2,unsigned char  CAN_ACR3,
                   unsigned char  CAN_AMR0,unsigned char  CAN_AMR1,
                   unsigned char  CAN_AMR2,unsigned char  CAN_AMR3)
{
     bit ErrorFlag =1;
     unsigned char temp_data;         
     unsigned char ErrorCount = 0x20;              //32次报错
     while(ErrorCount--)
     {
          REG_ACR0 = CAN_ACR0;
          REG_ACR1 = CAN_ACR1;
          REG_ACR2 = CAN_ACR2;
          REG_ACR3 = CAN_ACR3;
          REG_AMR0 = CAN_AMR0;
          REG_AMR1 = CAN_AMR1;
          REG_AMR2 = CAN_AMR2;
          REG_AMR3 = CAN_AMR3;

          temp_data = REG_ACR0; 
          if(temp_data!= CAN_ACR0)       //校验写入值
          {
               continue;
          }
          temp_data = REG_ACR1;
          if(temp_data!= CAN_ACR1)       //校验写入值
          {
           continue;
          }
          temp_data = REG_ACR2;
          if(temp_data != CAN_ACR2)       //校验写入值
          {
           continue;
          }
          temp_data = REG_ACR3;
          if(temp_data != CAN_ACR3)       //校验写入值
          {
          continue;
          }
          temp_data = REG_AMR0;
          if(temp_data != CAN_AMR0)       //校验写入值
          {
            continue;
          }
          temp_data = REG_AMR1;
          if(temp_data != CAN_AMR1)       //校验写入值
          {
        continue;
          }
          temp_data = REG_AMR2;
          if(temp_data != CAN_AMR2)       //校验写入值
          {
        continue;
          }
          temp_data = REG_AMR3;
          if(temp_data != CAN_AMR3)       //校验写入值
          {
                continue;
          }
          ErrorFlag =0;
          break;
     }
     return ErrorFlag;
}

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

4

主题

13

帖子

0

粉丝