AD7606驱动源代码完整版

本文档详细介绍了AD7606-4 ADC的驱动源代码,包括引脚宏定义、初始化函数、复位函数、软件模拟读取函数和数据采集函数的实现,适用于使用双Dout线路串行接口的嵌入式硬件系统。

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)
  1. 初始化函数
#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;
}
  1. 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;  
}  
  1. 数据采集函数函数
/*******************************************************************************************************                                      
 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;
}
  1. 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);
      }
   }
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

起名字好难.珩

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值