OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 23973|回复: 27

STM32 SPI操作AD7705的问题!已解决!

[复制链接]

17

主题

80

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
446
金钱
446
注册时间
2012-9-15
在线时间
33 小时
发表于 2013-5-25 13:52:21 | 显示全部楼层 |阅读模式

问题解决了!
在AD7705 Dout端接个22pf的电容终于OK
我也不知道为什么,就行了
OK~\(≧▽≦)/~啦啦啦


情况是这样的!此程序在51上模拟spi是可以的!移植过来时在第一块AD7705上测试是通过的!但后来烧了这块AD7705后!重新上一块AD7705后就读数出问题了!新的AD7705在51上测试是没问题的!
真的是不知道哪里出问题了!读出的数据论七八糟的!
都搞了了几天了!快疯了…………
真心求助!懂的伸个援助之手!小弟不胜感激…………


#include "spi.h"

/* 复用功能 SPI1_REMAP = 0 
SPI1_NSS PA4   CS
SPI1_SCK   PA5 CLK
SPI1_MISO   PA6   DOUT
SPI1_MOSI   PA7   DIN
PA8 DRDY */ 

#define CS_ADC_LOW()    GPIO_ResetBits(GPIOA,GPIO_Pin_4) /*片选*/
#define CS_ADC_HIGH()   GPIO_SetBits(GPIOA,GPIO_Pin_4)

SPI_InitTypeDef  SPI_InitStructure;

void SPIx_Init(void)
{

GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA|RCC_APB2Periph_SPI1|RCC_APB2Periph_AFIO, ENABLE );
  
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;// AdDrdy
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU ;//PC8配置成上拉输入
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
  GPIO_SetBits(GPIOA,GPIO_Pin_8);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_3 | GPIO_Pin_4;//SPI CS DAC8554  AD7705
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;//推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
  GPIO_SetBits(GPIOA,GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_3 | GPIO_Pin_4);


GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP ;  //复用推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);

SPI_Cmd(SPI1, DISABLE); //失能能SPI外设
SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;  //设置SPI单向或者双向的数据模式:SPI设置为双线双向全双工
SPI_InitStructure.SPI_Mode = SPI_Mode_Master; //设置SPI工作模式:设置为主SPI
SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b; //设置SPI的数据大小:SPI发送接收8位帧结构
SPI_InitStructure.SPI_CPOL = SPI_CPOL_High; //选择了串行时钟的稳态:时钟悬空高
SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge; //数据捕获于第二个时钟
SPI_InitStructure.SPI_NSS = SPI_NSS_Soft; //NSS信号由硬件(NSS管脚)还是软件(使用SSI位)管理:内部NSS信号有SSI位控制
  SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_256; //定义波特率预分频的值:波特率预分频值为256
SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB; //指定数据传输从MSB位还是LSB位开始:数据传输从MSB位开始
SPI_InitStructure.SPI_CRCPolynomial = 7; //CRC值计算的多项式
SPI_Init(SPI1, &SPI_InitStructure);  //根据SPI_InitStruct中指定的参数初始化外设SPIx寄存器
  
SPI_Cmd(SPI1, ENABLE); //使能SPI外设
CS_ADC_LOW();
SPIx_ReadWriteByte(0xff);//启动传输  
CS_ADC_HIGH();
}   

//SPIx 读写一个字节
//TxData:要写入的字节
//返回值:读取到的字节
u8 SPIx_ReadWriteByte(u8 TxData)
{
u8 retry=0;  
 
while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET) //检查指定的SPI标志位设置与否:发送缓存空标志位
{
retry++;
if(retry>200)return 0;
}  
 
SPI_I2S_SendData(SPI1, TxData); //通过外设SPIx发送一个数据
retry=0;
 
while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) == RESET); //检查指定的SPI标志位设置与否:接受缓存非空标志位
{
retry++;
if(retry>200)return 0;
}      
 
return SPI_I2S_ReceiveData(SPI1); //返回通过SPIx最近接收的数据    
}

//写数据
void AD7705_WriteByte(u8 Dst_Addr)   
{   
    CS_ADC_LOW();//使能器件  
delay_us(20);
SPIx_ReadWriteByte(Dst_Addr);
  delay_us(100);
  CS_ADC_HIGH();//使能器件  
}



/********AD7705初始化函数***********/

void Init_AD7705(u8 chnanel) 
{
    u8 i;
    for(i=0;i<100;i++)/* 多于连续32个 DIN=1 使串口复位 */ 
    {
AD7705_WriteByte(0xff);//持续DIN高电平写操作,恢复AD7705接口
}  
delay_ms(1);
switch(chnanel)
{
case 1: 
AD7705_WriteByte(0x20); /* 写通讯寄存器选中ch1*/ 
AD7705_WriteByte(0x04); /* 1MHz时钟,200Hz数据更新速率 */ 
AD7705_WriteByte(0x10); /*选择设置寄存器,使用chnanel 1*/
AD7705_WriteByte(0x44); //写设置寄存器 ,设置成单极性、无缓冲、增益为1、滤波器工作、自校准
break;
case 2: 
AD7705_WriteByte(0x21); /* 写通讯寄存器选中ch2 */ 
AD7705_WriteByte(0x04); /* 1MHz时钟,200Hz数据更新速率 */ 
AD7705_WriteByte(0x11); /*选择设置寄存器,使用chnane 2*/
AD7705_WriteByte(0x44); //写设置寄存器,设置成单极性、无缓冲、增益为1、滤波器工作、自校准
break;
default:
break;
}

/* 读AD7705转换数据 输入通道channel */ 
u16 GetData7705_CH1(void) 
{
    u16 temp1 = 0;
u16 DataL = 0;
    u16 DataH = 0;
Init_AD7705(1); //初始化通道1
delay_ms(1);
AD7705_WriteByte(0x38);   //选中CH1数据寄存器读  
    while(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_8)==1);  //待数据准备好AdDrdy=0  
CS_ADC_LOW(); //使能器件  
delay_us(20);
DataH = SPIx_ReadWriteByte(0xff);
DataL = SPIx_ReadWriteByte(0xff); 
delay_us(200);
    CS_ADC_HIGH();   //取消片选
DataH = DataH << 8; 
    temp1  =  DataH | DataL; 

    return temp1; 
}

/* 读AD7705转换数据 输入通道channel */ 
u16 GetData7705_CH2(void) 
{
    u16 temp2 = 0;
u16 DataL = 0;
    u16 DataH = 0;
  Init_AD7705(2); //初始化通道2
delay_ms(1);
AD7705_WriteByte(0x39);   //选中CH2数据寄存器读  
    while(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_8)==1);  //待数据准备好AdDrdy=0  
CS_ADC_LOW(); //使能器件  
delay_us(20);
DataH = SPIx_ReadWriteByte(0xff);
DataL = SPIx_ReadWriteByte(0xff); 
delay_us(100);
    CS_ADC_HIGH();   //取消片选
DataH = DataH << 8; 
    temp2  =  DataH | DataL; 

    return temp2; 
}

//数据处理
void ADC_7705(void)
{          
u8 num1[]={"0000.0mV"};
u8 num2[]={"0000.0mV"};

u16 RCH1_16bit,RCH2_16bit;
u32 l_ncm1,l_ncm2;
RCH1_16bit = GetData7705_CH1();
l_ncm1 = (u32)(RCH1_16bit*(2500.0/65535)); //算出通道1电压
  RCH2_16bit = GetData7705_CH2();
l_ncm2 = (u32)(RCH2_16bit*(2500.0/65535)); //算出通道2电压
num1[0] = l_ncm1/10000+'0';
num1[1] = (l_ncm1%10000)/1000+'0';
num1[2] = (l_ncm1%1000)/100+'0';
num1[3] = (l_ncm1%100)/10+'0';
num1[5] = l_ncm1%10+'0';
num2[0] = l_ncm2/10000+'0';
num2[1] = (l_ncm2%10000)/1000+'0';
num2[2] = (l_ncm2%1000)/100+'0';
num2[3] = (l_ncm2%100)/10+'0';
num2[5] = l_ncm2%10+'0';
LCD_ShowString(140,40,num1);
LCD_ShowString(140,60,num2);
}

