STM32 HAL库 模拟SPI驱动 ADS1118

发布者:MysticalEssence最新更新时间:2025-10-30 来源: bilibili关键字:STM32  HAL库  模拟SPI  驱动  ADS1118 手机看文章 扫描二维码
随时随地手机看文章

    首先是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 Conversion; // 存储从芯片读取的数据

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


关键字:STM32  HAL库  模拟SPI  驱动  ADS1118 引用地址:STM32 HAL库 模拟SPI驱动 ADS1118

上一篇:【教程】STM32H743驱动RGB屏幕并移植LVGL v8.0
下一篇:STM32CubeMx GPIO口输出

推荐阅读最新更新时间:2026-03-20 19:02

STM32 HAL库 模拟SPI驱动 DAC8564
之前写过DAC8560的模拟SPI驱动,相比较而言DAC8564能够在网上找到的内容更加的丰富,本文主要是介绍讲解STM32 HAL库使用模拟SPI驱动DAC8564。 DAC8560 https://www.bilibili.com/opus/519334650730238240 SPI相关的简介: https://www.bilibili.com/opus/515342298243272188 然后是用STM32CubeMx初始化模拟SPI的引脚: STM32CubeMx的GPIO输出的配置可以参考: https://www.bilibili.com/opus/484177792198506654 这里
[单片机]
stm32 io模拟spi通信
首先借鉴他人的编写程序: #define MOSI_H GPIO_SetBits(GPIOB, GPIO_Pin_10) #define MOSI_L GPIO_ResetBits(GPIOB, GPIO_Pin_10) #define SCLK_H GPIO_SetBits(GPIOB, GPIO_Pin_13) #define SCLK_L GPIO_ResetBits(GPIOB, GPIO_Pin_13) #define MISO GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_11) unsigned char SPI_SendByte(unsigned char dt)
[单片机]
STM32模拟SPI接口
做单片机开发的时候经常需要用到模拟spi接口,这种写法不错的,网上很多类似的,我也拿来主义了。 #define MOSI_H GPIO_SetBits(GPIOB, GPIO_Pin_10) #define MOSI_L GPIO_ResetBits(GPIOB, GPIO_Pin_10) #define SCLK_H GPIO_SetBits(GPIOB, GPIO_Pin_13) #define SCLK_L GPIO_ResetBits(GPIOB, GPIO_Pin_13) #define MISO GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_11) unsigned char SPI_
[单片机]
基于STM32F0的ADS1118驱动源程序
项目用到ADS1118作为AD采集,项目使用MCU为STM32F030,使用STM32CubeMX建立工程 单片机源程序如下: /** ****************************************************************************** * File Name : main.c * Description : Main program body ****************************************************************************** ** This notice applies to
[单片机]
S3c2440裸机-spi编程-3.gpio模拟spi驱动OLED
操作OLED,通过三条线(SCK、DO、CS)与OLED相连,这里没有DI是因为2440只会向OLED传数据而不用接收数据。 gpio_spi.c来实现gpio模拟spi,负责spi通讯。对于OLED,有专门的指令和数据格式,要传输的数据内容,在oled.c这一层来实现,负责组织数据。 因此,我们需要实现以上两个文件。 1.SPI初始化 新建一个gpio_spi.c文件,实现SPI初始化SPIInt() 1.1 GPIO init(pinmux管脚等配置) 上图J3为板子pin2pin到OLED的底座。 GPF1作为OLED片选引脚,设置为输出; GPG4作为OLED的数据(Data)/命令(Command)选择引脚,设置
[单片机]
S3c2440裸机-<font color='red'>spi</font>编程-3.gpio<font color='red'>模拟</font><font color='red'>spi</font><font color='red'>驱动</font>OLED
STM32-24位AD7799驱动之手册代码详解,支持模拟SPI和硬件SPI
1.AD7799介绍 AD7799结构图如下所示: 其中REFIN参考电压建议为2.5V, REFIN电压低于0.1V时,则差分输入ad值就无法检测了,如下图所示: 注意: 如果REG_CONFIG的REF_DET开启的话,那么输入AD值电压低于0.5V时,则差分输入ad值就无法检测了,如下图所示: 2.AD7799差分信号的输入模式 如下图所示,差分输入电压有3种模式: 注意: 单端输入电压(AIN-接地,只有正电压)则支持任意范围,比如In-Amp模式下,单端输入如果为10mv的话,也能检测到. 2.1 Unbuffered Mode非缓冲模式 该模式可测的AD值可以在 -30mV ~ (AVDD+30
[单片机]
STM32-24位AD7799<font color='red'>驱动</font>之手册代码详解,支持<font color='red'>模拟</font><font color='red'>SPI</font>和硬件<font color='red'>SPI</font>
LPC1788-IO模拟SPI--驱动AD7708--寄存器操作
最近在使用AD7708采集数据-本来是想使用LPC1788自带的SSP进行控制,但是在多次实验过程中发现,单个读取寄存器是没有问题的,但是在连续读取时出现问题,一直没有解决,项目着急使用就直接用IO口模拟SPI,比较简单就准确读出了数据,也没有出现上述问题,记之! 个人还是觉得是自己配置的原因,后续会继续研究SSP的控制AD7708,希望能够搞清楚! 主函数只需要调用两个函数---AD7708_Reg_Init();----AD7708_ReadAD_Data(); /*-------ad7708_spi_io.h-------------*/ #ifndef __AD7708_SPI_IO_H #define _
[单片机]
STM32 HAL库】GPIO:按键和LED
文章内容偏向HAL库的移植和使用,以个人观点及了解为主,若与事实不符,则以www.st.com、www.stmcu.org.cn等平台为准。 使用的软件: VSCode(1.36版,带C/C++ IntelliSense插件) Keil MDK(5.26版) 芯片:STM32H743ZIT6(Nucleo-H743平台,B-01版) 所使用的库:STM32Cube_FW_H7_V1.3.0,下载地址:https://www.st.com/content/st_com/en/products/embedded-software/mcu-mpu-embedded-softw
[单片机]
【<font color='red'>STM32</font> <font color='red'>HAL库</font>】GPIO:按键和LED
小广播
最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

厂商技术中心

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2026 EEWORLD.com.cn, Inc. All rights reserved