64kSPS、低功耗、多通道同步、24 位ADC生物电势测量的模拟前端AFE9XX


前言

AFE94X多通道同步采集,64KSPS,24bit SD_ADC AFE94X
验证驱动,阻塞等待DRDY(仅验证驱动使用),兼容-类比芯片STM32HAL库SPI
https://blog.youkuaiyun.com/hhhhwdnmd/article/details/135774192?spm=1001.2014.3001.5501


一、AFE94X是什么?

AFE94X是多通道同步采样 24 位 Δ-Σ 模数转换器(ADC)系列,内置有可编程增益放大器(PGA)、内部基准以及板载振荡器。AFE94x 包含医疗心电图(ECG)和脑电图(EEG)应用中通
常所需的全部功能。凭借高集成度和出色性能,AFE94x能够以大幅缩小的尺寸、显著降低的功耗和整体成本开发可扩展的医疗仪器系统。

二、使用步骤

1.AFE94X.h

/*
    Analogysemi xutong
    2023/02/15
*/
#ifndef __AFE94X_H
#define __AFE94X_H
 
#include "bsp_lpspi.h"
#include "stm32f4xx.h"
 
#define AFE94x_START_GPIO_CLK_ENABLE()       __HAL_RCC_GPIOA_CLK_ENABLE()
#define AFE94x_PWDN_GPIO_CLK_ENABLE()        __HAL_RCC_GPIOA_CLK_ENABLE()
#define AFE94x_DRDY_GPIO_CLK_ENABLE()        __HAL_RCC_GPIOA_CLK_ENABLE()
#define AFE94x_REST_GPIO_CLK_ENABLE()        __HAL_RCC_GPIOB_CLK_ENABLE()
 
/* Definition for AFE94x Pins */
#define AFE94x_START_PIN                     GPIO_PIN_8
#define AFE94x_START_GPIO_PORT               GPIOA
#define AFE94x_DRDY_PIN                    	 GPIO_PIN_12
#define AFE94x_DRDY_GPIO_PORT                GPIOA
#define AFE94x_PWDN_PIN                      GPIO_PIN_11
#define AFE94x_PWDN_GPIO_PORT                GPIOA
#define AFE94x_REST_PIN                      GPIO_PIN_1
#define AFE94x_REST_GPIO_PORT                GPIOB
 
/*command define*/
 
#define AFE94X_WAKEUP  0x02
#define AFE94X_STANDBY 0x04
#define AFE94X_RESET   0x06
#define AFE94X_START   0x08
#define AFE94X_STOP    0x0A

#define AFE94X_RDATAC  0x10
#define AFE94X_SDATAC  0x11
#define AFE94X_RDATA   0x12
#define AFE94X_OFFSETCAL  0x1A

#define AFE94X_RREG    0X20
#define AFE94X_WREG    0X40
#define AFE94X_RREGX   0xE4
#define AFE94X_WREGX   0xE8
//RREG Read n nnnn registers starting at address r rrrr 
//First Byte 001r rrrr (2xh)
//Second Byte 000n nnnn 
//n nnnn = number of registers to be read or written – 1. For example, to read or write three registers, set n nnnn = 0 (0010). r rrrr = the
//starting register address for read and write commands
//WREG 同上
//WREG First Byte (4xh)
/*
    寄存器地址
*/
#define AFE94X_ID           0x00
#define AFE94X_CONFIG1      0x01
#define AFE94X_CONFIG2      0x02
#define AFE94X_CONFIG3      0x03
#define AFE94X_LOFF         0x04

#define AFE94X_CH1SET      0X05
#define AFE94X_CH2SET      0X06
#define AFE94X_CH3SET      0X07
#define AFE94X_CH4SET      0X08
#define AFE94X_CH5SET      0X09
#define AFE94X_CH6SET      0X0A
#define AFE94X_CH7SET      0X0B
#define AFE94X_CH8SET      0X0C
#define AFE94X_RLD_SENSP   0X0D
#define AFE94X_RLD_SENSN   0X0E
#define AFE94X_LOFF_SENSP  0X0F
#define AFE94X_LOFF_SENSN  0X10
#define AFE94X_LOFF_FLIP   0X11

#define LOFF_STATP_Status   0X12
#define LOFF_STATN_Status   0X13

#define AFE94X_GPIO        0X14 
#define AFE94X_PACE        0X15
#define AFE94X_RESV        0X16
#define AFE94X_CONFIG4     0X17
#define AFE94X_WCT1        0X18
#define AFE94X_WCT2        0X19

