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