#ifndef __ADS1256TB_H
#define __ADS1256TB_H

#include "stm32l4xx_hal.h"

// ==== 命令定义 ====
#define CMD_WAKEUP     0x00  // 从休眠模式唤醒（必须在 SYNC 后使用）退出待机模式
#define CMD_RDATA      0x01  // 读取数据（一次性读取当前结果）
#define CMD_RDATAC     0x03  // 启动连续数据读取模式
#define CMD_SDATAC     0x0F  // 停止连续数据读取模式
#define CMD_RREG       0x10  // 读取寄存器命令（后跟寄存器地址和数量）
#define CMD_WREG       0x50  // 写寄存器命令（后跟寄存器地址和数量）
#define CMD_SELFCAL    0xF0  // 启动偏移和增益自动校准
#define CMD_SYNC       0xFC  // 同步命令（等待转换）
#define CMD_STANDBY    0xFD  // 进入低功耗待机模式
#define CMD_RESET      0xFE  // 复位芯片


// ==== 寄存器定义 ====
#define REG_STATUS     0x00 // 状态寄存器：时钟选择、自动校准、缓冲使能等
#define REG_MUX        0x01 // 多路复用器设置：选择输入通道 AINp 和 AINn
#define REG_ADCON      0x02 // A/D 控制寄存器：增益选择、时钟配置
#define REG_DRATE      0x03 // 数据速率设置寄存器

// ==== 增益 ====
#define GAIN_1         0x00


// ==== 数据率 ====
#define DRATE_30000SPS  0xF0 // 30000 采样/秒 
#define DRATE_15000SPS  0xE0 // 15000
#define DRATE_7500SPS  	0xD0 // 7500
#define DRATE_3750SPS  	0xC0 // 3750
#define DRATE_2000SPS  	0xB0 // 2000
#define DRATE_1000SPS  	0xA1 // 1000（推荐默认）
#define DRATE_500SPS  	0x92 // 500
#define DRATE_100SPS  	0x82 // 100
#define DRATE_60SPS  		0x72 // 60
#define DRATE_50SPS  		0x63 // 50
#define DRATE_30SPS  		0x53 // 30
#define DRATE_25SPS  		0x43 // 25
#define DRATE_15SPS  		0x33 // 15
#define DRATE_10SPS  		0x23 // 10
#define DRATE_5SPS  		0x13 // 5
#define DRATE_2_5SPS  	0x03 // 2.5（最低速）
/*
数据速率（SPS）	有效位数（ENOB）	噪声 RMS (µV)
2.5 SPS					~23 位						~0.3 µV
10 SPS					~22 位						~0.5 µV
100 SPS					~20 位						~2.5 µV
1000 SPS				~17 位						~20  µV
30000 SPS				~12 位						~500 µV
*/

// ==== MUX 输入 ====
#define MUX_AIN0       0x00
#define MUX_AIN1       0x10
#define MUX_AIN2       0x20
#define MUX_AINCOM     0x08

// 1 = 单通道（单端），2 = 双通道（差分）
#define ADS1256_INPUT_MODE  1

// ========== 单端输入通道配置 (AINx - AINCOM) ==========
#define ADS1256_MUX_AIN0_AINCOM    0x08  // AIN0 - AINCOM
#define ADS1256_MUX_AIN1_AINCOM    0x18  // AIN1 - AINCOM
#define ADS1256_MUX_AIN2_AINCOM    0x28  // AIN2 - AINCOM
#define ADS1256_MUX_AIN3_AINCOM    0x38  // AIN3 - AINCOM
#define ADS1256_MUX_AIN4_AINCOM    0x48  // AIN4 - AINCOM
#define ADS1256_MUX_AIN5_AINCOM    0x58  // AIN5 - AINCOM
#define ADS1256_MUX_AIN6_AINCOM    0x68  // AIN6 - AINCOM
#define ADS1256_MUX_AIN7_AINCOM    0x78  // AIN7 - AINCOM

// ========== 差分输入通道配置 (AINp - AINn) ==========
#define ADS1256_MUX_AIN0_AIN1      0x01  // AIN0 - AIN1
#define ADS1256_MUX_AIN2_AIN3      0x23  // AIN2 - AIN3
#define ADS1256_MUX_AIN4_AIN5      0x45  // AIN4 - AIN5
#define ADS1256_MUX_AIN6_AIN7      0x67  // AIN6 - AIN7

// ==== 接口定义 ====
#define ADS1256_CS_LOW()     HAL_GPIO_WritePin(GPIOA, SPI_CS_Pin, GPIO_PIN_RESET)
#define ADS1256_CS_HIGH()    HAL_GPIO_WritePin(GPIOA, SPI_CS_Pin, GPIO_PIN_SET)
#define ADS1256_DRDY_Read()  HAL_GPIO_ReadPin(ADS_DRDY_GPIO_Port, ADS_DRDY_Pin)

// ==== 声明 ====
void ADS1256_Init(SPI_HandleTypeDef *hspi);
void ADS1256_SetChannel(uint8_t mux_pos);
int32_t ADS1256_ReadChannel(uint8_t channel);
int32_t ADS1256_Readdata(void);
float ADS1256_ConvertToVoltage(int32_t adc_val, float vref, uint8_t gain);

#endif
