[问答] 求助,用arduino2560连接AD7705做AD转换,返回值全是FF

[复制链接]
发表于 2016-9-26 17:38:11   1833 查看 6 回复 显示全部楼层 倒序浏览
分享
最近在做学校的一个项目,其中要用AD7705做两路AD转换,并且将数据上传电脑。
我用的是arduino2560,仿照别人的51的程序写了一个,却发现返回值全是0xFF。
下面附上我的程序,求助各位大神帮我看看问题出在哪?
#define BAUD 9600
#define uchar unsigned char
#define uint unsigned int

#define CS 22
#define SCLK 23//串行时钟输入线
#define DIN 24//DATA_IN
#define DOUT 25//DATA_OUT
#define DRDY 26//采用监控DRDY输出线方式

#define _nop_() do { __asm__ __volatile__ ("nop"); } while (0)

uchar Data_MSB,Data_LSB;
uint AD_result,T_voltage;

void RegisterInitUart(){
  //bitSet(UCSR0A,U2X0);
  bitSet(UCSR0B,RXCIE0);                    //允许接收完成中断//
  bitSet(UCSR0B,RXEN0);                     //开启接收功能//
  bitSet(UCSR0B,TXEN0);                     //开启发送功能//
  bitSet(UCSR0C,UCSZ01);
  bitSet(UCSR0C,UCSZ00);                    //
  UBRR0=(F_CPU/16/BAUD-1);                  //波特率小于9600
}

void setup(){
  // put your setup code here, to run once:
  RegisterInitUart();
  pinMode(CS,OUTPUT);
  pinMode(SCLK,OUTPUT);
  pinMode(DOUT,OUTPUT);
  pinMode(DIN,INPUT);
  pinMode(DRDY,INPUT);
}

void AD7705_write_Reg(uchar data_byte)
{
        uchar i;
        digitalWrite(CS,LOW);
        digitalWrite(SCLK,HIGH);
        _nop_();
        _nop_();
        _nop_();
        for(i=0;i<8;i++){
                        digitalWrite(SCLK,LOW);
                        _nop_();
                        if(data_byte & 0x80 != 0) digitalWrite(DOUT,HIGH);
                        else digitalWrite(DOUT,LOW);
                        _nop_();
                        _nop_();
                        digitalWrite(SCLK,HIGH);
                        data_byte <<= 1;
                        _nop_();
                        _nop_();
                        _nop_();
                }
        digitalWrite(CS,HIGH);
        digitalWrite(DOUT,HIGH);               
}

uchar AD7705_read_Reg()
{
        uchar i;
        uchar DATA_OUT;
        //while(digitalRead(DRDY));//等待完成数据的更新
        digitalWrite(CS,HIGH);
        digitalWrite(SCLK,HIGH);
        _nop_();
        _nop_();
        digitalWrite(CS,LOW);
        _nop_();
        _nop_();
        digitalWrite(DIN,HIGH);//P3=0xff;//读数据之前,对P3口进行写1操作
        digitalWrite(DOUT,HIGH);/*读数据*/
        for(i=0;i<8;i++)
                {
                        DATA_OUT<<=1;
                        digitalWrite(SCLK,LOW);
                        _nop_();
                        DATA_OUT=DATA_OUT|(uchar)digitalRead(DIN);
                        _nop_();
                        _nop_();
                        digitalWrite(SCLK,HIGH);
                        _nop_();
                        _nop_();
                }
        digitalWrite(CS,HIGH);
        _nop_();
        //digitalWrite(DRDY,HIGH);
        return (DATA_OUT);
}

void AD7705_read_result()
{
        AD7705_write_Reg(0x38);//通信寄存器中,设置为读数据寄存器
        /*数据寄存器为16位的只读寄存器,其包含了来自AD7705的最新转换结果*/
        Data_MSB=AD7705_read_Reg();//读出高8位数据
        Data_LSB=AD7705_read_Reg();//读出低8位数据
        AD_result=(uint)Data_MSB;
        AD_result<<=8;
        AD_result=AD_result | (uint)Data_LSB;//位转换为数
        /*转换为电压*/
        //T_voltage=AD_result*50000/65536;
}

