惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
人人都是产品经理
人人都是产品经理
Cisco Talos Blog
Cisco Talos Blog
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
V
V2EX
博客园 - 三生石上(FineUI控件)
Martin Fowler
Martin Fowler
WordPress大学
WordPress大学
D
Docker
S
SegmentFault 最新的问题
博客园 - 聂微东
美团技术团队
Apple Machine Learning Research
Apple Machine Learning Research
月光博客
月光博客
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
Last Week in AI
Last Week in AI
M
MIT News - Artificial intelligence
F
Fortinet All Blogs
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
The GitHub Blog
The GitHub Blog
GbyAI
GbyAI
L
LangChain Blog
Vercel News
Vercel News
博客园 - 叶小钗
MongoDB | Blog
MongoDB | Blog
Stack Overflow Blog
Stack Overflow Blog
H
Help Net Security
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
The Cloudflare Blog
Engineering at Meta
Engineering at Meta
T
Threat Research - Cisco Blogs
T
Threatpost
Scott Helme
Scott Helme
T
Tailwind CSS Blog
Latest news
Latest news
Stack Overflow Blog
Stack Overflow Blog
Blog — PlanetScale
Blog — PlanetScale
The Register - Security
The Register - Security
罗磊的独立博客
P
Proofpoint News Feed
腾讯CDC
S
Schneier on Security
雷峰网
雷峰网
A
About on SuperTechFans
T
Tenable Blog
F
Full Disclosure
Cyberwarzone
Cyberwarzone
博客园_首页
有赞技术团队
有赞技术团队
K
Kaspersky official blog

文章列表

不改一行插件代码,实现消息优先级与阻断 洛玖定时任务系统 在 butterfly 主题中添加首页点集动画(基于p2line项目) 你好,2026 stm32f4xx-ad9854并行驱动 主动式网站状态监测实现及其应用 右键菜单加入用Trae打开文件和文件夹 三角洲行动ID映射表 洛玖SDK说明 为网页文章开头添加原文连接 Hexo-Butterfly主题在主页添加GitHub贡献日历 Proteus中555定时器仿真问题 装饰器 洛玖开发日记
stm32f4xx-ads1256驱动
洛屿 · 2025-08-28 · via
//***************************
// Pin assign
// STM32f407 ADS1256
// GPIOA_Pin_3 <--- DRDY
// GPIOA_Pin_1 ---> CS
// GPIOA_Pin_5 ---> SCK
// GPIOA_Pin_6(MISO) <--- DOUT
// GPIOA_Pin_7(MOSI) ---> DIN
//***************************

#include "ads1256.h"
#define ADS1256_GPIO GPIOA
#define ADS1256_DRDY GPIO_PIN_3
#define ADS1256_CS GPIO_PIN_1

extern SPI_HandleTypeDef hspi1;

//-----------------------------------------------------------------//
// 功 能: SPI通信
// 入口参数: / 发送的SPI数据
// 出口参数: / 接收的SPI数据
// 全局变量: /
// 备 注: 发送接收函数
//-----------------------------------------------------------------//
unsigned char SPI_WriteByte(unsigned char TxData)
{
unsigned char RxData=0;
HAL_SPI_TransmitReceive(&hspi1, &TxData, &RxData, 1, 10);
return RxData;
}

//-----------------------------------------------------------------//
// 功 能:ADS1256 写数据
// 入口参数: /
// 出口参数: /
// 全局变量: /
// 备 注: 向ADS1256中地址为regaddr的寄存器写入一个字节databyte
//-----------------------------------------------------------------//
void ADS1256WREG(unsigned char regaddr,unsigned char databyte) //ADS1256WREG(ADS1256_MUX,channel); //设置通道
{
HAL_GPIO_WritePin(ADS1256_GPIO, ADS1256_CS, GPIO_PIN_RESET);
// CS_0();
while(HAL_GPIO_ReadPin (ADS1256_GPIO,ADS1256_DRDY)==1) {}
//当ADS1256_DRDY为低时才能写寄存器
//向寄存器写入数据地址
SPI_WriteByte(ADS1256_CMD_WREG | (regaddr & 0x0F));
//写入数据的个数n-1
SPI_WriteByte(0x00);
//向regaddr地址指向的寄存器写入数据databyte
SPI_WriteByte(databyte);
HAL_GPIO_WritePin(ADS1256_GPIO, ADS1256_CS, GPIO_PIN_SET);
}

