试着用stm32去模拟spi来控制AD7705,可是发现DRDY居然读完数据后还是低电平,为什么呢?总是低电平。程序如下:
#include "sys.h"
#include "usart.h"
#include "delay.h"
#include "led.h"
#include "AD7705.h"
int main(void)
{
u16 tempB;
u16 ADVaule=0;
float SJZ;
Stm32_Clock_Init(9); //系统时钟设置
delay_init(72); //延时初始化
LED_Init(); //初始化与LED连接的硬件接口
uart_init(72,9600); //串口初始化为9600
LED0=0;
AD7705_Init();
AD7705_Write(0x20); //下一个写时钟寄存器
AD7705_Write(0x04); //2.4M所以不需要分频,并且必须是逻辑1
while(DRDY==0);
AD7705_Write(0x10); //写设置寄存器
AD7705_Write(0x40); //0100 00000设置寄存器,1、自校准模式放大倍数是1
while(1)
{
while(DRDY==1);
AD7705_Write(0x38);
tempB=AD7705_read(); //DRDY逻辑低电平,表示可以从数据寄存器获取字
delay_us(1);
while(DRDY==0);//????????问题来了 //完成对一个字的读操作后,立即输出高电平
if(tempB&0x8000) //当DRDY处于高电平时,不能进行读操作,数据更新完成后
{ //数据更新后,DRDY是0
ADVaule=tempB;
ADVaule=~ADVaule;
ADVaule+=1;
SJZ=ADVaule*2.5/32768;
printf("-%4.3f\t",SJZ );
}
else
{
SJZ= tempB*2.5/32768;
printf("%4.3f\t",SJZ);
}
printf("\r\n");//换行
delay_ms(300);
LED0=~LED0;
}
}
#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<<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;
for(i=8;i>0;i--)
{
SCLK=0;
delay_us(1);
SCLK=1;
delay_us(1);
A=((date&(0x01<<i))!=0);
DIN=A;
}
// while(!DRDY);
CS=1;
}
u16 AD7705_read(void)
{
TempA=0;
CS=1;
SCLK=1;
delay_us(1);
while(DRDY);//等待DRDY变成0.数据更新完成
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;
delay_us(1); //当数据读取完后,DRDY变成高电平
//while(!DRDY); //卡死???数据读完后,没有变成高电平???????
return TempA;
}
|