ADS125P08 STM32F103 完整底层驱动(HAL 库,8/16 通道兼容)

ADS125P08 STM32F103 完整底层驱动(HAL 库,8/16 通道兼容)
目录一、硬件引脚宏定义ads125p08_config.h二、底层驱动头文件 ads125p08.h三、底层驱动源文件 ads125p08.cSTM32F103 HAL四、DRDY 外部中断回调stm32f1xx_it.c五、RTOS 采集任务示例8 差分工业 4~20mA六、STM32F10 SPI 初始化说明CubeMX 配置七、驱动适配说明 坑点适配芯片STM32F103C8T6 / STM32F103RET6SPI1 硬件外设硬件 DRDY 外部中断硬件复位引脚一、硬件引脚宏定义ads125p08_config.h#ifndef ADS125P08_CONFIG_H #define ADS125P08_CONFIG_H #include stm32f1xx_hal.h // SPI 硬件SPI1 PA5-SCK PA6-MISO PA7-MOSI #define ADS125P0_SPI_HANDLE hspi1 // 片选 CS_N : PA0 #define ADS125P0_CS_PIN GPIO_PIN_0 #define ADS125P0_CS_PORT GPIOA #define ADS125P0_CS_LOW() HAL_GPIO_WritePin(ADS125P0_CS_PORT, ADS125P0_CS_PIN, GPIO_PIN_RESET) #define ADS125P0_CS_HIGH() HAL_GPIO_WritePin(ADS125P0_CS_PORT, ADS125P0_CS_PIN, GPIO_PIN_SET) // 硬件复位 RESET_N : PA1 #define ADS125P0_RST_PIN GPIO_PIN_1 #define ADS125P0_RST_PORT GPIOA #define ADS125P0_RST_LOW() HAL_GPIO_WritePin(ADS125P0_RST_PORT, ADS125P0_RST_PIN, GPIO_PIN_RESET) #define ADS125P0_RST_HIGH() HAL_GPIO_WritePin(ADS125P0_RST_PORT, ADS125P0_RST_PIN, GPIO_PIN_SET) // DRDY 数据就绪中断 : PA2 EXTI下降沿 #define ADS125P0_DRDY_PIN GPIO_PIN_2 #define ADS125P0_DRDY_PORT GPIOA // ADC 命令定义 #define ADS125P08_CMD_RESET 0x06 #define ADS125P08_CMD_SYNC 0x04 #define ADS125P08_CMD_WAKE 0x00 #define ADS125P08_CMD_WREG 0x40 #define ADS125P08_CMD_RREG 0x20 #define ADS125P08_CMD_RDATA 0x12 #define ADS125P08_CMD_RFIFO 0x14 // 寄存器地址 #define REG_DEVICE_CFG 0x00 #define REG_SEQ_EN 0x01 #define REG_FIFO_CFG 0x02 #define REG_FAULT_MON 0x03 #define REG_SEQ_STEP_BASE 0x04 // SEQ_STEP0~15 0x04~0x13 // SPEED_MODE档位 #define SPEED_1M067 0 // 1.067MSPS 无工频抑制 #define SPEED_333K 1 #define SPEED_41K 2 #define SPEED_2_5S 3 // 2.5SPS 50/60Hz陷波 // PGA增益 #define PGA_1 1 #define PGA_2 2 #define PGA_4 4 #define PGA_8 8 #define PGA_16 16 #define PGA_32 32 // 全局互斥锁信号量 extern osSemaphoreId_t ads125p0_spi_sem; // DRDY中断信号量 extern osSemaphoreId_t ads125p_drdy_sem; #endif二、底层驱动头文件 ads125p08.h#ifndef ADS125P08_H #define ADS125P08_H #include ads125p08_config.h #include cmsis_os2.h #include stdint.h // 序列单步配置结构体 typedef struct { uint8 mux_ch; // 通道号 0~15 uint8 pga_gain; // PGA增益 uint16 osr; // 过采样率 uint16 avg_num; // 单通道平均次数 } SeqStepDef; // 驱动对外API /** * brief 硬件初始化ADC * param diff_mode true8差分, false16单端 * param speed_mode SPEED_xxx档位 * return 0成功 非0失败 */ int ADS125P08_Init(uint8_t diff_mode, uint8_t speed_mode); // 硬件复位ADC void ADS125P08_HardReset(void); // 写寄存器 void ADS125P08_WriteReg(uint8_t reg_addr, uint8_t len, uint8_t *buf); // 读寄存器 void ADS125P08_ReadReg(uint8_t reg_addr, uint8_t len, uint8_t *buf); // 配置SEQ单步通道 void ADS125P08_SetSeqStep(uint8_t step_idx, SeqStepDef cfg); // 开启自动序列采集 void ADS125P08_StartAutoSeq(uint8_t ch_cnt); // 读取FIFO内有效样本数量 uint8_t ADS125P08_GetFifoCnt(void); // 批量读取FIFO raw采样码 void ADS125P08_ReadFifo(uint8_t sample_num, int32_t *raw_buf); // 单SPI字节读写底层 uint8_t ADS125P0_SPI_RW(uint8_t w_data); // 24bit原始码转有符号整数 int32_t ADS125P0_Raw2Signed(uint32 raw24); // 原始码换算电压 float ADS125P0_Raw2Volt(int32 raw, uint8 pga, float vref); // 发送同步唤醒重启采集 void ADS125P08_RestartSeq(void); #endif三、底层驱动源文件 ads125p08.cSTM32F103 HAL#include ads125p08.h #include stm32f1xx_hal_spi.h #include string.h osSemaphoreId_t ads125p0_spi_sem; osSemaphoreId_t ads125p_drdy_sem; /** * SPI单字节读写互斥锁保护总线 */ uint8_t ADS125P0_SPI_RW(uint8_t w_data) { osSemaphoreAcquire(ads125p0_spi_sem, osWaitForever); uint8_t r_data 0; HAL_SPI_TransmitReceive(ADS125P0_SPI_HANDLE, w_data, r_data, 1, 10); osSemaphoreRelease(ads125p0_spi_sem); return r_data; } /** * 硬件复位ADC清空FIFO与寄存器 */ void ADS125P08_HardReset(void) { ADS125P0_RST_LOW(); HAL_Delay(10); ADS125P0_RST_HIGH(); HAL_Delay(5); } /** * 写寄存器函数 */ void ADS125P08_WriteReg(uint8_t reg_addr, uint8_t len, uint8_t *buf) { ADS125P0_CS_LOW(); ADS125P0_SPI_RW(ADS125P08_CMD_WREG | reg_addr); ADS125P0_SPI_RW(len - 1); for(uint8 i 0; i len; i) { ADS125P0_SPI_RW(buf[i]); } ADS125P0_CS_HIGH(); HAL_Delay(1); } /** * 读寄存器函数 */ void ADS125P08_ReadReg(uint8_t reg_addr, uint8_t len, uint8_t *buf) { memset(buf, 0, len); ADS125P0_CS_LOW(); ADS125P0_SPI_RW(ADS125P08_CMD_RREG | reg_addr); ADS125P0_SPI_RW(len - 1); for(uint8 i 0; i len; i) { buf[i] ADS125P0_SPI(0x00); } ADS125P0_CS_HIGH(); HAL_Delay(1); } /** * 配置SEQ序列单通道参数 */ void ADS125P08_SetSeqStep(uint8_t step_idx, SeqStepDef cfg) { uint8 reg_buf[4] {0}; uint8 reg_addr REG_SEQ_STEP_BASE step_idx; reg_buf[0] cfg.mux_ch; reg_buf[1] cfg.pga_gain; reg_buf[2] (uint8)(cfg.osr 8); reg_buf[3] (uint8)(cfg.osr 0xFF); // NUM_AVG暂存如需扩展增加寄存器长度 ADS125P08_WriteReg(reg_addr, 4, reg_buf); } /** * 获取FIFO当前缓存样本数 */ uint8_t ADS125P08_GetFifoCnt(void) { uint8 val 0; ADS125P08_ReadReg(REG_FIFO_CFG, 1, val); return val 0x1F; } /** * 批量读取FIFO N个24bit采样值 */ void ADS125P08_ReadFifo(uint8_t sample_num, int32_t *raw_buf) { memset(raw_buf, 0, sizeof(int32_t)*sample_num); ADS125P0_CS_LOW(); ADS125P0_SPI_RW(ADS125P08_CMD_RFIFO); for(uint8 s 0; s sample_num; s) { uint32 raw24 0; raw24 | ((uint32)ADS125P0_SPI_RW(0x00)) 16; raw24 | ((uint32)ADS125P0_SPI_RW(0x00)) 8; raw24 | (uint32)ADS125P0_SPI_RW(0x00); raw_buf[s] ADS125P0_Raw2Signed(raw24); } ADS125P0_CS_HIGH(); } /** * 24bit无符号原始码转有符号int32 */ int32_t ADS125P0_Raw2Signed(uint32 raw24) { int32 val raw24 0x7FFFFF; if(raw24 0x800000) { val - 0x800000; } return val; } /** * 原始码换算电压 * param raw 有符号24bit采样值 * param pga PGA增益 * param vref 基准2.5/4.096 * return 输入差分电压 */ float ADS125P0_Raw2Volt(int32 raw, uint8 pga, float vref) { float full_scale vref / (float)pga; return (float)raw * full_scale / 8388608.0f; } /** * 同步滤波器 唤醒重启序列 */ void ADS125P08_RestartSeq(void) { ADS125P0_CS_LOW(); ADS125P0_SPI_RW(ADS125P08_CMD_SYNC); ADS125P0_CS_HIGH(); HAL_Delay(1); ADS125P0_CS_LOW(); ADS125P0_SPI_RW(ADS125P08_CMD_WAKE); ADS125P0_CS_HIGH(); HAL_Delay(1); } /** * 开启自动序列采集 * param ch_cnt 需要采集通道总数(8/16) */ void ADS125P08_StartAutoSeq(uint8_t ch_cnt) { uint8 fifo_cfg 0; fifo_cfg | (1 7); // FIFO_EN 开启 fifo_cfg | ch_cnt; // FIFO_TH 填满一整轮触发DRDY ADS125P08_WriteReg(REG_FIFO_CFG, 1, fifo); uint8 seq_en 0x01; // SEQ_EN 自动序列使能 ADS125P08_WriteReg(REG_SEQ_EN, 1, seq_en); ADS125P08_RestartSeq(); } /** * ADC整机初始化 * param diff_mode true8差分 false16单端 * param speed_mode SPEED_xxx * return 0成功 */ int ADS125P08_Init(uint8_t diff_mode, uint8_t speed_mode) { // 1 硬件复位 ADS125P08_HardReset(); // 2 DEVICE_CFG配置 uint8 dev_cfg 0; dev_cfg | (0 6); // CLK 内部25.6M dev_cfg | (1 5); // VREF 4.096V 工业4~20mA推荐 dev_cfg | (1 4); // BUF 输入缓冲开启 dev_cfg | (0 3); // CRC关闭调试提速 dev_cfg | (speed_mode 0x03); ADS125P08_WriteReg(REG_DEVICE_CFG, 1, dev_cfg); // 清空FIFO配置 uint8 fifo_clr 0x00; ADS125P08_WriteReg(REG_FIFO_CFG, 1, fifo_clr); // 清空SEQ_EN uint8 seq_clr 0x00; ADS125P08_WriteReg(REG_SEQ_EN, 1, seq_clr); return 0; }四、DRDY 外部中断回调stm32f1xx_it.c#include ads125p08_config.h void EXTI2_IRQHandler(void) { HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_2); } void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) { if(GPIO_Pin ADS125P0_DRDY_PIN) { osSemaphoreRelease(ads125p_drdy_sem); } }五、RTOS 采集任务示例8 差分工业 4~20mAvoid Task_ADC_Capture(void *arg) { // 创建SPI互斥信号量 ads125p0_spi_sem osSemaphoreNew(1, 1, NULL); ads125p_drdy_sem osSemaphoreNew(16, 0, NULL); // 初始化ADC8差分2.5SPS工频抑制 ADS125P08_Init(1, SPEED_2_5S); // 批量配置8路差分序列 SeqStepDef step_cfg; for(uint8 ch 0; ch 8; ch) { step_cfg.mux_ch ch; step_cfg.pga_gain PGA_1; step_cfg.osr 4096; step_cfg.avg_num 1; ADS125P08_SetSeqStep(ch, step_cfg); } // 启动自动序列 ADS125P08_StartAutoSeq(8); int32 raw_buf[8]; float volt_buf[8]; // 滑动均值缓存 float filter[8][16] {0}; uint8 filter_idx[8] {0}; while(1) { osSemaphoreWait(ads125p_drdy_sem, osWaitForever); uint8 cnt ADS125P08_GetFifoCnt(); if(cnt 8) { ADS125P08_ReadFifo(8, raw_buf); for(uint8 i 0; i 8; i) { // 原始码转电压 volt_buf[i] ADS125P0_Raw2Volt(raw_buf[i], PGA_1, 4.096f); // 16点滑动均值滤波 filter[i][filter_idx[i]] volt_buf[i]; filter_idx[i] (filter_idx[i] 1) % 16; float avg 0; for(uint16 n 0; n 16; n) avg filter[i]; avg / 16.0f; // 4~20mA工程量转换业务函数 Process420mA(i, avg); } } } }六、STM32F10 SPI 初始化说明CubeMX 配置SPI1 模式CPOL0 CPHA18bitMSB 先行波特率预分频 64APB2/64 ≈ 1.125MHz 5MHz 上限PA5 SCK / PA6 MISO / PA7 MOSI 全部推挽复用CS (PA0) / RST (PA1) 通用推挽输出初始高电平DRDY (PA2) 下拉输入EXTI 下降沿触发NVIC 中断优先级配置低于采集任务 5 系统时钟 APB2 72MHz 标准 F103 配置七、驱动适配说明 坑点SPI 时序严格 CPOL0 CPHA1CubeMX 选错会全部乱码 2 DRDY 必须外部中断禁止轮询读取低速 2.5SPS 轮询 CPU 占用极高 3 FIFO 读取必须整轮读取8 通道读 8 个16 通道读 16否则序列错位 4 STM32F103 SPI 最高不能超过 5MHz分频 64 稳定可靠 5 每次 SPI 操作加互斥锁多任务同时读写 SPI 会总线冲突采样错乱 6 硬件复位必须保持 10ms 低电平短复位寄存器不完整初始化 7 24bit 原始码高位在前读取顺序高字节→中字节→低字节不可颠倒 8 此驱动无同步采集能力严禁用于互感器相位校验设备仅工业多通道巡检使用