简介这是一份面向嵌入式开发者的ADS1263驱动源码与ADS1256中文手册合集适用于工业、医疗及科研场景中基于24位高精度ADC进行数据采集的项目。资源共87个文件压缩包大小2.39MB主要包含C/H源码、汇编启动文件、Keil工程配置文件uvproj/uvopt、hex固件、使用说明txt及初始化脚本源码覆盖SPI通信、ADC初始化、多通道配置、中断处理和错误检测等模块并提供初始化、配置、读取数据和关闭设备等接口可直接移植到STM32平台缩短底层驱动开发周期。目录中区分了源程序、库文件、文档和输出文件便于按模块检索。配套ADS1256中文手册可用于对比理解相似Σ-Δ型ADC的寄存器与工作模式差异。已有922人学习下载特别适合正在调试ADS1263/ADS1256驱动、需要可复用工程模板与参考手册的软硬件工程师可省去从零配置寄存器的工作快速完成高精度采集系统搭建。1. 从ADS1256换到ADS1263STM32驱动源码里藏着的高分辨率ADC取舍做多通道高精度采集时ADS1256经常是默认选择但这颗芯片的局限性在评估ADS1263驱动源码后会更清楚。ADS1263同样定位高分辨率ADC但把24位有效分辨率、内置PGA、激励电流源和故障诊断集成在一起称重和RTD测温场景能省掉大量外围电路。源码包基于STM32F103标准外设库ADC1263.c实现寄存器读写与转换控制spi.c处理底层时序main.c串口输出结果拿到手可以直接套到自己的工程里。对已经用过ADS1256的人来说最该警惕的是命令集差异ADS1256的RREG/WREG命令不能直接用在ADS1263上数据长度也从3字节变4字节。这篇文章就从源码文件结构开始重点拆SPI参数、寄存器初始化流程、单次/连续转换代码最后给出移植到其他平台和验证有效位的可复现步骤。适合正在做高精度仪表、需要把采集精度从16位提升到20位以上的工程师。2. 驱动源码结构从STM32标准外设库看ADS1263的SPI接口与初始化分工2.1 源码包内文件到底做了什么拿到压缩包先别急着编译按功能把文件分成三层SPI底层、设备协议层、应用层。ADC1263.c和ADC1263.h是协议层负责组SPI命令、拼数据、执行校准SPI.c和SPI.h是底层完成STM32的SPI外设初始化与单字节收发main.c和stm32f10x_it.c是应用层决定采样时机和数据流向。还有一个dac1263.c它不是ADC驱动的一部分而是板载DAC的驱动用来输出可调电压或电流激励在电桥测量里会与ADC联动。文件/目录职责ADC1263.c/hADS1263命令封装、寄存器读写、校准、通道切换、数据读取SPI.c/hSTM32硬件SPI或模拟SPI单字节收发DAC1263.c/h板载DAC控制输出激励电压/电流key.c/h按键输入用于手动切换通道或触发校准sys_delay.c/h毫秒/微秒延时满足复位和DRDY时序stm32f10x_it.c中断服务例程DRDY下降沿置位keilkill.bat清理Keil编译中间文件我一般会先读main.c看它调用了哪些ADS1263_开头的函数再回ADC1263.c里定位具体实现。这个顺序比从头读头文件效率高。源码里的函数命名基本是“模块_动作”风格比如ADS1263_ReadReg、ADS1263_WriteReg、ADS1263_ReadData迁移到其他平台时这些函数签名可以直接保留只替换SPI层。2.2 SPI通信层硬件SPI参数与引脚分配ADS1263的SPI接口和普通Flash不一样它的DOUT/DRDY是复用引脚CS拉低时该引脚输出转换数据CS拉高时输出数据就绪状态。所以SPI初始化时要特别注意CS控制的时序不能在读取数据的过程中去检测DRDY。源码里SPI.c完成引脚和SPI外设的配置典型代码如下void SPI1_Config(void) { GPIO_InitTypeDef GPIO_InitStructure; SPI_InitTypeDef SPI_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_SPI1, ENABLE); GPIO_InitStructure.GPIO_Pin GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7; GPIO_InitStructure.GPIO_Mode GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Speed GPIO_Speed_50MHz; GPIO_Init(GPIOA, GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin GPIO_Pin_4; GPIO_InitStructure.GPIO_Mode GPIO_Mode_Out_PP; GPIO_Init(GPIOA, GPIO_InitStructure); SPI_InitStructure.SPI_Direction SPI_Direction_2Lines_FullDuplex; SPI_InitStructure.SPI_Mode SPI_Mode_Master; SPI_InitStructure.SPI_DataSize SPI_DataSize_8b; SPI_InitStructure.SPI_CPOL SPI_CPOL_High; SPI_InitStructure.SPI_CPHA SPI_CPHA_2Edge; SPI_InitStructure.SPI_NSS SPI_NSS_Soft; SPI_InitStructure.SPI_BaudRatePrescaler SPI_BaudRatePrescaler_16; SPI_InitStructure.SPI_FirstBit SPI_FirstBit_MSB; SPI_Init(SPI1, SPI_InitStructure); SPI_Cmd(SPI1, ENABLE); }这段配置把SPI1设为8位主模式、MSB先行、CPOLHigh、CPHA2Edge对应SPI Mode 3。ADS1263在这组参数下读寄存器最稳定如果你的板子在GPIO和电源都正常时读ID仍是0xFF优先检查这里。SPI_BaudRatePrescaler_16在STM32F103的72MHz主频下得到4.5MHz的SCK对短接排线足够如果DRDY毛刺频繁可以降到32分频。2.3 寄存器访问命令ADS1263与ADS1256的第一个分岔口ADS1263写寄存器命令是0x40 | 寄存器地址读是0x20 | 寄存器地址ADS1256对应0x50 | 地址和0x10 | 地址。源码里ADC1263.c通常这样封装uint8_t ADS1263_ReadReg(uint8_t addr) { uint8_t val; ADS1263_CS_LOW(); SPI_ExchangeByte(0x20 | addr); SPI_ExchangeByte(0x00); // 寄存器数量-10表示只读1个 val SPI_ExchangeByte(0x00); ADS1263_CS_HIGH(); return val; } void ADS1263_WriteReg(uint8_t addr, uint8_t val) { ADS1263_CS_LOW(); SPI_ExchangeByte(0x40 | addr); SPI_ExchangeByte(0x00); // 只写1个寄存器 SPI_ExchangeByte(val); ADS1263_CS_HIGH(); }第二个字节的低5位表示“寄存器数量减一”0x00表示只操作一个寄存器。这个写法在ADS1263上是固定套路和ADS1256不通用。拿到数据手册后第一件事就是核对这条命令因为把ADS1256的老驱动直接改成ADS1263往往在WriteReg这里就静默失败了。读取器件ID也是用ReadReg如果读回0xFF说明SCK极性错或MISO没接好如果读回0x00大概率是电源或复位问题。提示不同版本的源码可能把复位命令定义成ADS1263_CMD_RESET移到新工程时保持头文件里的宏名一致不要自己重新造常量。3. 核心驱动实现初始化、采样率/增益设置与转换数据读取3.1 初始化流程复位、读ID、写寄存器ADS1263上电后不会自动进入可用的采样状态必须先复位、再确认SPI通信正常然后按应用需求配置输入通道、PGA增益、滤波器和输出速率。源码里初始化函数的骨架如下uint8_t ADS1263_Init(void) { uint8_t id; SPI1_Config(); ADS1263_CS_LOW(); SPI_ExchangeByte(ADS1263_CMD_RESET); ADS1263_CS_HIGH(); delay_ms(5); id ADS1263_ReadReg(ADS1263_REG_DEVICE_ID); if (id 0xFF) { return 1; // SPI时序或接线错误 } ADS1263_WriteReg(ADS1263_REG_SPIDIV, ADS1263_SPIDIV_DIV1); ADS1263_WriteReg(ADS1263_REG_SYS_CTRL, ADS1263_SYSCTRL_PGA_EN); ADS1263_WriteReg(ADS1263_REG_MODE0, ADS1263_MODE0_SPS_1000); ADS1263_WriteReg(ADS1263_REG_MODE1, ADS1263_MODE1_FILTER_SINC4); ADS1263_WriteReg(ADS1263_REG_INPMUX, ADS1263_INPMUX_AIN0_AIN1); return 0; }这里宏名以ADC1263.h为准具体数值请按数据手册核对。复位命令发完后等5ms让内部振荡器和基准稳定。读ID只排除0xFF这种明显异常更可靠的做法是把ID值通过UART打印出来与手册里的DEVICE_ID字段对比。写到SYS_CTRL时PGA使能位要小心增益越高对参考电压的要求越严如果基准纹波大PGA输出会饱和。3.2 单次转换与数据读取32位数据怎么拼才不踩坑ADS1263每次转换输出4字节而ADS1256只输出3字节。这是移植时最容易出的延伸错误。源码里单次读取通常长这样int32_t ADS1263_ReadSingleConvert(void) { uint8_t buf[4]; uint32_t raw 0; ADS1263_CS_LOW(); SPI_ExchangeByte(ADS1263_CMD_RDATA1); // 读取主ADC数据 buf[0] SPI_ExchangeByte(0xFF); buf[1] SPI_ExchangeByte(0xFF); buf[2] SPI_ExchangeByte(0xFF); buf[3] SPI_ExchangeByte(0xFF); ADS1263_CS_HIGH(); raw ((uint32_t)buf[0] 24) | ((uint32_t)buf[1] 16) | ((uint32_t)buf[2] 8) | ((uint32_t)buf[3]); return (int32_t)raw; // 二进制补码直接转有符号 }逻辑说明RDATA1命令后连续读4字节最高字节在前。ADS1263的原始输出是32位二进制补码所以(int32_t)raw就能保留正负号不需要像ADS1256那样把24位数据左移8位再右移8位做符号扩展。有的源码会写return raw 8 8那是从24位ADC移植过来没改干净会导致负半段数据错误。SPI_ExchangeByte(0xFF)只是为了产生SCK时钟发送内容会被ADC忽略。参数说明如果使用HAL库这里对应HAL_SPI_Receive()。单次转换适合间歇采样每次启动后等DRDY再读数据。连续转换适合恒定采样率输出下面看中断如何处理。3.3 连续转换与DRDY中断不要在中断里做SPI读连续转换模式下每次转换结束DRDY引脚在CS为高时产生一个低电平脉冲。源码的main.c里通常用外部中断触发volatile uint8_t ads1263_data_ready 0; void EXTI15_10_IRQHandler(void) { if (EXTI_GetITStatus(EXTI_Line_Drdy) ! RESET) { ads1263_data_ready 1; EXTI_ClearITPendingBit(EXTI_Line_Drdy); } } void MainLoop(void) { if (ads1263_data_ready) { ads1263_data_ready 0; int32_t val ADS1263_ReadSingleConvert(); printf(%ld\r\n, val); } }逻辑说明中断服务程序只置标志位不在中断里调用SPI读取。因为SPI读数据需要拉低CS、连续发4个字节如果在中断里做可能还没读完下一次DRDY又到了还会跟其他SPI设备抢占总线。正确做法是主循环里消费这个标志或者配合DMA。对于ADS1263的DOUT/DRDY复用引脚外部中断要配置在CS为高时采样否则读到的是数据线上的电平变化。参数说明EXTI初始化的触发边沿设为EXTI_Trigger_Falling。启动连续转换用START1命令停止用STOP1如果只测主ADC不要对副ADC发命令有的源码会把两个ADC都启动导致DRDY脉冲翻倍。4. 移植与调试从STM32F103到其他平台的SPI时序适配与ADS1256/1263差异4.1 硬件SPI对接时的修正点从标准外设库换到HAL库或者从STM32F103换到GD32、ESP32、树莓派引脚定义和SPI初始化都要重写但ADS1263的协议层完全可以保留。移植时建议先加一个调试函数把CS和DRDY状态直接打印出来void ADS1263_DebugPins(void) { printf(CS%d DRDY%d\r\n, (int)GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_4), (int)GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_1)); }在SPI配置之前调用确认CS能被拉低、DRDY在转换完成后有电平跳变。很多所谓“驱动不工作”的问题其实是GPIO在复用模式下把SCK和MOSI方向搞反或者把MISO设置成了推挽输出。另一个常见点是DOUT/DRDY的复用关系CS低时它是DOUTCS高时才是DRDY。如果你的板子把DOUT和DRDY分开引出那要看原始驱动内部用的是哪个引脚再改外部中断触发方式。4.2 模拟SPI移植不依赖硬件外设没有硬件SPI时可以用普通GPIO模拟。ADS1263在低速下对时序并不苛刻下面这种MSB-first模式对应SPI Mode 3SCK空闲为高、数据在上升沿被主机采样static uint8_t software_spi_xfer(uint8_t dat) { uint8_t i, ret 0; SCLK_HIGH(); for (i 0; i 8; i) { if (dat 0x80) MOSI_HIGH(); else MOSI_LOW(); SCLK_LOW(); // 下降沿ADC在该时刻更新输出 delay_us(1); SCLK_HIGH(); // 上升沿主机采样MISO delay_us(1); ret 1; if (MISO_READ()) ret | 0x01; dat 1; } return ret; }这段SCK周期约为2μs对应500kHz对ADS1263完全够用。注意模拟SPI最容易犯的错是边沿选反表现为读ID稳定返回0xFF。如果遇到把先拉高再拉低改成先拉低再拉高或者对照手册里的时序图确认采样沿。模拟方式虽然慢但好处是SCK速率可调方便排查长线干扰。4.3 常见坑与错误定位现象直接原因排查方向读ID永远是0xFFSCK极性/相位不对或MISO虚焊用逻辑分析仪抓SCK和MISO确认第一个位数据只有高几位变化数据拼接按24位处理检查RDATA后是否读了4字节符号扩展是否正确DRDY中断频繁进入但读不到新数据DOUT/DRDY在CS低时被误判CS拉高后再检测DRDY或改用独立DRDY引脚连续转换5秒后死掉没有处理SPI超时或CS粘住每次SPI操作前后加超时CS拉低超时自动释放电源纹波大时有效位下降参考电压受数字噪声污染参考引脚加0.1μF10μF电容PGA增益调低再验证ADS1263的PGA增益越大对参考电压和电源纹波越敏感。我一般会先短接输入把输出码的标准差测出来再决定要不要加平均滤波。驱动本身用滤波函数压噪声但治标不治本先解决电源才是正路。4.4 ADS1256与ADS1263的命令/寄存器差异项目ADS1256ADS1263数据输出3字节24位4字节32位原始输出最大输出速率30kSPS40kSPSRREG命令0x100x20WREG命令0x500x40复位命令0xFE0x06内置激励电流源无有表格里这几项是两片ADC最大的差异。把ADS1256驱动移植到ADS1263至少要改三处寄存器命令、数据读取字节数、复位命令。如果ADS1256旧代码里用SPI_ExchangeByte(0x10 | reg)这里会得到完全不同的寄存器内容。标题里的“ads1256中文手册”可以作为参考索引别把它当ADS1263的寄存器手册用两边的寄存器地址和位定义都不一样。5. 基于ADS1263的RTD/电桥测量实战与验证技巧5.1 用短接输入测ENOB先判断驱动有没有“虚高”拿到驱动后第一步不要急着接传感器先短接AIN0和AIN1采集1024个点计算峰峰值噪声。如果这一步过不了接PT100或电桥都意义不大。短接输入测到的是ADC自身噪声、参考噪声和电源纹波的叠加最能反映硬件底子。import statistics import math samples [int(x) for x in open(adc_data.txt)] v_pp max(samples) - min(samples) v_rms statistics.stdev(samples) fsr 2 * 5.0 # 增益1、基准5V时双极性满量程±5V enob math.log2(fsr / v_pp) print(fVpp{v_pp} LSB, ENOB{enob:.1f} bit)说明ENOB这里用峰峰值噪声计算是工程上偏保守的指标用RMS噪声算会好半位到一位。fsr 2 * 5.0是示例实际要按你的基准电压和PGA增益调整比如PGA8、基准2.5V时满量程是2 * 2.5 / 8。如果ENOB明显低于手册标称值先查电源纹波再查模拟输入走线和参考电容。RTD测量时可以用ADS1263内置的激励电流源给PT100供电。源码里dac1263.c如果负责控制激励电流要配合IOMUX寄存器配置。建议的顺序是先打开激励电流源延时稳定后再启动转换不要和ADC采样同时打开否则第一个读数会偏大。验证完短接噪声之后再用精密电阻箱代替传感器分别测0Ω、100Ω、1000Ω把线性度偏差记下来这样能区分是驱动问题还是传感器问题。本文还有配套的精品资源点击获取