发 帖  
[问答] 求助,用arduino2560连接AD7705做AD转换,返回值全是FF
2016-9-26 17:38:11  3188 arduino ad7705
收藏 0 收藏 推荐 0 推荐
分享
最近在做学校的一个项目,其中要用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));这一句都被我注释了,因为我发现不注释根本不发送数据,可能是卡在了这里。


2016-9-26 17:38:11   评论 邀请回答
6个回答
您好,请问你的这个问题解决了吗
2017-1-12 20:43:27 评论

举报

赞。。。。。。。。。。。。。。。。。。。。。。
2017-1-20 13:31:28 评论

举报

大神,实现了么???急,在线等
2017-3-9 21:54:39 评论

举报

大神,实现了么???急,在线等
2017-3-9 21:54:48 评论

举报

大神,实现了么???急,在线等
2017-3-9 21:54:52 评论

举报

大神,实现了么???急,在线等
2017-3-9 21:54:56 评论

举报

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

836个成员聚集在这个小组

加入小组

创建小组步骤

关闭

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

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

推荐专区

技术干货集中营

专家问答

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

工程师杂谈

项目|工程师创意

招聘|求职}工程师职场

论坛电子赛事

社区活动专版

发烧友活动

-

嵌入式论坛

ARM技术论坛

Linux论坛

单片机/MCU论坛

MSP430技术论坛

FPGA|CPLD|ASIC论坛

STM32/STM8技术论坛

NXP MCU 技术论坛

DSP论坛

嵌入式系统论坛

-

电源技术论坛

电源技术论坛

无线充电技术

-

硬件设计论坛

电路设计论坛

电子元器件论坛

传感技术

总线技术|接口技术

-

测试测量论坛

LabVIEW论坛

Matlab论坛

测试测量技术专区

-

EDA设计论坛

multisim论坛

PCB设计论坛

PADS技术论坛

Protel|AD|DXP论坛

Allegro论坛

proteus论坛|仿真论坛

Orcad论坛

-

综合技术与应用

电机控制

工程资源中心

汽车电子技术论坛

医疗电子论坛

-

开源硬件

-

无线通信论坛

物联网技术

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

-

IC设计论坛

芯片测试与失效分析

Analog/RF IC设计

设计与制造封装测试

-

厂商专区

TI论坛

TI Deyisupport社区

-

检测技术与质量

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

安规知识论坛

检测与认证

-

消费电子论坛

手机技术论坛

平板电脑/mid论坛

音视/视频/机顶盒论坛

-

电子论坛综合区

聚丰众筹官方社区

新人报道区

聚丰供应链

-

论坛服务区

-

高校联盟

西藏民族学院电子设计协会

西安电子科技大学西电实验室

桂林电子科技大学机电工程协会

鉴鹰电子科技协会

广东海洋大学科技创新协会

福建农林大学电子科技创新协会

湖北理工学院电子技术协会

深圳职业技术学院电子精英训练营

浙江科技学院Zuster

湘潭大学电子科技协会

青岛理工大学琴岛学院天宏开发团队

河南理工大学大学生电器开发部

广西科技大学电气信息创新协会

浙江机电职业技术学院电子制作协会

郑州大学西亚斯国际学院爱电工作室

新乡学院电子创新工作室

洛阳理工学院SmartTeam

苏州工业职业技术学院创新工作室

浙江工业大学GC315团队

杭电-微芯大学生科技创新孵化器

西安工业大学电信科协

商洛学院科技创新协会

大连民族学院创新工作室

南京信息工程大学帆木工作室

-

供求信息发布

方案交易

供需广告

芯片求购|供应发布区