#define AFE94X_WCT3        0X1A
#define AFE94X_CONFIG5     0X1C
#define AFE94X_CONFIG6     0X1D
#define AFE94X_CONFIG7     0X1E
#define AFE94X_CONFIG8     0X1F
#define AFE94X_CONFIG9     0X20
#define AFE94X_LOFF_CFCG1  0X21
#define AFE94X_LOFF_CFCG2  0X22
#define AFE94X_LOFF_ACLO1  0X23
#define AFE94X_LOFF_ACLO2  0X24
#define AFE94X_REDR2P      0X25
#define AFE94X_CHMUX_MSB   0X26
#define AFE94X_LOFF_CMP_FLIP 0X27
#define AFE94X_LOFF_SENSN1 0X28
#define AFE94X_LOFF_SENSP1 0X29
#define AFE94X_SRB1_COFIG  0X2A
#define AFE94X_BIAS_DAC    0X2B
#define AFE94X_XOSC_CFG    0X2C
#define AFE94X_LOW_NOISE   0X2E
#define AFE94X_MISC_ANA    0X34
#define AFE94X_MOD_STAT    0X35
#define AFE94X_CMD_STAT    0X36
#define AFE94X_PGAP_OOR    0X37
#define AFE94X_PGAN_OOR    0X28

/*
    寄存器设置
*/
//CONFIG2
#define	EXT_TEST_ON	       0X00	//关闭内部测试信号,外部(默认)
#define	INT_TEST_ON		   0X10
//CONFIG3
#define INT_REF_EN         0X80   //内部基准(default)
#define EXT_REF_EN         0X00   //外部基准
#define AFE94X_REF_2_4V    0X00   //default
#define AFE94X_REF_4V      0X20
#define RLD_REF_PD_EN      0X04   //default
#define RLD_REF_PD_DIS     0X00
#define AFE94X_RLDREF_INT  0X08
#define AFE94X_RLDREF_EXT  0X00   //default
#define AFE94X_RLD_BUF_EN  0X04
#define AFE94X_RLD_BUF_DIS 0X00   //default
#define RLD_LOFF_SENS_EN   0X02
#define RLD_LOFF_SENS_DIS  0X00   //default 
#define RLD_STAT_EN        0X00   //default
#define RLD_STAT_DIS       0X01
//LOFF
#define AFE94X_COMP_95_5   0X00
#define AFE94X_COMP_92_7   0X20
#define AFE94X_COMP_90_8   0X40
#define AFE94X_COMP_87_12  0X60
#define AFE94X_COMP_85_15  0X80
#define AFE94X_COMP_80_20  0XA0
#define AFE94X_COMP_75_25  0XC0
#define AFE94X_COMP_70_30  0XE0
#define LEAD_CURRENT_9NA   0X00
#define LEAD_CURRENT_18NA  0X03
#define LEAD_CURRENT_27NA  0X04
#define LEAD_CURRENT_40NA  0X0C
#define FLEAD_AC_LEAD      0X01
#define FLEAD_DC_LEAD      0X03
//CHXSET
#define AFE94X_CH_PD       0X80  //Channel power-down
#define AFE94X_CH_EN       0X00  //Normal operation
#define AFE94X_PGA_1       0X10
#define AFE94X_PGA_2       0X20
#define AFE94X_PGA_3       0X30
#define AFE94X_PGA_4       0X40
#define AFE94X_PGA_6       0X00 //default
#define AFE94X_PGA_8       0X40
#define AFE94X_PGA_12      0X60
#define AFE94X_PGA_24      0X70
#define	MUX_Normal_input   0X00	//普通电极输入(默认)
#define	MUX_Input_shorted  0X01	//输入短路
#define MUX_RLD_Test       0x02
#define	MUX_Test_signal    0X05	//测试信号输入
#define	MUX_RLD_DRP		   0X06		
#define	MUX_RLD_DRN		   0X07			
#define	MUX_RLD_DRPM	   0X00	//CHX_MUX_MSB must set	CHX_MUX_MSB|MUXn = 1000	
#define	MUX_RSP_RESP       0X01 //CHX_MUX_MSB must set  CHX_MUX_MSB|MUXn = 1001
#define MUX_AFE_BYPASS     0X02 //CHX_MUX_MSB must set  CHX_MUX_MSB|MUXn = 1010
//CONFIG4
#define AFE94X_SHOT_MODE   0X20
#define AFE94X_CONT_MODE   0X00 //default
#define AFE94X_COMP_PDEN   0X02 
#define AFE94X_COMP_PDDIS  0X00 //default
#define WCT_RLD_CONNECT    0X01 
//WCT1
#define PD_WCTA_DIS        0X00 //default
#define PD_WCTA_EN         0X08
#define WCTA_AIN1P_Amp     0X00
#define WCTA_AIN1N_Amp     0X01
#define WCTA_AIN2P_Amp     0X02
#define WCTA_AIN2N_Amp     0X03
#define WCTA_AIN3P_Amp     0X04
#define WCTA_AIN3N_Amp     0X05
#define WCTA_AIN4P_Amp     0X06
#define WCTA_AIN4N_Amp     0X07
//WCT2
#define PD_WCTC_DIS        0X00 //default
#define PD_WCTC_EN         0X80
#define PD_WCTB_DIS        0X00
#define PD_WCTB_EN         0X40 //default
#define WCTB_AIN1P_Amp     0X00
#define WCTB_AIN1N_Amp     0X08
#define WCTB_AIN2P_Amp     0X10
#define WCTB_AIN2N_Amp     0X18
#define WCTB_AIN3P_Amp     0X20
#define WCTB_AIN3N_Amp     0X28
#define WCTB_AIN4P_Amp     0X30
#define WCTB_AIN4N_Amp     0X38
#define WCTC_AIN1P_Amp     0X00
#define WCTC_AIN1N_Amp     0X01
#define WCTC_AIN2P_Amp     0X02
#define WCTC_AIN2N_Amp     0X03
#define WCTC_AIN3P_Amp     0X04
#define WCTC_AIN3N_Amp     0X05
#define WCTC_AIN4P_Amp     0X06
#define WCTC_AIN4N_Amp     0X07
//WCT3
#define WCT_SW7_OFF        0X00 //default
#define WCT_SW7_ON         0X80
#define WCT_SW6_OFF        0X00 //default
#define WCT_SW6_ON         0X40 
#define WCT_SW5_OFF        0X00 //default
#define WCT_SW5_ON         0X20
#define WCT_SW4_OFF        0X00 //default
#define WCT_SW4_ON         0X10
#define WCT_SW4_EN         0X08
#define WCT_SW4_DIS        0X00 //default
#define WCT_BUF_LOW        0X04 //default
#define WCT_BUF_HIGH       0X00
#define WCT_BYPASS_BUF     0X01
//CONFIG5
#define INT_OSC_2M         0X00 //default Internal OSC frequency 2M
#define INT_OSC_1M         0X40 //Internal OSC frequency 1M
#define INT_OSC_0_5M       0X80 //Internal OSC frequency 512K
#define INT_OSC_0_2M       0XC0 //Internal OSC frequency 216K
#define AFE94X_HS_MODE     0X02
#define AFE94X_LP_MODE     0X01
//L0FF_CGF2
#define RLD_COMP_95_5      0X00 //default
#define RLD_COMP_92_7      0X04
#define RLD_COMP_90_8      0X08
#define RLD_COMP_87_12     0X0C
#define RLD_COMP_85_15     0X10
#define RLD_COMP_80_20     0X14
#define RLD_COMP_75_25     0X18
#define RLD_COMP_70_30     0X38
#define LEAD_Debounce_DIS  0X00 //default
#define LEDA_Debounce_117  0x01
//CHMUX_MSB
#define CH8_MUX_MSB        0X80
#define CH7_MUX_MSB   	   0X40
#define CH6_MUX_MSB   	   0X20
#define CH5_MUX_MSB        0X10
#define CH4_MUX_MSB    	   0X08
#define CH3_MUX_MSB        0X04
#define CH2_MUX_MSB        0X02
#define CH1_MUX_MSB        0X01

