首先是SPI相关的简介:
https://www.bilibili.com/opus/515342298243272188
然后是用STM32CubeMx初始化模拟SPI的引脚:

STM32CubeMx的GPIO输入输出的配置可以参考:
https://www.bilibili.com/opus/484177792198506654
我所用到的四个输出口分别对应ADS1118上的三个SPI通信口。
SYNC:PA4
SCLK:PA5
DOUT:PA6
DIN:PA7
在具体的应用中可以自行修改头文件中的GPIO口以配合硬件完成工程。
ADS1118 datasheet
https://www.ti.com.cn/lit/gpn/ads1118
ADS1118 数据手册
https://www.ti.com.cn/cn/lit/gpn/ads1118


由上面的信息我们可以知道ADS1118是上升沿触发,此外它有两种通讯模式分别是一段32位和两段16位。



上面这张表是ADS1118中的16位寄存器各个位数对应的信息
Reserved : [0] 转换完成标志
NOP : [1:2] 无操作
PULL_UP_EN : [3] 上拉使能
TS_MODE : [4] 温度传感器模式
DR : [7:5] 数据传输速率
MODE : [8] 设备运行模式
PGA : [11:9] 可编程增益放大器配置
MUX : [14:12] 输入多路复用器配置
SS : [15] 操作状态或单次转换开始
user_ads1118.h
配合硬件修改对应的IO口
#ifndef __USER_ADS1118_H
#define __USER_ADS1118_H
#ifdef __cplusplus
extern 'C' {
#endif
#include 'main.h'
#define CS_H HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_SET)
#define CS_L HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_RESET)
#define SCLK_H HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_SET)
#define SCLK_L HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_RESET)
#define DIN_H HAL_GPIO_WritePin(GPIOA, GPIO_PIN_7, GPIO_PIN_SET)
#define DIN_L HAL_GPIO_WritePin(GPIOA, GPIO_PIN_7, GPIO_PIN_RESET)
#define DOUT HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_6)
/**单次转换启动**/
#define ADS1118_SS_NONE 0 // 无效
#define ADS1118_SS_ONCE 1 // 启动单次转换
/**输入多路复用器配置**/
#define ADS1118_MUX_01 0 // 000 = AINP 为 AIN0 且 AINN 为 AIN1(默认)
#define ADS1118_MUX_03 1 // 001 = AINP 为 AIN0 且 AINN 为 AIN3
#define ADS1118_MUX_13 2 // 010 = AINP 为 AIN1 且 AINN 为 AIN3
#define ADS1118_MUX_23 3 // 011 = AINP 为 AIN2 且 AINN 为 AIN3
#define ADS1118_MUX_0G 4 // 100 = AINP 为 AIN0 且 AINN 为 GND
#define ADS1118_MUX_1G 5 // 101 = AINP 为 AIN1 且 AINN 为 GND
#define ADS1118_MUX_2G 6 // 110 = AINP 为 AIN2 且 AINN 为 GND
#define ADS1118_MUX_3G 7 // 111 = AINP 为 AIN3 且 AINN 为 GND
/**可编程增益放大器配置**/
#define ADS1118_PGA_61 0 // 000 = FSR 为 ±6.144V
#define ADS1118_PGA_40 1 // 001 = FSR 为 ±4.096V
#define ADS1118_PGA_20 2 // 010 = FSR 为 ±2.048V(默认)
#define ADS1118_PGA_10 3 // 011 = FSR 为 ±1.024V
#define ADS1118_PGA_05 4 // 100 = FSR 为 ±0.512V
#define ADS1118_PGA_02 5 // 101 = FSR 为 ±0.256V
/**器件工作模式配置**/
#define ADS1118_MODE_LX 0 // 连续转换模式
#define ADS1118_MODE_DC 1 // 断电并采用单次转换模式(默认)
/**数据传输速率**/
#define ADS1118_DR_8 0 // 000 = 8SPS
#define ADS1118_DR_16 1 // 001 = 16SPS
#define ADS1118_DR_32 2 // 010 = 32SPS
#define ADS1118_DR_64 3 // 011 = 64SPS
#define ADS1118_DR_128 4 // 100 = 128SPS(默认)
#define ADS1118_DR_250 5 // 101 = 250SPS
#define ADS1118_DR_475 6 // 110 = 475SPS
#define ADS1118_DR_860 7 // 111 = 860SPS
/**温度传感器模式**/
#define ADS1118_TS_MODE_ADC 0 // 0 = ADC 模式(默认)
#define ADS1118_TS_MODE_T 1 // 1 = 温度传感器模式
/**上拉使能**/
#define ADS1118_PULL_UP_EN_N 0 // 禁用 DOUT/DRDY 引脚的上拉电阻
#define ADS1118_PULL_UP_EN_E 1 // 使能 DOUT/DRDY 引脚的上拉电阻(默认)
/**控制数据是否写入配置寄存器**/
#define ADS1118_NOP_N 0 // 00 = 无效数据, 不更新配置寄存器内容
#define ADS1118_NOP_W 1 // 01 = 有效数据, 更新配置寄存器(默认)
/**保留**/
#define ADS1118_CNV_RDY_FL 1 // 始终写入 1h
/***************************定义ADS1118中的四个16位寄存器********************************/
typedef union
{
struct
{
uint16_t CNV_RDY_FL : 1 ; // [0] 转换完成标志
uint16_t NOP : 2 ; // [1:2] 无操作
uint16_t PULL_UP_EN : 1 ; // [3] 上拉使能
uint16_t TS_MODE : 1 ; // [4] 温度传感器模式
uint16_t DR : 3 ; // [7:5] 数据传输速率
uint16_t MODE : 1 ; // [8] 设备运行模式
uint16_t PGA : 3 ; // [11:9] 可编程增益放大器配置
uint16_t MUX : 3 ; // [14:12]输入多路复用器配置
uint16_t SS : 1 ; // [15] 操作状态或单次转换开始
}ConfigDef_T ;
uint16_t Bytes ;
}ConfigDef ;
typedef enum
{
CS_0 = 0 ,
CS_1
}
chipselect;
/***************************声明ADS1118中的四个16位寄存器********************************/
extern ConfigDef Config ;
extern float DP[8]; // 显示处理后的八通道数据
uint16_t ReadAds1118(uint16_t Data);
void ADS1118Init(uint8_t ss,uint8_t mode ,uint8_t dr,uint8_t pue,uint8_t nop) ;
void GetData(uint8_t mux,uint8_t pga,uint8_t tsmode) ;
#ifdef __cplusplus
}
#endif
#endif
user_ads1118.c
24位从高到低通过移位的方法依次发出,发送这24位前我们需要先拉低CS,在发送完成后再拉高。
注意:由于是下降沿触发因此我们需要先移位再拉低时钟
#include 'main.h'
#include 'user_ads1118.h'
#include uint16_t Conversion1; // 存储从芯片读取的数据 float Voltage; // 存储需要显示的测量电压值 float BaseV; // 采集电压的压基 uint8_t firstflag; // 第一次进入标志 uint8_t collect; // 每次采集的数据位置 float DP[8]; // 显示处理后的八通道数据 ConfigDef Config; /** * 函数名称:ReadAds1118 * 函数功能:通过SPI给Ads1118发数据 * 形 参:需要配置的adc寄存器数据 * 返回值 :采集到的16位数据 */ uint16_t ReadAds1118(uint16_t Data) { uint8_t i; uint16_t returnData = 0x0000; HAL_Delay(1); SCLK_L; DIN_L; CS_H; CS_L; for(i = 0; i < 16;i++) { if(Data & 0x8000) DIN_H; else DIN_L; Data<<=1; SCLK_H; returnData<<=1; if(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_6) == 1) returnData |= 0x0001; SCLK_L; } CS_H; HAL_Delay(1); DIN_L; return returnData; } /** * 函数名称:ADS1118Init * 函数功能:初始化配置寄存器值 * 形 参:单次转换,工作模式,传输速率,上拉使能,更新数据 * 返回值 :无 */ void ADS1118Init(uint8_t ss,uint8_t mode ,uint8_t dr,uint8_t pue,uint8_t nop) { Config.ConfigDef_T.SS = ss; // 设置为无效果 Config.ConfigDef_T.MODE = mode; // 设置为连续转换模式 Config.ConfigDef_T.DR = dr; // 设置转换速率为128 SPS Config.ConfigDef_T.PULL_UP_EN = pue; // 设置DOUT上拉使能 Config.ConfigDef_T.NOP = nop; // 设置有效数据,更新配置寄存器 Config.ConfigDef_T.CNV_RDY_FL = 0x01; // 保留位,始终写1 Conversion = 0; Voltage = 0; BaseV = 0; firstflag = 0; } /** * 函数名称:GetData * 函数功能:通过SPI配置寄存器值并连续采集五次数据求平均值 * 形 参:通道选择,放大器增益,工作模式 * 返回值 :无 */ void GetData(uint8_t mux,uint8_t pga,uint8_t tsmode) { float FV[10]; // 存储连续的五次转换数据 float displayData; Config.ConfigDef_T.MUX = mux; // 设置为AIN0和GND Config.ConfigDef_T.PGA = pga; // 设置FSR=±4.096V Config.ConfigDef_T.TS_MODE = tsmode;// 设置温度传感器模式为ADC模式 switch (pga) { case 0: BaseV = 187.5; // 压基单位为uV break; case 1: BaseV = 125; break; case 2: BaseV = 62.5; break; case 3: BaseV = 31.25; break; case 4: BaseV = 15.625; break; case 5: BaseV = 7.8125; break; } for(uint8_t t=0;t<5;t++) { HAL_Delay(1); if((HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_6) == 0)||(firstflag == 0)) // CS需要周期性拉低来检测是否有新的数据产生(检测INPUT引脚是否有低电平) { Conversion = ReadAds1118(Config.Bytes); Conversion1 = Conversion; Voltage = (BaseV*Conversion)/1000000; // 转换单位:uV→V Conversion = 0; // 数据显示之后清零 firstflag = 1; } FV[t] = Voltage; HAL_Delay(15); // 延迟时间不能低于15ms } displayData = (FV[1]+FV[2]+FV[3]+FV[4] )/4; firstflag = 0; switch(mux) { case ADS1118_MUX_0G: DP[0] = displayData; break; case ADS1118_MUX_1G: DP[1] = displayData; break; case ADS1118_MUX_2G: DP[2] = displayData; break; case ADS1118_MUX_3G: DP[3] = displayData; break; } } 使用示例 GetData(ADS1118_MUX_0G,ADS1118_PGA_20,ADS1118_TS_MODE_ADC); // AINP 为 AIN0 且 AINN 为 GND,FSR 为 ±2.048V,ADC 模式 GetData(ADS1118_MUX_1G,ADS1118_PGA_20,ADS1118_TS_MODE_ADC); // AINP 为 AIN1 且 AINN 为 GND,FSR 为 ±2.048V,ADC 模式 GetData(ADS1118_MUX_2G,ADS1118_PGA_20,ADS1118_TS_MODE_ADC); // AINP 为 AIN2 且 AINN 为 GND,FSR 为 ±2.048V,ADC 模式 GetData(ADS1118_MUX_3G,ADS1118_PGA_20,ADS1118_TS_MODE_ADC); // AINP 为 AIN3 且 AINN 为 GND,FSR 为 ±2.048V,ADC 模式 参考文献: 关于ADS1118的调试笔记(基于STM32): https://blog.csdn.net/Hgrjtz/article/details/105664562 16-bit, 860-SPS, 4-channel, delta-sigma ADC with PGA, oscillator, VREF, temp sensor and SPI: https://www.ti.com.cn/cn/lit/ds/symlink/ads1118.pdf
上一篇:【教程】STM32H743驱动RGB屏幕并移植LVGL v8.0
下一篇:STM32CubeMx GPIO口输出
推荐阅读最新更新时间:2026-03-20 19:02
- ADR435B 5 Vout 超低噪声 XFET 电压基准的典型应用,具有灌电流和拉电流能力
- 使用 Analog Devices 的 ADP8140 的参考设计
- NCP699SN30T1G 150mA、3 路输出电压 CMOS 低 Iq LDO 的典型应用,在 TSOP-5 中启用
- ZTL431过压/欠压保护电路典型应用
- 使用 Microchip Technology 的 DVR2802B3 的参考设计
- 开源的浮游生物监测分析设备PlanktoScope
- STK503,旨在评估 AT90USB AVR MCU 的入门套件,通过 AVR Studio 支持 JTAGICE mkII 和 AVRISP mkII
- 使用 BittWare 的 XCVU190 的参考设计
- 远程声控参考设计
- NCP4354AADAPGEVB,用于 NCP4354、65W 适配器关闭模式控制器的评估板

stm32驱动屏IC rm68042
电机驱动教程
非常经典的关于LLC的杨波博士论文
XC6406PP60DL






京公网安备 11010802033920号