AD7705.PNG
生活无需多虑
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

27

主题

774

帖子

2

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1473
金钱
1473
注册时间
2013-4-12
在线时间
77 小时
发表于 2013-5-25 16:22:58 | 显示全部楼层
AD7705好像要比ADS1232贵好多哦,ADS1232     24bit         LZ有没有考虑换芯片?
简单是多么的快乐,而快乐就因你而简单!微芯动力LTKKS
回复 支持 反对

使用道具 举报

4

主题

38

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
250
金钱
250
注册时间
2011-3-22
在线时间
68 小时
发表于 2013-5-29 17:14:41 | 显示全部楼层
mark
回复 支持 反对

使用道具 举报

38

主题

182

帖子

0

精华

高级会员

Rank: 4

积分
584
金钱
584
注册时间
2011-6-3
在线时间
29 小时
发表于 2013-10-16 21:06:17 | 显示全部楼层
回复【楼主位】icifan:
---------------------------------
与STM32的硬件SPI相连,用做电平转换吗?
我的淘宝小店  http://shop70226598.taobao.com
回复 支持 反对

使用道具 举报

17

主题

80

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
446
金钱
446
注册时间
2012-9-15
在线时间
33 小时
 楼主| 发表于 2013-10-16 23:02:37 | 显示全部楼层
回复【4楼】kangxuebin:
---------------------------------
不用的
生活无需多虑
回复 支持 反对

使用道具 举报

19

主题

90

帖子

1

精华

高级会员

Rank: 4

积分
543
金钱
543
注册时间
2012-5-13
在线时间
40 小时
发表于 2014-8-11 20:47:56 | 显示全部楼层
你的问题解决了吗?我的情况和你的一样。51的行STM32的不行。
回复 支持 反对

使用道具 举报

27

主题

259

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
387
金钱
387
注册时间
2014-8-19
在线时间
0 小时
发表于 2014-10-8 23:13:02 | 显示全部楼层
回复【5楼】icifan:
---------------------------------
在吗?
回复 支持 反对

使用道具 举报

27

主题

259

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
387
金钱
387
注册时间
2014-8-19
在线时间
0 小时
发表于 2014-10-8 23:13:39 | 显示全部楼层
回复【6楼】蓝色天使211:
---------------------------------
你也是AD7705?这片子多钱?转换速度有多少?
回复 支持 反对

使用道具 举报

19

主题

90

帖子

1

精华

高级会员

Rank: 4

积分
543
金钱
543
注册时间
2012-5-13
在线时间
40 小时
发表于 2014-10-14 10:38:58 | 显示全部楼层
回复【8楼】dongbaohui:
---------------------------------
这个片子现在也就是十二三快的样子。速度比较慢属于低速的AD一秒在16位精度的情况下几十次输出速度。随后我把中文数据手册给你。
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
24
金钱
24
注册时间
2014-5-12
在线时间
1 小时
发表于 2014-11-17 10:52:00 | 显示全部楼层
回复【9楼】蓝色天使211:
---------------------------------
想简单请教AD7705几个问题可以么,私聊加个好友,谢谢啊
回复 支持 反对

使用道具 举报

19

主题

90

帖子

1

精华

高级会员

Rank: 4

积分
543
金钱
543
注册时间
2012-5-13
在线时间
40 小时
发表于 2014-11-26 08:03:42 | 显示全部楼层
回复【10楼】久黎:
---------------------------------
   你的QQ多少?
