123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185 |
- #ifndef __ADS1256_SOFT_H__
- #define __ADS1256_SOFT_H__
- #include "stm32l4xx_hal.h"
- #include <stdint.h>
- #include <stdbool.h>
- // ========== 用户配置宏 ==========
- #define ADS1256_SPI_HANDLE hspi2
- //extern SPI_HandleTypeDef ADS1256_SPI_HANDLE;
- #define SPI_TIMEOUT 300 // ms
- // 引脚配置
- // 软件SPI引脚定义
- #define SOFT_SPI_SCK_PORT GPIOB
- #define SOFT_SPI_SCK_PIN GPIO_PIN_13
- #define SOFT_SPI_MOSI_PORT GPIOB
- #define SOFT_SPI_MOSI_PIN GPIO_PIN_15
- #define SOFT_SPI_MISO_PORT GPIOB
- #define SOFT_SPI_MISO_PIN GPIO_PIN_14
- // GPIO操作宏
- #define SOFT_SPI_SCK_HIGH() HAL_GPIO_WritePin(SOFT_SPI_SCK_PORT, SOFT_SPI_SCK_PIN, GPIO_PIN_SET)
- #define SOFT_SPI_SCK_LOW() HAL_GPIO_WritePin(SOFT_SPI_SCK_PORT, SOFT_SPI_SCK_PIN, GPIO_PIN_RESET)
- #define SOFT_SPI_MOSI_HIGH() HAL_GPIO_WritePin(SOFT_SPI_MOSI_PORT, SOFT_SPI_MOSI_PIN, GPIO_PIN_SET)
- #define SOFT_SPI_MOSI_LOW() HAL_GPIO_WritePin(SOFT_SPI_MOSI_PORT, SOFT_SPI_MOSI_PIN, GPIO_PIN_RESET)
- #define SOFT_SPI_MISO_READ() HAL_GPIO_ReadPin(SOFT_SPI_MISO_PORT, SOFT_SPI_MISO_PIN)
- #define ADS1256_CS_GPIO_PORT GPIOB
- #define ADS1256_CS_PIN GPIO_PIN_12
- #define ADS1256_DRDY_GPIO_PORT GPIOA
- #define ADS1256_DRDY_PIN GPIO_PIN_11
- #define ADS1256_RST_GPIO_PORT GPIOA
- #define ADS1256_RST_PIN GPIO_PIN_8
- // ========== 控制宏 ==========
- #define ADS1256_CS_LOW() HAL_GPIO_WritePin(ADS1256_CS_GPIO_PORT, ADS1256_CS_PIN, GPIO_PIN_RESET)
- #define ADS1256_CS_HIGH() HAL_GPIO_WritePin(ADS1256_CS_GPIO_PORT, ADS1256_CS_PIN, GPIO_PIN_SET)
- #define ADS1256_RST_LOW() HAL_GPIO_WritePin(ADS1256_RST_GPIO_PORT, ADS1256_RST_PIN, GPIO_PIN_RESET)
- #define ADS1256_RST_HIGH() HAL_GPIO_WritePin(ADS1256_RST_GPIO_PORT, ADS1256_RST_PIN, GPIO_PIN_SET)
- #define ADS1256_DRDY_READ() HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_11)
- #define ADS1256_READ_DRDY ADS1256_DRDY_READ()
- // ========== 命令定义 ==========
- #define ADS1256_CMD_WAKEUP 0x00 // 从休眠模式唤醒(必须在 SYNC 后使用)退出待机模式
- #define ADS1256_CMD_RDATA 0x01 // 读取数据(一次性读取当前结果)
- #define ADS1256_CMD_RDATAC 0x03 // 启动连续数据读取模式
- #define ADS1256_CMD_SDATAC 0x0F // 停止连续数据读取模式
- #define ADS1256_CMD_RREG 0x10 // 读取寄存器命令(后跟寄存器地址和数量)
- #define ADS1256_CMD_WREG 0x50 // 写寄存器命令(后跟寄存器地址和数量)
- #define ADS1256_CMD_SELFCAL 0xF0 // 启动偏移和增益自动校准
- #define ADS1256_CMD_SELFOCAL 0xF1 // 偏移自校准(接 GND)
- #define ADS1256_CMD_SELFGCAL 0xF2 // 增益自校准(接参考电压)
- #define ADS1256_CMD_SYSOCAL 0xF3 // 系统偏移校准
- #define ADS1256_CMD_SYSGCAL 0xF4 // 系统增益校准
- #define ADS1256_CMD_SYNC 0xFC // 同步命令(等待转换)
- #define ADS1256_CMD_STANDBY 0xFD // 进入低功耗待机模式
- #define ADS1256_CMD_RESET 0xFE // 复位芯片
- // ========== 寄存器定义 ==========
- #define ADS1256_REG_STATUS 0x00 // 状态寄存器:时钟选择、自动校准、缓冲使能等
- #define ADS1256_REG_MUX 0x01 // 多路复用器设置:选择输入通道 AINp 和 AINn
- #define ADS1256_REG_ADCON 0x02 // A/D 控制寄存器:增益选择、时钟配置
- #define ADS1256_REG_DRATE 0x03 // 数据速率设置寄存器
- #define ADS1256_REG_IO 0x04 // 数字 I/O 控制寄存器
- #define ADS1256_REG_OFC0 0x05 // 偏移校准寄存器 OFC0(低字节)
- #define ADS1256_REG_OFC1 0x06 // 偏移校准寄存器 OFC1
- #define ADS1256_REG_OFC2 0x07 // 偏移校准寄存器 OFC2(高字节)
- #define ADS1256_REG_FSC0 0x08 // 全量程校准寄存器 FSC0(低字节)
- #define ADS1256_REG_FSC1 0x09 // 全量程校准寄存器 FSC1
- #define ADS1256_REG_FSC2 0x0A // 全量程校准寄存器 FSC2(高字节)
- // ========== 单端输入通道配置 (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
- // ========== 增益配置 ==========
- typedef enum {
- ADS1256_GAIN_1 = 0, // 增益 x1(默认)
- ADS1256_GAIN_2, // 增益 x2
- ADS1256_GAIN_4, // 增益 x4
- ADS1256_GAIN_8, // 增益 x8
- ADS1256_GAIN_16, // 增益 x16
- ADS1256_GAIN_32, // 增益 x32
- ADS1256_GAIN_64 // 增益 x64(最大)
- } ADS1256_Gain_t;
- // ========== 数据速率 ==========
- typedef enum {
- ADS1256_DR_30000SPS = 0xF0, // 30000 采样/秒
- ADS1256_DR_15000SPS = 0xE0, // 15000
- ADS1256_DR_7500SPS = 0xD0, // 7500
- ADS1256_DR_3750SPS = 0xC0, // 3750
- ADS1256_DR_2000SPS = 0xB0, // 2000
- ADS1256_DR_1000SPS = 0xA1, // 1000(推荐默认)
- ADS1256_DR_500SPS = 0x92, // 500
- ADS1256_DR_100SPS = 0x82, // 100
- ADS1256_DR_60SPS = 0x72, // 60
- ADS1256_DR_50SPS = 0x63, // 50
- ADS1256_DR_30SPS = 0x53, // 30
- ADS1256_DR_25SPS = 0x43, // 25
- ADS1256_DR_15SPS = 0x33, // 15
- ADS1256_DR_10SPS = 0x23, // 10
- ADS1256_DR_5SPS = 0x13, // 5
- ADS1256_DR_2_5SPS = 0x03 // 2.5(最低速)
- } ADS1256_DataRate_t;
- // ========== 函数声明 ==========
- /*
- 单端模式:MUX = (AINx << 4) | 0x08
- 差分模式:MUX = (AINp << 4) | AINn
- AINCOM 是固定的参考负端引脚(接地或参考电压
- 单端输入:
- AIN0 0x08 AIN0 - AINCOM
- AIN1 0x18 AIN1 - AINCOM
- AIN2 0x28 AIN2 - AINCOM
- AIN3 0x38 AIN3 - AINCOM
- AIN4 0x48 AIN4 - AINCOM
- AIN5 0x58 AIN5 - AINCOM
- AIN6 0x68 AIN6 - AINCOM
- AIN7 0x78 AIN7 - AINCOM
- 差分输入:
- 0x01 AIN0 - AIN1
- 0x23 AIN2 - AIN3
- 0x45 AIN4 - AIN5
- 0x67 AIN6 - AIN7
- */
- // 软件SPI发送单字节(模式0,CPOL=0, CPHA=0)
- static void SoftSPI_WriteByte(uint8_t data);
- // 软件SPI接收单字节
- static uint8_t SoftSPI_ReadByte(void) ;
-
- // 初始化 ADS1256
- void ADS1256_Init(void);
- // 复位
- void ADS1256_Reset(void);
- // 读取芯片 ID(高 4 位)
- uint8_t ADS1256_ReadID(void);
- // 设置输入通道(MUX 寄存器值)
- void ADS1256_SetChannel(uint8_t mux);
- // 设置增益
- void ADS1256_SetGain(ADS1256_Gain_t gain);
- // 设置采样率
- void ADS1256_SetDataRate(ADS1256_DataRate_t dr);
- // 启动一次转换
- void ADS1256_StartConversion(void);
- // 读取数据(需判断 DRDY 是否为低)
- bool ADS1256_ReadData(int32_t* out);
- // 寄存器读取出来的整数转为浮点数电压值
- float ADS1256_ConvertToVoltage(int32_t raw, float vref, int gain);
- // 寄存器操作
- uint8_t ADS1256_ReadRegister(uint8_t reg);
- void ADS1256_WriteRegister(uint8_t reg, uint8_t value);
- void ADS1256_SetClockSource(uint8_t useInternal);
- bool ADS1256_IsUsingExternalClock(void);
- #endif // __ADS1256_H__
|