1.简介
ads1263是一款32位高精度,高分辨数模转换器,还能达到38.4ksps。此外还有一个24位的辅助 Δ- Σ ADC , 适用于后台测量。
2.进行cubemx配置,最大速率为8MHz,SPI模式为1
3.驱动代码
ADS1263.c
void ADS1263_Write_Register(uint8_t Register_Address, uint8_t Data_Byte)
{
HAL_StatusTypeDef ret;
ADS1220_SPI_NSS_ENABLE();
uint8_t SPI_Transmit_Data[3];
SPI_Transmit_Data[0] = 0x40 | (Register_Address); //发送寄存器地址
SPI_Transmit_Data[1] = 0x00; //发送需要更改的寄存器数量
SPI_Transmit_Data[2] = Data_Byte; //发送要写入寄存器的值
ret = HAL_SPI_Transmit(&hspi2, SPI_Transmit_Data, 3, HAL_MAX_DELAY);
ADS1220_SPI_NSS_DISABLE();
}
/*************************************************************************************************
* 函 数 名: ADS1263_RREG
* 入口参数: Register_Address寄存器地址
* 返回值:读取到的寄存器的值
* 函数功能: 对寄存器读出数据
* 说 明: 无
*************************************************************************************************/
uint8_t ADS1263_Read_Register(uint8_t Register_Address)
{
HAL_StatusTypeDef ret;
ADS1220_SPI_NSS_ENABLE();
uint8_t SPI_Transmit_Data[3] = { 0 };
uint8_t SPI_Receive_Data[3] = { 0xff };
SPI_Transmit_Data[0] = 0x20 | (Register_Address);
SPI_Transmit_Data[1] = 0x00;
ret = HAL_SPI_Transmit(&ADS_SPI_HANDLE, SPI_Transmit_Data, 2, 0xffff);
ret = HAL_SPI_Receive(&ADS_SPI_HANDLE, SPI_Receive_Data, 3, 2000);
ADS1220_SPI_NSS_DISABLE();
return SPI_Receive_Data[0]; //返回读出的数据
}
/*************************************************************************************************
* 函 数 名: ADS1263_Conveision_Start_ADC1
* 入口参数: 无
* 返回值:无
* 函数功能: 启动ADC1的转换
* 说 明: 无
*************************************************************************************************/
void ADS1263_Conveision_Start_ADC1()
{
ADS1220_SPI_NSS_ENABLE();
uint8_t SPI_Transmit_Data[1];
SPI_Transmit_Data[0] = ADS1263_CMD_START_ADC1; //发送ADC1开始转换数据命令
HAL_SPI_Transmit(&hspi2, SPI_Transmit_Data, 1, HAL_MAX_DELAY);
ADS1220_SPI_NSS_DISABLE();
}
/*************************************************************************************************
* 函 数 名: ADS1263_Conveision_Start_ADC2
* 入口参数: 无
* 返回值:无
* 函数功能: 启动ADC2的转换
* 说 明: 无
*************************************************************************************************/
void ADS1263_Conveision_Start_ADC2()
{
ADS1220_SPI_NSS_ENABLE();
uint8_t SPI_Transmit_Data[1];
SPI_Transmit_Data[0] = ADS1263_CMD_START_ADC2; //发送ADC2开始转换数据命令
HAL_SPI_Transmit(&hspi2, SPI_Transmit_Data, 1, HAL_MAX_DELAY);
ADS1220_SPI_NSS_DISABLE();
}
void ADS1263_Conveision_Stop_ADC1()
{
ADS1220_SPI_NSS_ENABLE();
uint8_t SPI_Transmit_Data[1];
SPI_Transmit_Data[0] = ADS1263_CMD_STOP_ADC1; //发送ADC2开始转换数据命令
HAL_SPI_Transmit(&hspi2, SPI_Transmit_Data, 1, HAL_MAX_DELAY);
ADS1220_SPI_NSS_DISABLE();
}
/*************************************************************************************************
* 函 数 名: ADS1263_Config_Init
* 入口参数: 无
* 返回值:无
* 函数功能: ADS1263寄存器配置初始化
* 说 明: 请根据不同的应用场景更改函数内容
*************************************************************************************************/
uint8_t ADS1263_Init()
{
uint8_t write[11];
uint8_t id = 0;
uint8_t ret1 = 1;
uint8_t a = 0;
#if 1
// //通用配置
ADS1263_Write_Register(0x01, 0x11); //
ADS1263_Write_Register(ADS1263_INTERFACE, 0x05); //打开状态字节,关闭冗余校验
ADS1263_Write_Register(ADS1263_Mode_0, 0x10);//00 //开启输入切割模式(采集精度更高),进入连续转换模式 //10
ADS1263_Write_Register(ADS1263_Mode_1, 0x60);//60 //使用SINC4滤波器,不同滤波器下的采样噪声会不同
ADS1263_Write_Register(ADS1263_Mode_2, 0x51); //PGA被旁路(否则转换数据值会偏小),数据速率5SPS 0x50 20sps
#endif
ADS1263_Write_Register(0x0d, 0x11); //
ADS1263_Write_Register(0x0e, 0x06); //idac2 idac2
//ADC1配置
ADS1263_Write_Register(0x0f, 0x1b); //0x00使用内部基准0x1b
ADS1263_Write_Register(0x06, 0x23); //AIN2正极输入,AIN3负极输入23 bb
//ADC2配置
ADS1263_Write_Register(ADS1263_ADC2_CONFIGURATION, 0x00); //ADC2数据速率10SPS,使用内部基准,PGA=1
ADS1263_Write_Register(ADS1263_MUX_ADC2, 0xff); //AIN1正极输入,AINCOM负极输入
write[0] = ADS1263_Read_Register(ADS1263_INTERFACE);
write[1] = ADS1263_Read_Register(ADS1263_Mode_0);
write[2] = ADS1263_Read_Register(ADS1263_Mode_1);
write[3] = ADS1263_Read_Register(ADS1263_Mode_2);
write[4] = ADS1263_Read_Register(0x0d);
write[5] = ADS1263_Read_Register(0x0e);
write[6] = ADS1263_Read_Register(ADS1263_REFMUX);
write[7] = ADS1263_Read_Register(0x06);
write[8] = ADS1263_Read_Register(ADS1263_ADC2_CONFIGURATION);
write[9] = ADS1263_Read_Register(ADS1263_MUX_ADC2);
id = ADS1263_Read_Register(0x00); //read id
if (id == 0x23)
{
ret1 = 0;
}
// //启动转换
ADS1263_Conveision_Start_ADC1(); //启动ADC(连续转换模式下,只启动一次)
return ret1;
}
/*************************************************************************************************
* 函 数 名: ADS1263_ReadData_ADC1
* 入口参数: 无
* 返回值:无
* 函数功能: 读取ADC1的转换数据
* 说 明:以阻塞方式读取一个通道的数据,读取通道在ADS1263_Config_Init函数内部更改
*************************************************************************************************/
uint32_t ADS1263_ReadData_ADC1(float *res, double *res1)
{
HAL_StatusTypeDef ret;
uint32_t Conveision_Data;
uint8_t write[10] = { 0 };
uint8_t read[12] = { 0 };
uint8_t sumcrc = 0;
write[0] = ADS1263_CMD_RDATA_ADC1;
ADS1220_SPI_NSS_ENABLE();
ret = HAL_SPI_Transmit(&ADS_SPI_HANDLE, write, 1, 0xffff);
ret = HAL_SPI_Receive(&ADS_SPI_HANDLE, read, 6, 0xffff);
if (ret != HAL_OK)
{
return HAL_ERROR;
}
ADS1220_SPI_NSS_DISABLE();
// HAL_UART_Transmit(&huart2, read, 8, 0xffff);
sumcrc = read[1] + read[2] + read[3] + read[4] + 0x9b;
if (sumcrc != read[5])
{
return HAL_ERROR;
}
if ((read[0] & 0x40) >> 6 == 1)//
{
if (read[0] & 0x1e)
{
return HAL_ERROR;
}
Conveision_Data = (read[1] << 24) | (read[2] << 16) | (read[3] << 8)
| (read[4] << 0); //读取到的6字节数据的低4位拼凑成转换数据
}
else
{
if ((read[0] == 0x01)&&(sumcrc!=0x9b)) //un_update
{
return 0;
}
else
{
return HAL_ERROR;
}
}
return HAL_OK;
}
ADS1263.h
#include <stdbool.h>
#include "main.h"
#include "stm32l1xx_hal.h"
/*******寄存器地址列表************/
#define ADS1263_MUX_ADC1 0x06
#define ADS1263_MUX_ADC2 0x16
#define ADS1263_INTERFACE 0x02
#define ADS1263_Mode_0 0x03
#define ADS1263_Mode_1 0x04
#define ADS1263_Mode_2 0x05
#define ADS1263_REFMUX 0x0F
#define ADS1263_GPIO_Connection 0x12
#define ADS1263_GPIO_Direction 0x13
#define ADS1263_GPIO_Data 0x14
#define ADS1263_TDACP_CONTROL 0x10
#define ADS1263_TDACN_CONTROL 0x11
#define ADS1263_ADC2_CONFIGURATION 0x15
#define ADS1263_IDACMUX 0x0D
#define ADS1263_IDACMAG 0x0E
/************************指令************************/
#define ADS1263_CMD_NOP 0x00
#define ADS1263_CMD_RESET 0x06
#define ADS1263_CMD_RDATA_ADC1 0x12
#define ADS1263_CMD_RDATA_ADC2 0x14
#define ADS1263_CMD_START_ADC1 0x08
#define ADS1263_CMD_START_ADC2 0x0C
#define ADS1263_CMD_STOP_ADC1 0x0A
#define ADS1263_CMD_STOP_ADC2 0x0E
#define ADS1263_CMD_SYOCAL_ADC1 0x16
#define ADS1263_CMD_SYGCAL_ADC1 0x17
#define ADS1263_CMD_SFOCAL_ADC1 0x19
#define ADS1263_CMD_SYOCAL_ADC2 0x1B
#define ADS1263_CMD_SYGCAL_ADC2 0x1C
#define ADS1263_CMD_SFOCAL_ADC2 0x1E
void ADS1263_Conveision_Start_ADC1();
void ADS1263_Conveision_Stop_ADC1();
uint8_t ADS1263_Init();
uint32_t ADS1263_ReadData_ADC1(float *res,double *res1);
float ads1263_getValue(float data);