基于stm32L0系列的AD7682驱动程序
//调用u16 AD7682(u8 adINx),即可切换通道,得到返回的ADC值。实测程序可用,ADC值为0-65535
#define CFG 1
#define INCC 6
#define adIN0 0
#define adIN1 1
#define BW 1
#define REF 1
#define SEQ 0
#define RB 1
#define ADC_CS_H LL_GPIO_SetOutputPin(GPIOA, LL_GPIO_PIN_15)
#define ADC_CS_L LL_GPIO_ResetOutputPin(GPIOA, LL_GPIO_PIN_15)
#define ADC_SCK_H LL_GPIO_SetOutputPin(GPIOB, LL_GPIO_PIN_3)
#define ADC_SCK_L LL_GPIO_ResetOutputPin(GPIOB, LL_GPIO_PIN_3)
#define ADC_MOSI_H LL_GPIO_SetOutputPin(GPIOA, LL_GPIO_PIN_12)
#define ADC_MOSI_L LL_GPIO_ResetOutputPin(GPIOA, LL_GPIO_PIN_12)
#define ADC_MISO_H LL_GPIO_SetOutputPin(GPIOA, LL_GPIO_PIN_11)
#define ADC_MISO_L LL_GPIO_ResetOutputPin(GPIOA, LL_GPIO_PIN_11)
void AD7682_GPIO_Init(void);
void AD7682_ADC16_Init2(void);
u16 AD7682(u8 adINx);
void AD7682_GPIO_Init(void)
{
LL_GPIO_InitTypeDef GPIO_InitStruct = {0};
LL_IOP_GRP1_EnableClock(LL_IOP_GRP1_PERIPH_GPIOA);
LL_IOP_GRP1_EnableClock(LL_IOP_GRP1_PERIPH_GPIOB);
GPIO_InitStruct.Pin=LL_GPIO_PIN_11;
GPIO_InitStruct.Mode=LL_GPIO_MODE_INPUT;
GPIO_InitStruct.Speed=LL_GPIO_SPEED_FREQ_VERY_HIGH;
GPIO_InitStruct.Pull=LL_GPIO_PULL_UP;
LL_GPIO_Init(GPIOA, &GPIO_InitStruct);
GPIO_InitStruct.Pin=LL_GPIO_PIN_12;
GPIO_InitStruct.Mode=LL_GPIO_MODE_OUTPUT;
GPIO_InitStruct.Speed=LL_GPIO_SPEED_FREQ_VERY_HIGH;
GPIO_InitStruct.OutputType=LL_GPIO_OUTPUT_PUSHPULL;
GPIO_InitStruct.Pull=LL_GPIO_PULL_UP;
LL_GPIO_Init(GPIOA, &GPIO_InitStruct);
ADC_MOSI_L;
GPIO_InitStruct.Pin=LL_GPIO_PIN_15;
GPIO_InitStruct.Mode=LL_GPIO_MODE_OUTPUT;
GPIO_InitStruct.Speed=LL_GPIO_SPEED_FREQ_HIGH;
GPIO_InitStruct.OutputType=LL_GPIO_OUTPUT_PUSHPULL;
GPIO_InitStruct.Pull=LL_GPIO_PULL_UP;
LL_GPIO_Init(GPIOA, &GPIO_InitStruct);
ADC_CS_L;
GPIO_InitStruct.Pin=LL_GPIO_PIN_3;
GPIO_InitStruct.Mode=LL_GPIO_MODE_OUTPUT;
GPIO_InitStruct.Speed=LL_GPIO_SPEED_FREQ_VERY_HIGH;
GPIO_InitStruct.OutputType=LL_GPIO_OUTPUT_PUSHPULL;
GPIO_InitStruct.Pull=LL_GPIO_PULL_UP;
LL_GPIO_Init(GPIOB, &GPIO_InitStruct);
ADC_SCK_L;
}
void AD7682_ADC16_Init2(void)
{
AD7682_GPIO_Init();
AD7682(adIN0);
delay_ms(100);
AD7682(adIN0);
}
u16 AD7682(u8 adINx)
{
u16 CFG_COM=0;
u16 data=0;
CFG_COM = (CFG<<13)|(INCC<<10)|(adINx<<7)|(BW<<6)|(REF<<3)|(SEQ<<1)|RB;
CFG_COM <<=2;
ADC_SCK_L;
ADC_CS_L;
delay_us(6);
ADC_CS_H;
delay_us(6);
ADC_CS_L;
delay_us(1);
for(u8 i=0; i<16; i++)
{
if(CFG_COM&0x8000) ADC_MOSI_H;
else ADC_MOSI_L;
CFG_COM<<=1;
ADC_SCK_H;
data<<=1;
if(LL_GPIO_IsInputPinSet(GPIOA, LL_GPIO_PIN_11)==1) data|=1;
ADC_SCK_L;
}
delay_us(1);
ADC_CS_H;
delay_us(20);
return data;
}
|