//初始化ADS1256
float ADS1256_GAIN = 1.0f;
void ADS1256_Init(uint8_t gain) {
//*************自校准****************
// while(HAL_GPIO_ReadPin (ADS1256_GPIO,ADS1256_DRDY)==1);
// HAL_GPIO_WritePin(ADS1256_GPIO, ADS1256_CS, GPIO_PIN_RESET);
// SPI_WriteByte(ADS1256_CMD_SELFCAL);
// while(HAL_GPIO_ReadPin (ADS1256_GPIO,ADS1256_DRDY)==1);
// HAL_GPIO_WritePin(ADS1256_GPIO, ADS1256_CS, GPIO_PIN_SET);
//**********************************

// ADS1256WREG(ADS1256_STATUS,0x06); // 高位在前、使用缓冲
ADS1256WREG(ADS1256_STATUS,0x04); // 高位在前、不使用缓冲

ADS1256WREG(ADS1256_MUX,0x08); // 初始化端口A0为‘+’,AINCOM位‘-’
if(gain == ADS1256_GAIN_1) ADS1256_GAIN = 1.0f; // 放大倍数1 ±5V
if(gain == ADS1256_GAIN_2) ADS1256_GAIN = 2.0f; // 放大倍数2 ±2.5V
if(gain == ADS1256_GAIN_4) ADS1256_GAIN = 4.0f; // 放大倍数4 ±1.25V
if(gain == ADS1256_GAIN_8) ADS1256_GAIN = 8.0f; // 放大倍数8 ±0.625V
if(gain == ADS1256_GAIN_16) ADS1256_GAIN = 16.0f; // 放大倍数16 ±0.3125V
if(gain == ADS1256_GAIN_32) ADS1256_GAIN = 32.0f; // 放大倍数32 ±0.15625V
if(gain == ADS1256_GAIN_64) ADS1256_GAIN = 64.0f; // 放大倍数64 ±0.078125V

ADS1256WREG(ADS1256_ADCON, gain); // 放大倍数8 ±0.625V

// ADS1256WREG(ADS1256_ADCON,ADS1256_GAIN_1); // 放大倍数1 ±5V
// ADS1256WREG(ADS1256_ADCON,ADS1256_GAIN_4); // 放大倍数4 ±1.25V
// ADS1256WREG(ADS1256_ADCON,ADS1256_GAIN_8); // 放大倍数8 ±0.625V
// ADS1256WREG(ADS1256_ADCON,ADS1256_GAIN_16); // 放大倍数8 ±0.3125V
ADS1256WREG(ADS1256_DRATE,ADS1256_DRATE_1000SPS); // 数据10sps
ADS1256WREG(ADS1256_IO,0x00);

//*************自校准****************
while(HAL_GPIO_ReadPin (ADS1256_GPIO,ADS1256_DRDY)==1);
HAL_GPIO_WritePin(ADS1256_GPIO, ADS1256_CS, GPIO_PIN_RESET);
SPI_WriteByte(ADS1256_CMD_SELFCAL);
while(HAL_GPIO_ReadPin (ADS1256_GPIO,ADS1256_DRDY)==1);
HAL_GPIO_WritePin(ADS1256_GPIO, ADS1256_CS, GPIO_PIN_SET);
//**********************************
}

// 微秒级延迟(纯循环)
void delay_us(uint32_t us) {
us *= 40; // 校准值(需根据实际测试调整)
while (us--) {
__asm__ volatile ("nop"); // 插入空指令确保循环不被优化
}
}

// 毫秒级延迟(基于delay_us)
void delay_ms(uint32_t ms) {
while (ms--) {
delay_us(1000);
}
}
//读取AD值
unsigned char pre_channel = 0;
int ADS1256ReadData(unsigned char channel) {
unsigned int sum=0;
while(HAL_GPIO_ReadPin(ADS1256_GPIO,ADS1256_DRDY)==1);//当ADS1256_DRDY为低时才能写寄存器
if (pre_channel != channel) {
pre_channel = channel;
HAL_GPIO_WritePin(ADS1256_GPIO, ADS1256_CS, GPIO_PIN_RESET);
ADS1256WREG(ADS1256_MUX,channel); //设置通道
HAL_GPIO_WritePin(ADS1256_GPIO, ADS1256_CS, GPIO_PIN_SET);

HAL_GPIO_WritePin(ADS1256_GPIO, ADS1256_CS, GPIO_PIN_RESET);
SPI_WriteByte(ADS1256_CMD_SYNC);
SPI_WriteByte(ADS1256_CMD_WAKEUP);
HAL_GPIO_WritePin(ADS1256_GPIO, ADS1256_CS, GPIO_PIN_SET);
while (HAL_GPIO_ReadPin(ADS1256_GPIO, ADS1256_DRDY) == 1);
}

HAL_GPIO_WritePin(ADS1256_GPIO, ADS1256_CS, GPIO_PIN_RESET);
SPI_WriteByte(ADS1256_CMD_RDATA);
// HAL_Delay(1);
delay_us(10);

sum |= (SPI_WriteByte(0xff) << 16);
sum |= (SPI_WriteByte(0xff) << 8);
sum |= SPI_WriteByte(0xff);
HAL_GPIO_WritePin(ADS1256_GPIO, ADS1256_CS, GPIO_PIN_SET);

if (sum>0x7FFFFF) // if MSB=1,
{
sum -= 0x1000000; // do 2's complement

}
return sum;
}

double ADS1256ReadVoltage(unsigned char channel) {
double voltage = ADS1256ReadData(channel)*(double)0.000000598;
voltage /= ADS1256_GAIN;
return voltage;
}