AD7606驱动源代码
###此文章采用的为AD7606-4的ADC,采用双Dout线路的串行接口方式
时序图如下:

1. AD7606引脚宏定义
#define __AD7606_Read_MISO() HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_4)
#define __AD7606_BUSY_MISO() HAL_GPIO_ReadPin(GPIOG,GPIO_PIN_14)
#define __AD7606_CS_HIGH HAL_GPIO_WritePin(GPIOG, GPIO_PIN_15,GPIO_PIN_SET)
#define __AD7606_CS_LOW HAL_GPIO_WritePin(GPIOG, GPIO_PIN_15,GPIO_PIN_RESET)
#define __AD7606_CONVST_HIGH HAL_GPIO_WritePin(GPIOB, GPIO_PIN_7,GPIO_PIN_SET)
#define __AD7606_CONVST_LOW HAL_GPIO_WritePin(GPIOB, GPIO_PIN_7,GPIO_PIN_RESET)
#define __AD7606_RESET_HIGH HAL_GPIO_WritePin(GPIOB, GPIO_PIN_6,GPIO_PIN_SET)
#define __AD7606_RESET_LOW HAL_GPIO_WritePin(GPIOB, GPIO_PIN_6,GPIO_PIN_RESET)
#define __AD7606_SCLK_HIGH HAL_GPIO_WritePin(GPIOB, GPIO_PIN_3,GPIO_PIN_SET)
#define __AD7606_SCLK_LOW HAL_GPIO_WritePin(GPIOB, GPIO_PIN_3,GPIO_PIN_RESET)
#define __AD7606_STBY_HIGH HAL_GPIO_WritePin(GPIOB, GPIO_PIN_9,GPIO_PIN_SET)
#define __AD7606_STBY_LOW HAL_GPIO_WritePin(GPIOB, GPIO_PIN_9,GPIO_PIN_RESET)
#define __AD7606_FRSTDATA_HIGH HAL_GPIO_WritePin(GPIOG, GPIO_PIN_13,GPIO_PIN_SET)
#define __AD7606_FRSTDATA_LOW HAL_GPIO_WritePin(GPIOG, GPIO_PIN_13,GPIO_PIN_RESET)
- 初始化函数
#define ad7606_Sfot 0
#define aD7606_Hard 1
#define AD7606_Channal 4
#define ADCSPI_READY 0x00000000U
#define ADCSPI_BUSY 0x00000001U
#define ADCSPI_ERROR 0x00000002U
#define ADCSPI_TIMEOUT 0x00000004U
uint8_t _ad7606_Staus;
static void TIME_delay_us(uint32_t nus)
{
uint32_t i;
while(nus--)
{
for(i=0; i<25; i++)
{
;
}
}
}
/*********************************************************************************************************
*
*
* @Description : ad7606软件模拟
* @Arguments : none
* @Returns :
*********************************************************************************************************/
static void BSP_GPIO_SET_OUTPUT(GPIO_TypeDef* port,uint32_t pin,uint32_t mode,uint32_t pull,uint32_t speed,uint32_t type)
{
GPIO_InitTypeDef GPIO_InitStruct;
GPIO_InitStruct.Pin = pin;
GPIO_InitStruct.Mode = mode;
GPIO_InitStruct.Speed = speed;
// GPIO_InitStruct.Alternate = type;
GPIO_InitStruct.Pull = pull;
HAL_GPIO_Init(port, &GPIO_InitStruct);
}
static void BSP_GPIO_SET_INPUT(GPIO_TypeDef* port,uint32_t pin,uint32_t pull)
{
GPIO_InitTypeDef GPIO_InitStruct;
GPIO_InitStruct.Pin = pin;
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
GPIO_InitStruct.Pull = pull;
HAL_GPIO_Init(port, &GPIO_InitStruct);
}
/*********************************************************************************************************
*
*
* @Description : ad7606初始化
* @Arguments : none
* @Returns :
*********************************************************************************************************/
static void ad7606_Gpio_Init(void)
{
switch(_ad7606_Staus)
{
case ad7606_Sfot:
BSP_GPIO_SET_OUTPUT(ADC_CS_PORT, ADC_CS_PIN, GPIO_MODE_OUTPUT_PP, GPIO_NOPULL, GPIO_SPEED_FREQ_HIGH, NULL);
BSP_GPIO_SET_OUTPUT(ADC_STBY_PORT, ADC_STBY_PIN, GPIO_MODE_OUTPUT_PP, GPIO_NOPULL, GPIO_SPEED_FREQ_HIGH, NULL);
BSP_GPIO_SET_OUTPUT(ADC_CONVST_PORT, ADC_CONVST_PIN, GPIO_MODE_OUTPUT_PP, GPIO_NOPULL, GPIO_SPEED_FREQ_HIGH, NULL);
BSP_GPIO_SET_OUTPUT(ADC_RESET_PORT, ADC_RESET_PIN, GPIO_MODE_OUTPUT_PP, GPIO_NOPULL, GPIO_SPEED_FREQ_HIGH, NULL);
BSP_GPIO_SET_OUTPUT(ADC_SCLK_PORT, ADC_SCLK_PIN, GPIO_MODE_OUTPUT_PP, GPIO_NOPULL, GPIO_SPEED_FREQ_HIGH, NULL);
BSP_GPIO_SET_INPUT(ADC_BUSY_PORT, ADC_BUSY_PIN, GPIO_NOPULL);
BSP_GPIO_SET_INPUT(ADC_MISO_PORT, ADC_MISO_PIN, GPIO_NOPULL);
//片选初始化
__AD7606_CS_HIGH;
//初始化复位
__AD7606_RESET_LOW;
TIME_delay_us(1);
__AD7606_RESET_HIGH;
TIME_delay_us(1);
__AD7606_RESET_LOW;
break;
case aD7606_Hard:
/*CS片选拉高*/
__AD7606_CS_HIGH;
//SCLK引脚拉高
__AD7606_SCLK_LOW;
//初始化复位
__AD7606_RESET_LOW;
TIME_delay_us(1);
__AD7606_RESET_HIGH;
TIME_delay_us(1);
__AD7606_RESET_LOW;
MX_SPI1_Init();
break;
}
}
void ad7606_Init(void)
{
switch(_ad7606_Staus)
{
case ad7606_Sfot:
ad7606_Gpio_Init();
// __AD7606_CONVST_LOW;
__AD7606_STBY_HIGH;
break;
case aD7606_Hard:
ad7606_Gpio_Init();
break;
}
}
3.ad7606复位函数
/*********************************************************************************************************
*
*
* @Description : ad7606复位
* @Arguments : none
* @Returns :
*********************************************************************************************************/
void AD7606_RESET(void)
{
__AD7606_RESET_HIGH;
TIME_delay_us(1);
__AD7606_RESET_LOW;
}
- ad7606软件模拟读取函数
/*********************************************************************************************************
1.
2. 3. @Description : ad7606软件模拟读取
3. @Arguments : none
4. @Returns :
*********************************************************************************************************/
static uint16_t AD7606_WriteReadData(void)
{
uint16_t i;
uint16_t l_ntemp = 0;
for(i=16; i>0; i--)
{
__nop();
__AD7606_SCLK_LOW;
__nop();
__nop();
l_ntemp <<= 1;
if(__AD7606_Read_MISO())
l_ntemp ++;
__AD7606_SCLK_HIGH;
__nop();
__nop();
}
return l_ntemp;
}
- 数据采集函数函数
/*******************************************************************************************************
6. @Description : ad7606采集函数,
7. @Arguments : none
8. @Returns :
9. 入口形参:Dout_a为采集到的目标输出电压值,Channal为对应的通道
*********************************************************************************************************/
uint32_t ad7606_v4_Datasample(uint16_t* Dout_a,uint8_t Channal)
{
uint8_t k;
uint32_t ulTimeout = 1000;
uint32_t ucStatus = ADCSPI_READY;
uint32_t i;
__AD7606_CONVST_LOW;
TIME_delay_us(1);
__AD7606_CONVST_HIGH;
TIME_delay_us(1);
ucStatus = __AD7606_BUSY_MISO();
while ((ucStatus != ADCSPI_READY) &&( ulTimeout != 0))
{
ucStatus = __AD7606_BUSY_MISO();
ulTimeout--;
}
if(ulTimeout == 0)
{
return ADCSPI_TIMEOUT;
}
__AD7606_CS_LOW;
TIME_delay_us(1);
for(k=0;k < Channal;k++)
{
adad[k] = AD7606_WriteReadData();
*Dout_a = adad[k];
Dout_a++;
}
__AD7606_CS_HIGH;
AD7606_RESET();
return ucStatus;
}
- main函数
uint16_t AD7606_Dout[AD7606_Channal];
void main(void)
{
uint8_t Seconds;
uint8_t Pec_Seconds;
ad7606_Init();
BSP_UpdateTime();
Seconds = (gTime.Seconds >> 4)*10 + (gTime.Seconds&0x0F);
while(1)
{
if(Seconds != Pec_Seconds)
{
Pec_Seconds = Seconds;
ad7606_v4_Datasample(AD7606_Dout,AD7606_Channal);
}
}
}
本文档详细介绍了AD7606-4 ADC的驱动源代码,包括引脚宏定义、初始化函数、复位函数、软件模拟读取函数和数据采集函数的实现,适用于使用双Dout线路串行接口的嵌入式硬件系统。

2946

被折叠的 条评论
为什么被折叠?



