📄 ad9510.c
字号:
#include<aduc841.h>
#include "MacroDef.h"
sbit AD9510_CSB = P3^3;
sbit AD9510_DATA = P3^4 ;
sbit AD9510_CLK = P3^5 ;
static unsigned char ucInstrWord[2];//AD9510读写控制字
static unsigned char ucData[4];//保存所发数据
/**********************************************************************
* 函数名称: SetADRegister
* 功能描述: 设置寄存器
* 访问的表:
* 修改的表:
* 输入参数:
* 输出参数:
* 返回值 :
* 其它说明:
* 修改日期 版本号 修改人 修改内容
* -----------------------------------------------
* 2006/04/04 V1.0
***********************************************************************/
void SetADRegister(unsigned int uiAddr,unsigned long ulData,unsigned int length)
{
SetRWCtrlWord(uiAddr,length,AD9510_WRITE);//设置AD9510读写控制字
SetTrsfData(ulData); //设置AD9510发送的数据
SendAD9510Command(ucInstrWord,2); //发送控制字
SendAD9510Command(ucData,length); //发送数据
//将数据从缓冲区写入实际的寄存器中,向5A<0>写1
ucInstrWord[0] = 0x5A;
ucInstrWord[1] = 0x00;
SendAD9510Command(ucInstrWord,2); //发送控制字
ucData[0] = 0x01;
SendAD9510Command(ucData,1); // 向5A<0>写1
}
/**********************************************************************
* 函数名称: ReadADRegister
* 功能描述: 设置寄存器
* 访问的表:
* 修改的表:
* 输入参数:
* 输出参数:
* 返回值 :
* 其它说明:
* 修改日期 版本号 修改人 修改内容
* -----------------------------------------------
* 2006/04/04 V1.0
***********************************************************************/
unsigned long ReadADRegister(unsigned int uiAddr,unsigned int length)
{
unsigned long ReturnValue;
int i;
for(i=0;i<4;i++)
{
ucData[i] = 0x00;
}
SetRWCtrlWord(uiAddr,length,AD9510_READ);//设置AD9510读写控制字
SendAD9510Command(ucInstrWord,2); //发送控制字
ReadAD9510Command(length); //读数据
ReturnValue = (unsigned long)ucData[3];
ReturnValue = (ReturnValue << 8) | ucData[2];
ReturnValue = (ReturnValue << 8) | ucData[1];
ReturnValue = (ReturnValue << 8) | ucData[0];
return ReturnValue;
}
/**********************************************************************
* 函数名称: SetRWCtrlWord
* 功能描述: 设置AD9510读写控制字
* 访问的表:
* 修改的表:
* 输入参数:
* 输出参数:
* 返回值 :
* 其它说明:
* 修改日期 版本号 修改人 修改内容
* -----------------------------------------------
* 2006/04/04 V1.0
***********************************************************************/
void SetRWCtrlWord(unsigned int uiAddr,unsigned int length,unsigned int ucRWFlag)
{
unsigned char tmp;
//AD9510读写控制字初始化为0
ucInstrWord[0] = 0x00;
ucInstrWord[1] = 0x00;
//根据读写标志设置最高位,读:I15 = 1 ,写:I15 = 0
if(ucRWFlag == AD9510_WRITE )
{
ucInstrWord[1] &= 0x7F;
}
else
{
ucInstrWord[1] |= 0x80;
}
//根据数据长度设置I14和I13
switch(length)
{
case 1:
//长度为1
ucInstrWord[1] &= 0x9F;
break;
case 2:
//长度为2
ucInstrWord[1] &= 0xBF;
ucInstrWord[1] |= 0x20;
break;
case 3:
//长度为3
ucInstrWord[1] &= 0xDF;
ucInstrWord[1] |= 0x40;
break;
case 4:
//长度为4
ucInstrWord[1] |= 0x60;
break;
default:
break;
}
//根据地址设置I12-I0
ucInstrWord[0] = uiAddr & 0xFF;//设置地址低8位
tmp = (uiAddr >> 8) & 0x1F;
ucInstrWord[1] |= tmp; //设置地址高5位
}
/**********************************************************************
* 函数名称: SetTrsfData
* 功能描述: 设置AD9510发送的数据
* 访问的表:
* 修改的表:
* 输入参数:
* 输出参数:
* 返回值 :
* 其它说明:
* 修改日期 版本号 修改人 修改内容
* -----------------------------------------------
* 2006/04/04 V1.0
***********************************************************************/
void SetTrsfData(unsigned long ulData)
{
//设置发送数据
ucData[0] = (unsigned char)(ulData & 0xFF);
ucData[1] = (unsigned char)((ulData >> 8) & 0xFF);
ucData[2] = (unsigned char)((ulData >> 16) & 0xFF);
ucData[3] = (unsigned char)((ulData >> 24) & 0xFF);
}
/**********************************************************************
* 函数名称: SendAD9510Command
* 功能描述: 发送AD9510寄存器的函数
* 访问的表:
* 修改的表:
* 输入参数:
* 输出参数:
* 返回值 : void
* 其它说明:
* 修改日期 版本号 修改人 修改内容
* -----------------------------------------------
* 2006/04/04 V1.0
***********************************************************************/
void SendAD9510Command(unsigned char byteNumber[4],int byteSelect)
{
int i,j;
for (j=byteSelect-1;j>=0;j--)
{
AD9510_CSB = 0;
for (i=7;i>=0;i--)
{
AD9510_CLK = 0;
switch (i)
{
case 0:
if((byteNumber[j]&0x01) == 0x01)
AD9510_DATA = 1;
else
AD9510_DATA = 0;
break;
case 1:
if((byteNumber[j]&0x02) == 0x02)
AD9510_DATA = 1;
else
AD9510_DATA = 0;
break;
case 2:
if((byteNumber[j]&0x04) == 0x04)
AD9510_DATA = 1;
else
AD9510_DATA = 0;
break;
case 3:
if((byteNumber[j]&0x08) == 0x08)
AD9510_DATA = 1;
else
AD9510_DATA = 0;
break;
case 4:
if((byteNumber[j]&0x10) == 0x10)
AD9510_DATA = 1;
else
AD9510_DATA = 0;
break;
case 5:
if((byteNumber[j]&0x20) == 0x20)
AD9510_DATA = 1;
else
AD9510_DATA = 0;
break;
case 6:
if((byteNumber[j]&0x40) == 0x40)
AD9510_DATA = 1;
else
AD9510_DATA = 0;
break;
case 7:
if((byteNumber[j]&0x80) == 0x80)
AD9510_DATA = 1;
else
AD9510_DATA = 0;
break;
default:
break;
}
AD9510_CLK = 1;
}
AD9510_CSB = 1;
}
}
/**********************************************************************
* 函数名称: ReadAD9510Command
* 功能描述: 读取AD9510寄存器数据的函数
* 访问的表:
* 修改的表:
* 输入参数:
* 输出参数:
* 返回值 :
* 其它说明:
* 修改日期 版本号 修改人 修改内容
* -----------------------------------------------
* 2006/04/04 V1.0
***********************************************************************/
void ReadAD9510Command(int byteSelect)
{
int i,j;
int tmp;
for (j=byteSelect-1;j>=0;j--)
{
AD9510_CSB = 0;
for (i=7;i>=0;i--)
{
AD9510_CLK = 1;
tmp = AD9510_DATA;
if(1 == tmp)
{
ucData[j] |= 0x01;
ucData[j] <<= 1;
}
else
{
ucData[j] &= 0xFE;
ucData[j] <<= 1;
}
AD9510_CLK = 0;
}
AD9510_CSB = 1;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -