关于AD7705的问题
时间:10-02
整理:3721RD
点击:
用spi可以调通,但是为什么模拟io口的时候就不能成功了,好生奇怪,时序之类的感觉都没什么问题,只是数据输入0V输出1.25v ,输入0.8V输出1.66v ,输入1.6v输出2v, 输入 2.5v输出2.5V,这是为什么啊,大神
#include "sys.h"
#include "usart.h"
#include "delay.h"
#include "led.h"
#include "AD7705.h"
int main(void)
{
u16 tempB;
float SJZ;
Stm32_Clock_Init(9); //系统时钟设置
delay_init(72); //延时初始化
LED_Init(); //初始化与LED连接的硬件接口
uart_init(72,9600); //串口初始化为9600
LED0=0;
AD7705_Init();
delay_us(1);
AD7705_Write(0x20); //下一个写时钟寄存器
delay_us(1);
AD7705_Write(0x04); //2.4M所以不需要分频,并且必须是逻辑1
delay_us(1);
AD7705_Write(0x10); //写设置寄存器
delay_us(1);
AD7705_Write(0x44); //0100 00000设置寄存器,1、自校准模式放大倍数是1
while(1)
{
while(DRDY);
AD7705_Write(0x38);
delay_us(1);
while(DRDY);
tempB=AD7705_read(); //DRDY逻辑低电平,表示可以从数据寄存器获取字
SJZ= tempB*2.5/65536;
printf("%4.7f\t",SJZ);
printf("\r\n");//换行
LED0=!LED0;
delay_ms(200);
}
}
其中AD的程序如下;
#include "sys.h"
#include "led.h"
#include "AD7705.h"
#include "delay.h"
u8 A;
u8 i;
u16 TempA;
void AD7705_Init(void)
{
RCC->APB2ENR|=1<<0; //开启辅助时钟
JTAG_Set(SWD_ENABLE); //开启SWD
RCC->APB2ENR|=1<<3; //使能PORTB时钟
GPIOB->CRL&=0X000FF000;
GPIOB->CRL|=0X38800333; //PB8推挽输出 上拉输入模式
GPIOB->ODR=0XFF;
RES=1;
delay_us(1);
RES=0;
delay_us(1);
RES=1;
delay_us(1);
}
void AD7705_Write(u8 date)
{
CS=1;
delay_us(1);
SCLK=1;
delay_us(1);
CS=0;
delay_us(1);
for(i=8;i>0;i--)
{
SCLK=0;
delay_us(1);
SCLK=1;
delay_us(1);
DIN=((date&(0x01<<(i-1)))!=0);
//DIN=A;
}
CS=1;
}
u16 AD7705_read(void)
{
TempA=0;
CS=1;
delay_us(1);
SCLK=1;
delay_us(1);
while(DRDY);
delay_us(1);
CS=0;
delay_us(1);
for(i=0;i<16;i++)
{
TempA<<=1;
SCLK=0;
delay_us(1);
SCLK=1;
delay_us(1);
if(DOUT)
TempA|=0x0001;
else
TempA&=0xfffe;
}
CS=1;
return TempA;
}
这个问题你看看你的时序,我之前做的AD7799,那个的SPI是非标准的,SPI的类型有四种,我的AD7799是在下降沿读数据,如果在上升沿读数据的话,最后一位数据读不到。
我刚才发现问题了,。无语了,时序的问题,写时序出现问题了。终于把问题解决了。开僧