回复 支持 反对

使用道具 举报

19

主题

65

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
440
金钱
440
注册时间
2015-2-12
在线时间
40 小时
发表于 2015-2-12 16:14:00 | 显示全部楼层
楼主  您这段代码里面都没有main(),,能编译通过吗?
我现在在做STM32与AD7705的SPI通讯,卡在了AD7705没有数据输出,请问楼主能把您的源程序分享一下吗
从不脑残粉,也不跟风黑。
回复 支持 反对

使用道具 举报

0

主题

2

帖子

0

精华

新手入门

积分
22
金钱
22
注册时间
2014-5-11
在线时间
0 小时
发表于 2015-3-13 20:32:19 | 显示全部楼层
可以说下具体怎么解决吗,我的也是读数据都是0XFFFF,咋回事啊
回复 支持 反对

使用道具 举报

8

主题

42

帖子

0

精华

初级会员

Rank: 2

积分
161
金钱
161
注册时间
2014-1-7
在线时间
24 小时
发表于 2015-3-13 22:23:11 | 显示全部楼层
回复【9楼】蓝色天使211:
---------------------------------
AD7705可以设置高速200次/秒吧?
回复 支持 反对

使用道具 举报

0

主题

2

帖子

0

精华

新手入门

积分
22
金钱
22
注册时间
2014-5-11
在线时间
0 小时
发表于 2015-3-14 20:29:30 | 显示全部楼层
就是不出数据啊,怎么解决啊?跪求啊,大侠。。。。。
回复 支持 反对

使用道具 举报

9

主题

31

帖子

0

精华

初级会员

Rank: 2

积分
170
金钱
170
注册时间
2014-11-16
在线时间
32 小时
发表于 2016-3-3 11:32:28 | 显示全部楼层
楼主用的多大的晶振啊,我用3.6864的调不出来
回复 支持 反对

使用道具 举报

4

主题

29

帖子

0

精华

初级会员

Rank: 2

积分
156
金钱
156
注册时间
2015-9-20
在线时间
21 小时
发表于 2016-5-23 09:31:39 | 显示全部楼层
请问,ad7705,我用的外部晶振是4.9152Mhz的,但是根据数据手册,DRDY信号每个周期中间是500XtCLKIN,这样计算出来每次采集的时间将近是100ms,再加上其他的延迟,总体我的程序是150ms左右的延迟,是不是哪里有问题啊,我发现我那个等待DRDY信号的时间很长,请问能帮忙解释一下么,谢谢哈
回复 支持 反对

使用道具 举报

17

主题

80

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
446
金钱
446
注册时间
2012-9-15
在线时间
33 小时
 楼主| 发表于 2016-5-23 13:33:38 | 显示全部楼层
Jason_02 发表于 2016-5-23 09:31
请问,ad7705,我用的外部晶振是4.9152Mhz的,但是根据数据手册,DRDY信号每个周期中间是500XtCLKIN,这样 ...

7705是一个低速高精度的AD,最快就500Hz的采样率
生活无需多虑
回复 支持 反对

使用道具 举报

4

主题

29

帖子

0

精华

初级会员

Rank: 2

积分
156
金钱
156
注册时间
2015-9-20
在线时间
21 小时
发表于 2016-5-25 10:29:21 | 显示全部楼层
icifan 发表于 2016-5-23 13:33
7705是一个低速高精度的AD,最快就500Hz的采样率

谢谢你的耐心回答,理论最快采样500Hz,那就是理论上可以达到2ms一次采样,我硬件上是5V和2.5V的参考电压,4.9125M晶振,软件设置增益系数为1,时钟寄存器设置的是不分频,按照芯片手册中的输出更新速率表,我都试了一遍,但是采样时间最短只能达到50ms左右,再短数据就不正确了,这个请问你知道是为什么么?急求啊,我感觉我这个做不出来我的boss要怒了
回复 支持 反对