//GPIO
#define GPIOD_GPIO1        0X10
#define GPIOD_GPIO2        0X20
#define GPIOD_GPIO3        0X40
#define GPIOD_GPIO4        0X80
#define GPIO_IN_GPIO1      0X01
#define GPIO_IN_GPIO2      0X02
#define GPIO_IN_GPIO3      0X04
#define GPIO_IN_GPIO4      0X08
#define GPIO_OUT_GPIO1     0X00
#define GPIO_OUT_GPIO2     0X00
#define GPIO_OUT_GPIO3     0X00
#define GPIO_OUT_GPIO4     0X00
//LOFF_CFG1
#define RLD_COMP_EN
#define CUR_LEVEL

//RLD_DAC
#define RLD_DAC_EN         0X80
#define RLD_DAC_DIS        0X00
#define RLD_REF_AVDD       0X00
#define RLD_REF_AREEP      0X40
/*
  通道选择
  channel select
*/
#define AFE94X_AIN1        0
#define AFE94X_AIN2        1
#define AFE94X_AIN3        2
#define AFE94X_AIN4        3
#define AFE94X_AIN5        4
#define AFE94X_AIN6        5
#define AFE94X_AIN7        6
#define AFE94X_AIN8        7

//写命令
void AFE9XX_Command(uint8_t Com);
//获取芯片的ID号
uint8_t AFE9XX_GetChipID(void);
 
