|
这是我的初始化程序,写程序和读程序,两位帮帮看下,正确吗?我烧进去没任何反应,读回来的数据也不对
/**********************************************************************
* 名称 : ADCinit()
* 功能 : AD芯片初始化函数
* 输入 : 无
* 说明 : 对任何寄存器的读或者写之前都必须通过对通信寄存器来实现
当寄存器是16位的时候 ,可以将其分解成为两个8位连续发送
两次,只是要注意发送的连续性,不能间隔时间,而且要注意
发送的顺序必须是高8位在前...............O(∩_∩)O哈哈~
***********************************************************************/
void ADCinit()
{
WriteAdc(0x03);
/*通信寄存器,选择写滤波寄存器*/
WriteAdc(0x80);
WriteAdc(0x04);
/*设置滤波寄存器,CHP=1(使用补偿),SKIP=0(使用FIR),FAST=0(单步方式)*/
WriteAdc(0x02);
/*通信寄存器,选择写方式寄存器*/
WriteAdc(0xb1);
WriteAdc(0xb4);
/*模式寄存器:内部满刻度校准,单极性,0-80mv,24位,5V(VREF)AIN1-AIN2差分输入*/
}
/**********************************************************************
* 名称 : WriteAdc()
* 功能 : 写8位的数据到AD7731
* 输入 : WriteData
* 说明 : 高字节先发送的算法,WriteData&temp,temp的最高位是1(0x80),
在进行与运算之后,如果是0的话,与运算的结果是0;如果是1的话
与运算的结果是1,即程序描述的DIN=0或者DIN=1,得到运算结果之
后送给DIN,即表示把要发送的数字发给了AD7731...O(∩_∩)O哈哈
**********************************************************************/
void WriteAdc(uchar WriteData)
{
uchar i;
uchar temp=0x80;
Cs=0; /*片选信号,选定AD7731*/
for(i=0;i<8;i++) /*循环移位八次*/
{
Sclk=0; /*下降沿*/
if((WriteData&temp)==0x80)/*取出最高位*/
Din=1; /*发送数据,必须是高字节先发送*/
else
Din=0;
Sclk=1; /*先写好数据给时钟*/
WriteData=WriteData<<1;/*向左移一位,把最高位移除*/
}
Cs=1; /*关闭片选信号*/
}
/**********************************************************************
* 名称 : ReadDataAdc()
* 功能 : 从AD7731读取转换后的数据函数
* 输入 : 无
* 说明 : 带返回值
***********************************************************************/
void ReadDataAdc()
{
uchar Data24; /*等价于unsigned long int 长整形数据*/
uchar a; /*数据位数*/
Data24=0x00; /*哈哈,别忘了这是四个字节的*/
Cs=0;
for(a=0;a<8;a++) /*采集的数据为24位数据,循环采集24次*/
{
Sclk=0;
if(Dout==0)
Data24=Data24<<1; /*左移一位。先接收的位移到高处,即最高位 */
if(Dout==1)
{
Data24=Data24<<1;Data24=Data24+0x01; /*加输出数位*/
Sclk=1;
}
if((a==7)|(a==15))
{
Data24=0x00;
}
}
Cs=1;
return(Data24); /*返回数据*/
} |
|