使用道具 举报

14

主题

73

帖子

0

精华

初级会员

Rank: 2

积分
193
金钱
193
注册时间
2016-10-27
在线时间
48 小时
发表于 2016-11-17 16:24:25 | 显示全部楼层
Jason_02 发表于 2016-5-23 09:31
请问,ad7705,我用的外部晶振是4.9152Mhz的,但是根据数据手册,DRDY信号每个周期中间是500XtCLKIN,这样 ...

您好,您能给仔细解释一下您这个是怎么计算的吗?500Xt是什么意思
回复 支持 反对

使用道具 举报

14

主题

73

帖子

0

精华

初级会员

Rank: 2

积分
193
金钱
193
注册时间
2016-10-27
在线时间
48 小时
发表于 2016-11-17 16:36:59 | 显示全部楼层
Jason_02 发表于 2016-5-23 09:31
请问,ad7705,我用的外部晶振是4.9152Mhz的,但是根据数据手册,DRDY信号每个周期中间是500XtCLKIN,这样 ...

您好,您的这个100ms是怎么算出来的啊?
回复 支持 反对

使用道具 举报

14

主题

73

帖子

0

精华

初级会员

Rank: 2

积分
193
金钱
193
注册时间
2016-10-27
在线时间
48 小时
发表于 2017-1-4 17:29:54 | 显示全部楼层
蓝色天使211 发表于 2014-10-14 10:38
回复【8楼】dongbaohui:
---------------------------------
这个片子现在也就是十二三快的样子。速度比较 ...

能给我一份中文数据手册吗
回复 支持 反对

使用道具 举报

14

主题

73

帖子

0

精华

初级会员

Rank: 2

积分
193
金钱
193
注册时间
2016-10-27
在线时间
48 小时
发表于 2017-1-9 13:59:25 | 显示全部楼层
shudxc 发表于 2015-3-13 20:32
可以说下具体怎么解决吗,我的也是读数据都是0XFFFF,咋回事啊?

您好,在论坛上看见你说你的AD7705的读数一直是0XFF,想请教一下你最后解决这个问题了吗
回复 支持 反对

使用道具 举报

kingarmy 该用户已被删除
发表于 2017-3-8 21:11:55 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复 支持 反对

使用道具 举报

17

主题

80

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
446
金钱
446
注册时间
2012-9-15
在线时间
33 小时
 楼主| 发表于 2017-3-17 21:00:04 | 显示全部楼层
kingarmy 发表于 2017-3-8 21:11
年代久远啊,我想说的是我的ad7705的read引脚一直是高电平不知道为什么

兄弟,4年前的了!
生活无需多虑
回复 支持 反对

使用道具 举报

0

主题

4

帖子

0

精华

新手入门

积分
12
金钱
12
注册时间
2017-3-28
在线时间
1 小时
发表于 2017-3-28 20:39:58 | 显示全部楼层
可怕啊,我接触到的资料都是四年前的!!!!!有没有现在的,好心人
回复 支持 反对

使用道具 举报

4

主题

33

帖子

0

精华

高级会员

Rank: 4

积分
535
金钱
535
注册时间
2016-4-10
在线时间
99 小时
发表于 2017-6-20 15:54:30 | 显示全部楼层
你好,你的AD7705供电使用5V的吗?STM32是3.3V的用SPI接口的话,需不需要做电平转换?
回复 支持 反对

使用道具 举报

0

主题

4

帖子

0

精华

初级会员

Rank: 2

积分
80
金钱
80
注册时间
2014-12-10
在线时间
12 小时
发表于 2017-7-24 17:08:10 | 显示全部楼层
你好,请问一下用的是多大的晶振?我用4.9152M的晶振读DRDY信号时一直为高电平,不知道哪里出了问题。
不断追求,不断进步。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-12-23 07:40

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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