?? dsa_com.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 + -