STM32之AD7194驱动

AD7194是一款16通道的ADC,采用SPI控制,驱动如下:

/*
***********************************************************
文 件 名: AD7194.c
模    块: AD7194读写模块
详    述: 
  1) AD7194读写;
  2) 芯片自检;
  3) AD芯片温度读取。
***********************************************************
*/
#include  "Global.h"
#include  "AD7194.h"

/* AD7194寄存器值
0:REG_COM_STA/REG_STATUS   1:REG_MODE    2:REG_CONF   3:REG_DATA
4:REG_ID                   5:REG_GPOCON  6:REG_OFFSET 7:REG_FS*/
static uint32 st_a_u32RegValues[8] = {0, 0, 0, 0, 0, 0, 0, 0};
/* 温度寄存器缓冲区*/
static uint32 st_a_u32_TempRegData[SAMPLING_NUM] = {0U};

/* 静态函数*/
static void   AD7194_SetCS(uint8 u8Data);
static void   AD7194_Operation(uint8* p_u8WriteBuf,  uint8 *p_u8ReadBuf, uint8 u8Size);
static void   AD7194_WriteData(const uint8 u8RegStartAddress, const uint8 u8RegNum,const uint32 *p_u32DataBuf);
static void   AD7194_ReadData(const uint8 u8RegStartAddress, const uint8 u8RegNum,uint32 *p_u32DataBuf, const uint8 u8OffsetInBuf);

extern uint8 fab8(int8 m_in);
/*
*******************************************************************************
功能: 复位ADC
参数: 无
返回: 无
*******************************************************************************
*/ 
void AD7194_SoftwareReset( void )
{
  uint8 a_u8_WriteData[10] = {0};
  uint8 a_u8_ReadData[10] = {0};

  AD7194_SetCS((uint8)0);       /* 使能器件*/

  Afx_MemSet(a_u8_WriteData, 0xFF, 10);

  HAL_SPI_TransmitReceive(&Spi1Handle, (uint8 *)a_u8_WriteData, (uint8 *)a_u8_ReadData, 10, 500);
  
  AD7194_SetCS((uint8)1);       /* 取消片选*/
  delay_ms((uint16)3);           /* 至少500us复位寄存器*/
  
  AD7194_SetCS((uint8)0);       /* 使能器件*/  
}

/*
*******************************************************************************
功能: 等待RDY信号变低
参数: 无
返回: 无
*******************************************************************************
*/ 
void  AD7194_WaitRDY( void )
{    
  uint32  u32Retry = 0U;
  while(RDY_MISO == 1U)
  {            
    u32Retry++;
    if(u32Retry > 0x8FFFU)
    {
      break;
    }
    else /* 其他*/
    {
      /* nothing*/
    }
  }
}

                                        
/*
*******************************************************************************
功能: 配置模式寄存器和配置寄存器
参数: 
      u32Data     数字值
返回: 无
*******************************************************************************
*/
void  AD7194_Config(void)
{
  /* 写 0x0C2080  和 0x100100 到 ADC的 Mode Register 和 Configuration Register*/ 
  /* 0x100000 | 0x080000 | 0x002000 | 0x000080 = 0x182080  Output Rate = MCLK/1024/128 without chop*/
  st_a_u32RegValues[REG_MODE] = MODE_CONT | DAT_STA_EN | INCLK_MCLK2TRI | SINC_4 | ENPAR_EN | CLK_DIV_DIS | SINGLECYCLE_DIS | REJ60_DIS | FS_5;
  /* 0x040000 | 0x000008 | 0x000010 = 0x040018*/
  st_a_u32RegValues[REG_CONF] = CHOP_DIS | REF_IN1 | AIN1_COM | PREUDO_EN | BURN_DIS | REFDET_DIS | BUF_EN | UB_UNI | GAIN_1;

  AD7194_WriteData((uint8)REG_MODE, (uint8)2, st_a_u32RegValues);
  
  /* 初始化寄存器*/
  Afx_MemSet(st_a_u32RegValues, 0U, 8U*sizeof(uint32)); 
  
  /* 读出AD7194八个寄存器的值*/
  AD7194_ReadData((uint8)REG_COM_STA, (uint8)8, st_a_u32RegValues, (uint8)REG_COM_STA);  
}                                                    

/*
*******************************************************************************
功能:开启通道连续转换模式
参数:
      u32Channels  通道
返回:无
*******************************************************************************
*/
void AD7194_StartContConvertion(uint32 u32Channels)
{
  /* 禁用斩波,单一通道转换,使能缓冲,单极性,增益为1,伪差分,SIN4,奇偶校验*/
  /* 输出速率 = fclk/(1024*FS[9:0]) = 4.92M/(1024*5) = 960HZ*/
  st_a_u32RegValues[REG_MODE] = MODE_CONT | DAT_STA_EN | INCLK_MCLK2TRI | SINC_4 | ENPAR_EN | CLK_DIV_DIS | SINGLECYCLE_DIS | REJ60_DIS | FS_5;
  st_a_u32RegValues[REG_CONF] = CHOP_DIS | REF_IN1 | PREUDO_EN | u32Channels | BURN_DIS | REFDET_DIS | BUF_EN | UB_UNI | GAIN_1;
  AD7194_WriteData((uint8)REG_MODE, (uint8)2, st_a_u32RegValues);

  /* 读出Mode Register 和 Configuration Register的值*/
  AD7194_ReadData((uint8)REG_MODE, (uint8)2, st_a_u32RegValues, (uint8)REG_MODE);  
}

/*
*******************************************************************************
功能:读正在转换的数据
参数:无
返回:无
*******************************************************************************
*/ 
u
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值