完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
扫一扫,分享给好友
最近在做学校的一个项目,其中要用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));这一句都被我注释了,因为我发现不注释根本不发送数据,可能是卡在了这里。 |
|
相关推荐
6个回答
|
|
您好,请问你的这个问题解决了吗
|
|
|
|
赞。。。。。。。。。。。。。。。。。。。。。。
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
只有小组成员才能发言,加入小组>>
WIO Terminal +MCP2515 实现车辆OBD的速度监控
10405 浏览 0 评论
60659 浏览 77 评论
5991 浏览 3 评论
一块扩展板完成Arduino的10类37项实验(代码+图形+仿真)
36515 浏览 219 评论
10053 浏览 0 评论
518浏览 1评论
请教:esp32中用u8g2显示shtc3传感器数据到i2c液晶屏,显示不稳定的问题
1295浏览 1评论
1436浏览 1评论
640浏览 0评论
561浏览 0评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-19 03:32 , Processed in 0.995017 second(s), Total 88, Slave 72 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191