//获取寄存器值
uint8_t AFE9XX_GetReg(uint8_t Rreg);
//获取多个寄存器值
void AFE9XX_ReadMultiReg(uint8_t StartReg,uint8_t RegNum,uint8_t *Data);
//写入寄存器值
void AFE9XX_WriteReg(uint8_t Wreg,uint8_t Data);
//写多个寄存器的值
void AFE9XX_WriteMultiReg(uint8_t StartReg,uint8_t RegNum,uint8_t *Data);
//获取所有寄存器值
void AFE9XX_GetAllReg(void);
//设定通道并且获取ADC的值
// CH设置为 0或者设通道0/1
void AFE9XX_GetADC_Value(uint8_t AIN_P,uint8_t AIN_N,uint8_t *Rxdata);
//初始化AFE9XX
void AFE9XX_Init(void);
//获取通道ADC值
float AFE9xx_GetValue(uint8_t AIN_CH,uint8_t AFE94X_REF,uint8_t *Rxdata);
//获取所有通道ADC值
void AFE94X_GetAllValue(uint8_t AFE94X_REF,uint8_t *Rxdata,float *Voltage);
//获取内部温度传感器值
float AFE9XX_GetTempture(uint8_t *Rxdata);
//获取设备噪声值
float AFE9XX_Noise_Test(uint8_t *Rxdata);
//电源测试
float AFE9XX_PWR_Test(uint8_t *Rxdata);
//直流导联脱落
void AFE9XX_DCLEAD_OFF(uint8_t *Rxdata);
//内部信号测试
void AFE9XX_SINGLE_TEST(uint8_t *Rxdata);
void TEST_RLD_SINGLE(uint8_t *Rxdata);
#endif

2.AFE94X.c

代码如下(示例):