void AD7705_init()//根据具体情况,初始化AD7705
{
        AD7705_write_Reg(0x20);//写入通信寄存器;设置为写时钟寄存器
        /*时钟寄存器设置*/
        AD7705_write_Reg(0x0C);//MCLKIN引脚处的时钟频率在被AD7705使用前,进行2分频;20HZ输出更新率,即每50ms输出一个新字
        AD7705_write_Reg(0x10);//写入通信寄存器,设置为写设置寄存器
        /*设置寄存器设置*/
        AD7705_write_Reg(0x44);//自校准、增益为1、单极性模拟输入、片内缓冲器短路,FSYNC清0
}

void loop() {
  // put your main code here, to run repeatedly:
  delay(1000);
  AD7705_init();
  while(1){
    //选择通道1
    AD7705_write_Reg(0x10);
    //AD7705_write_Reg(0x44);//通道初始化
    delay(50);//等待完成数据更新
    //while(digitalRead(DRDY));//检测DRDY输出线引脚是否为低
    AD7705_read_result();
    UDR0 = Data_MSB;
    delay(50);
    UDR0 = Data_LSB;
    delay(50);
    /*
    //选择通道2
    AD7705_write_Reg(0x11);
    AD7705_write_Reg(0x44);//通道初始化
    delay(50);//等待完成数据更新
    //while(digitalRead(DRDY));//检测DRDY输出线引脚是否为低
    AD7705_read_result();
    UDR0 = Data_MSB;
    delay(50);
    UDR0 = Data_LSB;
    */
    delay(3000);
  }
}  
while(digitalRead(DRDY));这一句都被我注释了,因为我发现不注释根本不发送数据,可能是卡在了这里。


标签:arduino ad7705

等待验证会员

发表于 2017-1-12 20:43:27  
您好,请问你的这个问题解决了吗
回复

点赞 举报

技术员

发表于 2017-1-20 13:31:28  

PCB在线计价下单

板子大小:

cm
X
cm

层数:

2

板子数量:

10

厚度:

1.6
赞。。。。。。。。。。。。。。。。。。。。。。
回复

举报

实习生

发表于 2017-3-9 21:54:39  
大神,实现了么???急,在线等
回复

点赞 举报

实习生

发表于 2017-3-9 21:54:48  
大神,实现了么???急,在线等
回复

点赞 举报

实习生

发表于 2017-3-9 21:54:52  
大神,实现了么???急,在线等
回复

点赞 举报

实习生

发表于 2017-3-9 21:54:56  
大神,实现了么???急,在线等
回复

点赞 举报

只有小组成员才能发言,加入小组>>

99个成员聚集在这个小组

加入小组

创建小组步骤

关闭

站长推荐 上一条 /9 下一条

快速回复 返回顶部 返回列表
-

推荐专区

技术干货集中营

专家问答

用户帮助┃咨询与建议┃版主议事

工程师杂谈

工程师创意

工程师职场

论坛电子赛事

社区活动专版

发烧友活动

-

嵌入式论坛

ARM技术论坛

Android论坛

Linux论坛

单片机/MCU论坛

FPGA|CPLD|ASIC论坛

DSP论坛

嵌入式系统论坛

-

电源技术论坛

电源技术论坛

无线充电技术

-

硬件设计论坛

PCB设计论坛

电路设计论坛

电子元器件论坛

控制|传感

总线技术|接口技术

-

测试测量论坛

LabVIEW论坛

Matlab论坛

测试测量技术专区

仪器仪表技术专区

-

EDA设计论坛

multisim论坛

PADS技术论坛

Protel|AD|DXP论坛

Allegro论坛

proteus论坛|仿真论坛

EasyEDA-中国人自已的EDA工具

Orcad论坛

-

综合技术与应用

电机控制

智能电网

光电及显示

参考设计中心

汽车电子技术论坛

医疗电子论坛

-

开源硬件

-

无线通信论坛

无线通信技术专区

天线|RF射频|微波|雷达技术

-

IC设计论坛

芯片测试与失效分析

Mixed Signal/SOC[数模混合芯片设计]

Analog/RF IC设计

设计与制造封装测试

-

厂商专区

TI论坛

TI Deyisupport社区

-

检测技术与质量

电磁兼容(EMC)设计与整改

安规知识论坛

检测与认证

-

消费电子论坛

手机技术论坛

平板电脑/mid论坛

音视/视频/机顶盒论坛

-

电子论坛综合区

聚丰众筹官方社区

新人报道区

聚丰供应链

-

论坛服务区

-

供求信息发布

供需广告

招聘┃求职发布区

电子展览展会专区