这是我写的ADS8881驱动,但是运行之后读取的过程中偶尔会出现0,不知道是怎么回事?
#include "led.h"
#include "delay.h"
#include "usart.h"
void ad_IO_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE); //ê1Äü¶Ë¿úê±Öó
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_8; //
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //íÆíìêä3ö
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO¿úËù¶èÎa50MHz
GPIO_Init(GPIOB, &GPIO_InitStructure); //¸ù¾Yé趨2Îêy3õê¼»ˉ
GPIO_SetBits(GPIOB,GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_8); //SCLK,CONVST,DIN
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;//DOUT
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//¸¡¿Õêäèë
GPIO_Init(GPIOB, &GPIO_InitStructure); //receive
GPIO_SetBits(GPIOB,GPIO_Pin_7); //1, 0 indicate ready
}
/*
#define SCLK PBout(5) //default low,GPIO_Mode_Out_PP
#define CONVST PBout(6) //default high,GPIO_Mode_Out_PP
#define DOUT PBin(7) //master input,GPIO_Mode_IN_FLOATING
#define DIN PBout(8) //master output,GPIO_Mode_Out_PP
*/
//¶á18λêy¾Y
int adc_read(void)
{
int i;
int data=0;
DIN = 0;
CONVST = 0;
SCLK = 0;
delay_us(2);
DIN=1;
CONVST = 1;
for(i=0;i<5;i++)
{
SCLK = 1;
delay_us(1);
SCLK = 0;
delay_us(1);
}
DIN = 0;
delay_us(1);//*****
for(i=17;i--;i>0)
{
SCLK=1;
delay_us(1);
data=data|(DOUT<<i);//(i-1)); //***
SCLK=0;
delay_us(1);
}
//printf("%8d
",data);
DIN = 1;
CONVST = 0;
SCLK = 0;
delay_us(2);
return data;
}
一周热门 更多>