#include "AFE94X.h"
//初始化AF94X
void AFE9XX_Init(void)
{
  //拉PWDN和RST
	GPIO_InitTypeDef GPIO_Initure;
    AFE94x_START_GPIO_CLK_ENABLE();           //开启START时钟
	AFE94x_PWDN_GPIO_CLK_ENABLE();            //开启PWDN时钟
	AFE94x_DRDY_GPIO_CLK_ENABLE();            //开启DRDY时钟
	AFE94x_REST_GPIO_CLK_ENABLE();            //开启REST时钟
	
    GPIO_Initure.Pin=AFE94x_DRDY_PIN;         //DRDY
    GPIO_Initure.Mode=GPIO_MODE_INPUT;  
    GPIO_Initure.Pull=GPIO_PULLUP;          
    GPIO_Initure.Speed=GPIO_SPEED_HIGH;     
    HAL_GPIO_Init(AFE94x_DRDY_GPIO_PORT,&GPIO_Initure);
	
	GPIO_Initure.Pin=AFE94x_PWDN_PIN;          //PWDN
    GPIO_Initure.Mode=GPIO_MODE_OUTPUT_PP;  
    GPIO_Initure.Pull=GPIO_PULLUP;          
    GPIO_Initure.Speed=GPIO_SPEED_HIGH;     
    HAL_GPIO_Init(AFE94x_PWDN_GPIO_PORT,&GPIO_Initure);
	
	GPIO_Initure.Pin=AFE94x_START_PIN;         //START
    GPIO_Initure.Mode=GPIO_MODE_OUTPUT_PP;  
    GPIO_Initure.Pull=GPIO_PULLUP;          
    GPIO_Initure.Speed=GPIO_SPEED_HIGH;     
    HAL_GPIO_Init(AFE94x_START_GPIO_PORT,&GPIO_Initure);
	
    GPIO_Initure.Pin=AFE94x_REST_PIN;           //REST
    GPIO_Initure.Mode=GPIO_MODE_OUTPUT_PP;  
    GPIO_Initure.Pull=GPIO_PULLUP;          
    GPIO_Initure.Speed=GPIO_SPEED_HIGH;     
    HAL_GPIO_Init(AFE94x_REST_GPIO_PORT,&GPIO_Initure);
	
	HAL_GPIO_WritePin(AFE94x_PWDN_GPIO_PORT,AFE94x_PWDN_PIN,1);  //拉高PWDN
	HAL_GPIO_WritePin(AFE94x_REST_GPIO_PORT,AFE94x_REST_PIN,0);  //拉低REST
	HAL_Delay(1);
	HAL_GPIO_WritePin(AFE94x_REST_GPIO_PORT,AFE94x_REST_PIN,1);  //拉低REST
	HAL_GPIO_WritePin(AFE94x_START_GPIO_PORT,AFE94x_START_PIN,0);//START
	
	AFE9XX_Command(AFE94X_RESET);

}
//获取芯片的ID号
uint8_t AFE9XX_GetChipID(void)
{
    uint8_t ID;
    ID=AFE9XX_GetReg(AFE94X_ID);
    return ID;
}
//获取芯片寄存器值
uint8_t AFE9XX_GetReg(uint8_t Rreg)
{
   uint8_t TxData[3];
   uint8_t RxData[3];
   uint8_t Reg_Val=0;
	//寄存器地址小于0X1F
   if(Rreg <= 0X1F)
   {
		//读取命令,选择要读取的寄存器
		TxData[0]=AFE94X_RREG|Rreg;
		//读取单个寄存器
		TxData[1]=0x00;
		Lpspi_Read(3,TxData,RxData);
		//返回寄存器值
   }
   //寄存器地址大于0X1F
   else
   {
	   //获取CONFIG8寄存器Value
		Reg_Val=AFE9XX_GetReg(AFE94X_CONFIG8);
		//写入CONFIG8寄存器地址偏移命令,
		TxData[0]=AFE94X_WREG|AFE94X_CONFIG8;
		//选择要写入的的寄存器
		TxData[1]=0x00;
		//读取写入寄存器
		TxData[2]=Reg_Val|0x80;  //SET ADDR_OFFSET
		Lpspi_Write(3,TxData);
	   
	   //读取命令,
		TxData[0]=AFE94X_RREG|Rreg;
		//选择要读取的寄存器
		TxData[1]=0x00;
		//开始读取
		Lpspi_Read(3,TxData,RxData);
		//返回寄存器值
	   
	   //清除CONFIG8寄存器地址偏移位,
		TxData[0]=AFE94X_WREG|AFE94X_CONFIG8;
		//选择要写入的的寄存器
		TxData[1]=0x00;
		//读取写入寄存器
		TxData[2]=Reg_Val&0X7F;  //Clear ADDR_OFFSET
		Lpspi_Write(3,TxData);  
   }
    return RxData[2];
}
//写单个芯片寄存器值
void AFE9XX_WriteReg(uint8_t Wreg,uint8_t Data)
{
    uint8_t TxData[3];
	uint8_t Reg_Val=0;
	//寄存器地址小于0X1F
	if(Wreg<=0x1F)
	{
		//写入命令,
		TxData[0]=AFE94X_WREG|Wreg;
		//选择要写入的的寄存器
		TxData[1]=0x00;
		//读取写入寄存器
		TxData[2]=Data;
		Lpspi_Write(3,TxData);
	}
	//寄存器地址大于0X1F
	else
	{
		//获取CONFIG8寄存器Value
		Reg_Val=AFE9XX_GetReg(AFE94X_CONFIG8);
		//写入CONFIG8寄存器地址偏移命令,
		TxData[0]=AFE94X_WREG|AFE94X_CONFIG8;
		//选择要写入的的寄存器
		TxData[1]=0x00;
		//读取写入寄存器
		TxData[2]=Reg_Val|0x80;  //SET ADDR_OFFSET
		Lpspi_Write(3,TxData);
		//写入命令,
		TxData[0]=AFE94X_WREG|Wreg;
		//选择要写入的的寄存器
		TxData[1]=0x00;
		//读取写入寄存器
		TxData[2]=Data;
		Lpspi_Write(3,TxData);
		
		//清除MISC_ANA寄存器地址偏移位,
		TxData[0]=AFE94X_WREG|AFE94X_CONFIG8;
		//选择要写入的的寄存器
		TxData[1]=0x00;
		//读取写入寄存器
		TxData[2]=Reg_Val&0X7F;  //Clear ADDR_OFFSET
		Lpspi_Write(3,TxData);
	}
    
}
//写多个芯片寄存器值
//StartReg 起始寄存器地址
//RegNum 要写的寄存器数量
//*Data  寄存器参数传入
void AFE9XX_WriteMultiReg(uint8_t StartReg,uint8_t RegNum,uint8_t *Data)
{
    uint8_t TxData[52];
    uint8_t i;
    //写入命令,
    TxData[0]=AFE94X_WREGX;
	TxData[1]=StartReg;
    //选择要写入的的寄存器
    TxData[2]=RegNum-1;
    for(i=1;i<=RegNum;i++)
    {
       //将指针数据赋值给Txdata
       TxData[2+i]=*Data;
       //指向下个数据地址
       Data++;
    }
    //最终发送多少个数据
    Lpspi_Write(3+RegNum,TxData);
}
//读多个芯片寄存器值
//StartReg 起始寄存器地址
//RegNum 要写的寄存器数量
//*Data  寄存器参数传出
void AFE9XX_ReadMultiReg(uint8_t StartReg,uint8_t RegNum,uint8_t *Data)
{
    //读取寄存器
    uint8_t TxData[24]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
    //读取命令,
    TxData[0]=AFE94X_RREGX;
	TxData[1]=StartReg;
    //选择要写入的的寄存器
    TxData[2]=RegNum-1;
    //最终接收多少个数据
    Lpspi_Read(3+RegNum,TxData,Data);
}
//发送AFE9XX 数据指令 如SDATAC或者RDATAC
//详情见头文件command define部分
void AFE9XX_Command(uint8_t Com)
{
    uint8_t TxData[1];
	TxData[0]=Com;
    Lpspi_Write(1,TxData);
}
//测量固有噪声
//返回噪声值
float AFE9XX_Noise_Test(uint8_t *Rxdata)
{
	//set->pga=1 and Input shorted (for offset or noise measurements) 
	uint8_t Chset[]={0X11,0X11,0X11,0X11,0X11,0X11,0X11,0X11,0X11,0X11};
	uint8_t Txdata[]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
	uint32_t AD_Value=0;
	float Voltage;
	//停止连续读数据
	AFE9XX_Command(AFE94X_SDATAC);
	//PGA_Gain set 1
	AFE9XX_WriteMultiReg(AFE94X_CH1SET,8,Chset);
	//singel shot mode
	AFE9XX_WriteReg(AFE94X_CONFIG4,AFE94X_SHOT_MODE);
	//SET 250SPS
	AFE9XX_WriteReg(AFE94X_CONFIG1,0x06);
	AFE9XX_WriteReg(AFE94X_CONFIG2,0x00);
	//设置内部基准默认基准2.4V
	AFE9XX_WriteReg(AFE94X_CONFIG3,INT_REF_EN);
	//启动转换
	AFE9XX_Command(AFE94X_START);
	//连续读数据
	AFE9XX_Command(AFE94X_RDATAC);
	while(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_12));
	Lpspi_Read(27,Txdata,Rxdata);
	//select single Channel Value
	AD_Value = (Rxdata[3]<<16|Rxdata[4]<<8|Rxdata[5]);
	//MSB=1->采集数据为负数
	if((AD_Value>>16)&0X80)        
	{
		AD_Value = ~AD_Value;
		AD_Value = AD_Value&0X7FFFFF;
	}
	Voltage = (AD_Value*(2.4/8388607))*1000;
	return Voltage;
	
}	
//测量内部测试信号1mv(VREF->2.4V)
void AFE9XX_SINGLE_TEST(uint8_t *Rxdata)
{
	//Select Test sigle
	uint8_t Chset[]={0X05,0X05,0015,0X05,0X05,0X05,0X05,0X05,0X05,0X05};
	uint8_t Txdata[]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
	//停止连续数据传输
	AFE9XX_Command(AFE94X_SDATAC);
	AFE9XX_WriteMultiReg(AFE94X_CH1SET,8,Chset);
	AFE9XX_WriteReg(AFE94X_CONFIG2,0x10);
	//设置内部基准
	AFE9XX_WriteReg(AFE94X_CONFIG3,INT_REF_EN|AFE94X_REF_2_4V);
	//启动转换
	AFE9XX_Command(AFE94X_START);
	//连续读数据
	AFE9XX_Command(AFE94X_RDATAC);
	while(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_12));
	Lpspi_Read(27,Txdata,Rxdata);
}
//电源测量
float AFE9XX_PWR_Test(uint8_t *Rxdata)
{
	//SET PGA=1 AND 
	uint8_t CHSET[]={0X13,0X13,0X13,0X13,0X13,0X13,0X13,0X13};
	uint8_t Txdata[]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
	uint32_t AD_Value=0;
	float Voltage;
	//停止连续读数据
	AFE9XX_Command(AFE94X_SDATAC);
	//PGA_Gain set 1
	AFE9XX_WriteMultiReg(AFE94X_CH1SET,8,CHSET);
	AFE9XX_WriteReg(AFE94X_CONFIG4,AFE94X_SHOT_MODE);
	AFE9XX_WriteReg(AFE94X_CONFIG1,0x06);
	AFE9XX_WriteReg(AFE94X_CONFIG2,0x00);
	//设置内部基准4V
	AFE9XX_WriteReg(AFE94X_CONFIG3,INT_REF_EN|AFE94X_REF_4V);
	//启动转换
	AFE9XX_Command(AFE94X_START);
	//连续读数据
	AFE9XX_Command(AFE94X_RDATAC);
	while(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_12));
	Lpspi_Read(27,Txdata,Rxdata);
	//select single Channel Value
	AD_Value = (Rxdata[3]<<16|Rxdata[4]<<8|Rxdata[5]);
	if((AD_Value>>16)&0X80)        //MSB=1->采集数据为负数
	{
		AD_Value = ~AD_Value;
		AD_Value = AD_Value&0X7FFFFF;
	}
	Voltage = (AD_Value*(4.0/8388607))*1000;
	return Voltage;
}
void AFE9XX_DCLEAD_OFF(uint8_t *Rxdata)
{
	//Select loff channel
	uint8_t PGA_Gain[]={0X10,0X10,0X10,0X10,0X10,0X10,0X10,0X10};
	uint8_t Txdata[]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
	//停止连续数据传输
	AFE9XX_Command(AFE94X_SDATAC);
	//使能直流导联脱落,设置比较阈值
	AFE9XX_WriteReg(AFE94X_LOFF,AFE94X_COMP_70_30|FLEAD_DC_LEAD);
	//内部比较器上电
	AFE9XX_WriteReg(AFE94X_CONFIG4,AFE94X_COMP_PDEN);
	//选择使能导联脱离通道
	AFE9XX_WriteReg(AFE94X_LOFF_SENSN,0XFF);
	AFE9XX_WriteReg(AFE94X_LOFF_SENSP,0XFF);
	//设置内部基准
	AFE9XX_WriteReg(AFE94X_CONFIG3,INT_REF_EN|AFE94X_REF_4V);
	//启动转换
	AFE9XX_Command(AFE94X_START);
	//连续读数据
	AFE9XX_Command(AFE94X_RDATAC);
	while(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_12));
	Lpspi_Read(27,Txdata,Rxdata);
}
//读温度传感器
//返回温度值℃
float AFE9XX_GetTempture(uint8_t *Rxdata)
{
	uint8_t PGA_Gain[]={0X14,0X14,0X14,0X14,0X14,0X14,0X14,0X14};
	uint8_t Txdata[]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
	uint32_t AD_Value=0;
	float Temp_Value;
	//停止连续读数据
	AFE9XX_Command(AFE94X_SDATAC);
	//PGA_Gain set 1
	AFE9XX_WriteMultiReg(AFE94X_CH1SET,8,PGA_Gain);
	AFE9XX_WriteReg(AFE94X_CONFIG4,AFE94X_SHOT_MODE);
		
	AFE9XX_WriteReg(AFE94X_CONFIG1,0x06);
	AFE9XX_WriteReg(AFE94X_CONFIG2,0x00);
	//设置内部基准
	AFE9XX_WriteReg(AFE94X_CONFIG3,INT_REF_EN|AFE94X_REF_2_4V);
	//启动转换
	AFE9XX_Command(AFE94X_START);
	//连续读数据
	AFE9XX_Command(AFE94X_RDATAC);
	while(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_12));
	Lpspi_Read(27,Txdata,Rxdata);
	//select single Channel Value
	AD_Value = (Rxdata[3]<<16|Rxdata[4]<<8|Rxdata[5]);
	if((AD_Value>>16)&0X80)        //MSB=1->采集数据为负数
	{
		AD_Value = ~AD_Value;
		AD_Value = AD_Value&0X7FFFFF;
		
	}
	Temp_Value = (((AD_Value*(2.4/8388607))*1000000-143200)/481)+25;
	return Temp_Value;
}	
//读单个ADC通道电压值(PGA=1)
//AIN_Channel 要读ADC通道
//AFE94X_REF 内部基准选择
//返回单通道ADC电压值(mv)
float AFE9xx_GetValue(uint8_t AIN_CH,uint8_t AFE94X_REF,uint8_t *Rxdata)
{
	uint8_t PGA_Gain[]={0X10,0X10,0X10,0X10,0X10,0X10,0X10,0X10};
	uint8_t Txdata[]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
	uint32_t AD_Value=0;
	float Voltage;
	//停止连续读数据
	AFE9XX_Command(AFE94X_SDATAC);
	//PGA_Gain set 1
	AFE9XX_WriteMultiReg(AFE94X_CH1SET,8,PGA_Gain);
	AFE9XX_WriteReg(AFE94X_CONFIG4,AFE94X_SHOT_MODE);
	AFE9XX_WriteReg(AFE94X_CONFIG1,0x06);
	AFE9XX_WriteReg(AFE94X_CONFIG2,0x00);
	//设置内部基准4V
	AFE9XX_WriteReg(AFE94X_CONFIG3,INT_REF_EN|AFE94X_REF);
	//启动转换
	AFE9XX_Command(AFE94X_START);
	//连续读数据
	AFE9XX_Command(AFE94X_RDATAC);
	while(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_12));
	Lpspi_Read(27,Txdata,Rxdata);
	//select single Channel Value
	AD_Value = (Rxdata[3+(AIN_CH*3)]<<16|Rxdata[4+(AIN_CH*3)]<<8|Rxdata[5+(AIN_CH*3)]);
	//MSB=1->采集数据为负数
	if((AD_Value>>16)&0X80)        
	{
		AD_Value = ~AD_Value;
		AD_Value = AD_Value&0X7FFFFF;
	}
	//内部基准选择2.4V
	if(AFE94X_REF==AFE94X_REF_2_4V)
	{
		Voltage = (AD_Value*(2.4/8388607))*1000;
	}
	//内部基准选择4V
	else if(AFE94X_REF==AFE94X_REF_4V)
	{
		Voltage = (AD_Value*(4.0/8388607))*1000;
	}
	//外部基准
	else if(AFE94X_REF == EXT_REF_EN)
	{
		//Voltage = (AD_Value*(LSB)*1000;
	}
	return Voltage;
}
//读多通道ADC电压值(PGA=1)
//AFE94X_REF 基准选择
// * AFE94X_REF_2_4V 
// * AFE94X_REF_4V 
// * AFE94X_EXT_REF
//Voltage 返回多通道ADC电压值(mv)
void AFE94X_GetAllValue(uint8_t AFE94X_REF,uint8_t *Rxdata,float *Voltage)
{
	uint8_t PGA_Gain[]={0X10,0X10,0X10,0X10,0X10,0X10,0X10,0X10};
	uint8_t Txdata[]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
	uint32_t AD_Value=0;
	//停止连续读数据
	AFE9XX_Command(AFE94X_SDATAC);
	//PGA_Gain set 1,MUX Normal input
	AFE9XX_WriteMultiReg(AFE94X_CH1SET,8,PGA_Gain);
	//单次模式
	AFE9XX_WriteReg(AFE94X_CONFIG4,AFE94X_SHOT_MODE);
	//设置采样率
	AFE9XX_WriteReg(AFE94X_CONFIG1,0x06);
	//设置内部基准
	AFE9XX_WriteReg(AFE94X_CONFIG3,INT_REF_EN|AFE94X_REF);
	//启动转换
	AFE9XX_Command(AFE94X_START);
	//连续读数据
	AFE9XX_Command(AFE94X_RDATAC);
	while(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_12));
	Lpspi_Read(27,Txdata,Rxdata);
	for(int i=0;i<8;i++)
	{
		AD_Value = (Rxdata[3+(i*3)]<<16|Rxdata[4+(i*3)]<<8|Rxdata[5+(i*3)]);
		 //MSB=1->采集数据为负数
		if((AD_Value>>16)&0X80)       
		{
			AD_Value = ~AD_Value;
			AD_Value = AD_Value&0X7FFFFF;
		}
		//内部基准选择2.4V
		if(AFE94X_REF==AFE94X_REF_2_4V)
		{
			Voltage[i] = (AD_Value*(2.4/8388607))*1000;
		}
		//内部基准选择4V
		else if(AFE94X_REF==AFE94X_REF_4V)
		{
			Voltage[i] = (AD_Value*(4.0/8388607))*1000;
		}
		//外部基准
		else if(AFE94X_REF==EXT_REF_EN)
		{
			//Voltage[i] = (AD_Value*(LSB)*1000;
		}
	}
}
//右腿驱动
void TEST_RLD_SINGLE(uint8_t *Rxdata)
{
	uint8_t Txdata[]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
	uint32_t AD_Value=0;
	//停止连续读数据
	AFE9XX_Command(AFE94X_SDATAC);
	//channel 1-3 PGA_Gain set 1,MUX Normal input
	AFE9XX_WriteReg(AFE94X_CH1SET,AFE94X_PGA_1|MUX_Normal_input);
	AFE9XX_WriteReg(AFE94X_CH2SET,AFE94X_PGA_1|MUX_Normal_input);
	AFE9XX_WriteReg(AFE94X_CH3SET,AFE94X_PGA_1|MUX_Normal_input);
	//channel 1-3 connect RLD
	AFE9XX_WriteReg(AFE94X_RLD_SENSP,0X07);
	AFE9XX_WriteReg(AFE94X_RLD_SENSN,0X07);
	AFE9XX_WriteReg(AFE94X_CONFIG3,0X1C);
	//set channel 4-5
	AFE9XX_WriteReg(AFE94X_CH4SET,AFE94X_CH_PD|AFE94X_PGA_1|MUX_RLD_DRN);
	AFE9XX_WriteReg(AFE94X_CH5SET,AFE94X_CH_PD|AFE94X_PGA_1|MUX_RLD_Test);
	//单次模式
	AFE9XX_WriteReg(AFE94X_CONFIG4,AFE94X_SHOT_MODE);
	//设置采样率
	AFE9XX_WriteReg(AFE94X_CONFIG1,0x06);
	//设置内部基准
	AFE9XX_WriteReg(AFE94X_CONFIG3,INT_REF_EN|AFE94X_REF_2_4V );
	//启动转换
	AFE9XX_Command(AFE94X_START);
	//连续读数据
	AFE9XX_Command(AFE94X_RDATAC);
	//等待DRDY
	while(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_12));
	Lpspi_Read(27,Txdata,Rxdata);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

咕咕鸟bird

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

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

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

打赏作者

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

抵扣说明:

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

余额充值