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

推荐订阅源

T
Threat Research - Cisco Blogs
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
月光博客
月光博客
V
Vulnerabilities – Threatpost
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
S
Secure Thoughts
Microsoft Azure Blog
Microsoft Azure Blog
Blog — PlanetScale
Blog — PlanetScale
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
T
Tailwind CSS Blog
S
SegmentFault 最新的问题
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
云风的 BLOG
云风的 BLOG
The Last Watchdog
The Last Watchdog
L
LINUX DO - 热门话题
酷 壳 – CoolShell
酷 壳 – CoolShell
WordPress大学
WordPress大学
AWS News Blog
AWS News Blog
美团技术团队
G
Google Developers Blog
宝玉的分享
宝玉的分享
www.infosecurity-magazine.com
www.infosecurity-magazine.com
C
CXSECURITY Database RSS Feed - CXSecurity.com
Recent Commits to openclaw:main
Recent Commits to openclaw:main
I
InfoQ
小众软件
小众软件
Google DeepMind News
Google DeepMind News
P
Privacy & Cybersecurity Law Blog
Stack Overflow Blog
Stack Overflow Blog
Webroot Blog
Webroot Blog
D
DataBreaches.Net
IT之家
IT之家
PCI Perspectives
PCI Perspectives
人人都是产品经理
人人都是产品经理
Hacker News: Ask HN
Hacker News: Ask HN
L
LangChain Blog
SecWiki News
SecWiki News
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
C
Cisco Blogs
T
Threatpost
P
Proofpoint News Feed
Y
Y Combinator Blog
Cloudbric
Cloudbric
T
Tor Project blog
量子位
博客园_首页
B
Blog
Hugging Face - Blog
Hugging Face - Blog
GbyAI
GbyAI
D
Darknet – Hacking Tools, Hacker News & Cyber Security

洛屿的小站

STM32F407 IAR环境下uC/OS-III移植完整指南 STM32 UCOS3+HAL库集成中的FPU HardFault问题 一种简单的卡尔曼滤波器设计 Cadence - 应律而动,落指成音 Zephyr - 聆风之息,为你而奏 不改一行插件代码,实现消息优先级与阻断 洛玖定时任务系统 在 butterfly 主题中添加首页点集动画(基于p2line项目) 你好,2026 stm32f4xx-ad9854并行驱动 主动式网站状态监测实现及其应用 右键菜单加入用Trae打开文件和文件夹 三角洲行动ID映射表 洛玖SDK说明 为网页文章开头添加原文连接 Hexo-Butterfly主题在主页添加GitHub贡献日历 Proteus中555定时器仿真问题 装饰器 洛玖开发日记 STS3032舵机获取力矩输出 kotlin网页前后端那些事 mspm0g3507-ad9850 奇怪的bug Paddle模型转PaddleLite 人工智能考核 构建一个yolov3网络 yolo和paddle模型常见输出参数 PaddleDetection 随便写的一些东西 实验室C语言第一次考核题目讲解及相关代码解读 C语言神经网络房价预测系统 C、C++数组,指针,指针数组,数组指针的区别 C、C++的大括号是必须的部分吗? C、C++预处理详解 C、C++其他关键字详解 C、C++存储类型关键字详解 C、C++控制语句关键字详解 C、C++数据类型关键字详解 C、C++关键字 C++药品管理系统 Bi-LSTM(Attention)的PyTorch实现 C语言实现波士顿房价预测 easy库的使用 edgeboardFZ3A相关问题 Predict.py的编写 Paddle环境搭建 百度Paddle模型训练 GMD09601-0.96OLED显示屏 【LeetCode 1617】统计子树中城市之间最大距离 C语言学习相关 STM32阵列按键 CH32(F10X F20X) 最短路 拓扑排序
stm32f4xx-ads1256驱动
洛屿 · 2025-08-28 · via 洛屿的小站
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
//***************************
// 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;
}