大家有没有用过AD7706 AD7705或者类似的AD芯片,我读取转换的值一直是255,输入变化了还是一样,大家看看我的代码有什么问题,谢谢!(我只用到了AD7706通道1) @dirtwillfly @linqing171 #include "delay.h"
#include "adc.h"
#include "spi.h"
unsigned char ad_val=0;
//AD7706初始化
//nChannel AD通道的选择
#define AD_DOUT GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_7)
void AD7706_Reset(void)
{
uint8_t i;
GPIO_ResetBits(GPIOB,GPIO_Pin_1);//AD rest脚
ms_delay(50);
GPIO_SetBits(GPIOB,GPIO_Pin_1);//rest
GPIO_SetBits(GPIOA,GPIO_Pin_14);//clk=1
for(i = 0; i < 40; i++) //至少32个周期
{
GPIO_ResetBits(GPIOA,GPIO_Pin_14); //clk reset
__nop();
__nop();
GPIO_SetBits(GPIOB,GPIO_Pin_6);//adin=1
__nop();
__nop();
GPIO_SetBits(GPIOA,GPIO_Pin_14); //clk=1
__nop();
__nop();
}
ms_delay(50);
}
void AD7706_Init(uint8_t nChannel)
{
AD7706_Reset();
GPIO_ResetBits(GPIOA,GPIO_Pin_14); //clk reset
ms_delay(100);
GPIO_ResetBits(GPIOB,GPIO_Pin_8);//DRDY脚
GPIO_SetBits(GPIOA,GPIO_Pin_14); //时钟置高
GPIO_ResetBits(GPIOB,GPIO_Pin_0); //片选置低,AD使能
__nop();
__nop();
__nop();
if(nChannel == 1)
//ch=0x00;
//ch_temp = ch;
ReadWriteByte(0x20);//ʱÖӼĴæÆ÷
ReadWriteByte(0x00);//50HZ
ReadWriteByte(0x10);//Ñ¡ÔñÉèÖüĴæÆ÷
ReadWriteByte(0x44);//×Ô¶¯Ð£×¼£¬ÔöÒæΪ1
ms_delay(100);
}
int32_t ReadAD7706(uint8_t nChannel)//读
{
unsigned int i;
GPIO_ResetBits(GPIOB,GPIO_Pin_8);//DRDY=0
GPIO_ResetBits(GPIOB,GPIO_Pin_0); //cs=0
if(nChannel == 1)
ReadWriteByte(0x38);//¶ÁÈ¡Êý¾Ý¼Ä´æÆ÷
for(i=0; i<16; i++)
{
GPIO_ResetBits(GPIOA,GPIO_Pin_14);
ms_delay(100);
GPIO_SetBits(GPIOA,GPIO_Pin_14);
ms_delay(100);
ad_val=(ad_val<<1);
//ad_val=(ad_val<<1)|(ad_val&0x0001);
GPIO_ResetBits(GPIOA,GPIO_Pin_14);
__nop();
__nop();
__nop();
if(AD_DOUT)
{
GPIO_SetBits(GPIOB,GPIO_Pin_7);
ad_val|=0x0001;
// ad_val++;
}
else
{
__nop();
__nop();
__nop();
}
GPIO_SetBits(GPIOA,GPIO_Pin_14);
}
GPIO_SetBits(GPIOB,GPIO_Pin_0);
//ad_val=(ad_val&0x0fff);
return ad_val;
}
int16_t ReadWriteByte(uint8_t ch_temp) //写数据
{
unsigned int i;
unsigned char hvar;
GPIO_ResetBits(GPIOB,GPIO_Pin_0); //cs=0
for(i=0; i<8; i++)
{
GPIO_ResetBits(GPIOB,GPIO_Pin_8);//DRDY
GPIO_ResetBits(GPIOA,GPIO_Pin_14);//clk=0
__nop();
__nop();
__nop();
hvar=ch_temp&0x80;
if(hvar)
GPIO_SetBits(GPIOB,GPIO_Pin_6); //ADIN
else
GPIO_ResetBits(GPIOB,GPIO_Pin_6);
//if((ch_temp&0x80)==0x00)
// GPIO_ResetBits(GPIOB,GPIO_Pin_6); //ͨ¹ý´®Ðз½Ê½ÊäÈëͨµÀÑ¡Ôñ
// else
// GPIO_SetBits(GPIOB,GPIO_Pin_6);
ch_temp<<=1;
// GPIO_SetBits(GPIOA,GPIO_Pin_14); //ʱÖÓÖøߣ¬ÔÚÉÏÉýÑØDINʵÏÖ1λÊäÈë
__nop();
__nop();
__nop();
}
//ms_delay(100);
GPIO_SetBits(GPIOA,GPIO_Pin_14);
GPIO_SetBits(GPIOB,GPIO_Pin_6);
//return ch_temp;
}
|