⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dsa_com.c

📁 DSA通讯的一个代码
💻 C
字号:
/*C**************************************************************************
* NAME:         dsa_com.c
*----------------------------------------------------------------------------
* Copyright (c) 2005 zhuqiao.
*----------------------------------------------------------------------------
* RELEASE:      a2368_dsa      
* REVISION:     1.0     
*----------------------------------------------------------------------------
* PURPOSE:
* This is the  software for A2368+DSA
*****************************************************************************/

#include <complier.h>
#include <global.h>
#include <dsa.h>
static  uchar check_count;
static void dsa_init();
static void Wr_data(Word);     //写字节
static Word Rd_data();     //读字节 有返回值

void dsa_init()
 {
  Stb=1; 
  S_data=1;
  Ack=1; 
   }

//---------------------------------------------------------//
/*F**************************************************************************
* NAME: Wr_command
*----------------------------------------------------------------------------
* PARAMS:
*
* return:
*----------------------------------------------------------------------------
* PURPOSE: 
*   write command routine 
*----------------------------------------------------------------------------
* EXAMPLE:
*----------------------------------------------------------------------------
* NOTE:   if first fail, try again only one times 
*----------------------------------------------------------------------------
* REQUIREMENTS:
*****************************************************************************/

void Wr_command(uchar wdsa_c,uchar wdsa_d)  //写命令
  {  
    uchar i;
    Send_ok=0;
    for(i=0 ; i<2 ; i++)   //发2次
     {
      Word j; 
      Time_out=0;
      dsa_init();
      S_data=0;
      if(Send_ok==0)
        {
         for(j=0;j <=6000;j++)   //如果应答不为0,未握手
          {  
           if(Ack==0) break;   //如果应答0,握手OK
           if(j==6000)return;  //超时退出
          }
         S_data=1;
         for(j=0;j <= 300;j++)   //如果应答不为1,握手未完成
          {  
           if(Ack==1) break;  //如果应答1,握手完成
           if(j==300)return;
          }
      Wr_data(( (Word)wdsa_c <<8 ) | wdsa_d); //合并为16位
      if(Time_out==1) break;  //超时退出
      dsa_init();
      Ack=0;      
      for(j=0;j <= 300;j++)  
        {  
          if(Stb==0) break;  //如果选通0,应答成功
          if(j==300)return;
        }
      dsa_init();
      Send_ok=1;            //发送成功            
     }       
    if(Send_ok==1) break;
   }
 }

/*F**************************************************************************
* NAME: Wr_data
*----------------------------------------------------------------------------
* PARAMS:
*
* return:
*----------------------------------------------------------------------------
* PURPOSE: 
*   send word data to servo routine 
*----------------------------------------------------------------------------
* EXAMPLE:
*----------------------------------------------------------------------------
* NOTE:
*----------------------------------------------------------------------------
* REQUIREMENTS:
*****************************************************************************/

void Wr_data(Word w_data)   //写字节
  {
   uchar i;
   Word j;
   Time_out=0;
   dsa_init();
   for(i=0;i<16;i++)
    {      
     if(w_data & 0x8000)   //!!!16位,不能用0x80
     S_data=1;
     else S_data=0;     
     w_data<<=1;
     Stb=0;
     for(j=0;j <= 300;j++)   //如果应答不为零,未读数
        {  
          if(Ack==0) break;  
          if(j==300)
            {
             Time_out=1;
             return;    //超时退出
            }
        }
     Stb=1;
     for(j=0;j <= 300;j++)   //如果应答不为1,读数未完成
        {  
          if(Ack==1) break;  
          if(j==300) 
           {
             Time_out=1;
             return;    //超时退出
            }
        }
     
     }
  }

//-----------------------------------------------------------//
//---------------------------------------------------------//
/*F**************************************************************************
* NAME: Rd_command
*----------------------------------------------------------------------------
* PARAMS:
*
* return:
*----------------------------------------------------------------------------
* PURPOSE: 
*   read dsa command routine 
*----------------------------------------------------------------------------
* EXAMPLE:
*----------------------------------------------------------------------------
* NOTE:
*----------------------------------------------------------------------------
* REQUIREMENTS:
*****************************************************************************/

void Rd_command()  //读命令
{    
   Word  j;
   uchar i; 
   Word tem_data; 
   Read_ok=0;
   check_count=0;
   dsa_init();
  for(i=0;i<1;i++)
   {
     if((Ack==0) | (Stb==0 )) break;
     for(j=0;j <=300;j++)        //如果不为0,未握手,不能太长
        {  
         if(S_data==0) break;     //如果应答0,握手OK
         if(j==300)return;
        }
    Ack=0;                       //应答0
    for(j=0;j <= 300;j++)        //如果应答不为1,握手未完成
         {  
           if(S_data==1) break;  //如果应答1,握手完成
           if(j==300) return;
         }
     Ack=1;     
     tem_data = Rd_data();
     dsa_com = tem_data >> 8;
     dsa_data= tem_data & 0xff;  
     if(Time_out==1)return;  //只读一次,所以超时退出
     dsa_init();      
     for(j=0;j <= 300;j++)  
        {  
          if(Ack==0) break;  //如果选通0,应答成功
          if(j==300)return;   
        }
     if(check_count==16) S_data=1;
     else S_data=0;
       Stb=0;
     for(j=0;j <= 300;j++)  //如果选通为0,数据校验
        {  
          if(Ack==1) break;  //如果选通1,应答成功
          if(j==300) return;   //超时退出
        }
     dsa_init();
     Read_ok=1;   //读数成功
    }

 }


/*F**************************************************************************
* NAME: Rd_data
*----------------------------------------------------------------------------
* PARAMS:
*
* return: word r_data
*----------------------------------------------------------------------------
* PURPOSE: 
*   read word data from servo routine 
*----------------------------------------------------------------------------
* EXAMPLE:
*----------------------------------------------------------------------------
* NOTE:
*----------------------------------------------------------------------------
* REQUIREMENTS:
*****************************************************************************/

//-------------------------------------------------//
Word Rd_data()    //读字节
 {
   uchar i;
   Word r_data;
   Time_out=0;   
  for(i=0;i<16;i++)
   {
     Word j;
     for(j=0;j <= 300;j++)  //如果选通不为0,数据无效
      {  
       if(Stb==0) break;  //如果选通0,数据有效
       if(j==300) Time_out=1;
      }
     if(Time_out==1) break;  //超时退出stb
     r_data <<=1;  
     if(S_data==1) r_data |= 0x01;  //读数据
     check_count++;
     Ack=0;  //应答
     for(j=0;j <= 300;j++)  
      {  
       if(Stb==1) break;  //如果选通1,应答成功
       if(j==300) Time_out=1;
      }
     if(Time_out==1) break;  //超时退出stb   
     Ack=1;  //应答
    // if(i==7) dsa_com = r_data & 0xff;   //  n 种方法
    // if(i==15) dsa_data = r_data & 0xff;     
    }   
    // dsa_com = r_data>>8;    //n 种方法
    // dsa_data = r_data & 0xff;
   return(r_data);
  }




⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -