STM32F0使用LL库实现SHT70通讯
在本次项目中,限于空间要求我们选用了STM32F030F4作为控制芯片。这款MCU不但封装紧凑,而且自带的Flash空间也非常有限,所以我们选择了LL库实现。本篇我们将基于LL库采用模拟I2C接口的方式实现温湿度采集。
1、SHT70简述
SHT70是一款集温湿度测量于一体的传感器,现在对其作简要介绍。其引脚定义如下:

SHT7X温湿度传感器使用的2线通讯,类似于I2C总线,但并不相同,使用普通的GPIO就可实现通讯。此次采用STM32F030F4来操作SHT70,具体的连接方式如下:

SCK 用于微处理器与SHT1x 之间的通讯同步。由于接口包含了完全静态逻辑,因而不存在最小SCK 频率。
DATA 引脚为三态结构,用于读取传感器数据 . 当向传感器发送命令时, DATA 在 SCK 上升沿有效且在 SCK 高电平时必须保持稳定。 DATA 在 SCK 下降沿之后改变。为避免信号冲突,微处理器应驱动DATA 在低电平。需要一个外部的上拉电阻(例如:10kΩ)将信号提拉至高电平。上拉电阻通常已包含在微处理器的I/O 电路中。
2、软件实现
我们了解了SHT70的相关特点,基于它类I2C的通讯方式,我们采用相关的GPIO来模拟I2C通讯。这里所说的I2C,并非常规意义上的I2C,而是面向SHT70的协议的I2C。
2.1、端口配置
所谓的端口配置其实就是对应的GPIO引脚的配置,其实就是将用于模拟I2C通讯的引脚按需要配置为不同的GPIO输入输出特性。具体代码如下:
*温湿度变送器GPIO端口配置*/
static void SHT_GPIO_Configuration(void)
{
LL_GPIO_InitTypeDef GPIO_InitStruct;
/* 使能GPIO端口时钟 */
LL_AHB1_GRP1_EnableClock(LL_AHB1_GRP1_PERIPH_GPIOA);
LL_AHB1_GRP1_EnableClock(LL_AHB1_GRP1_PERIPH_GPIOB);
LL_GPIO_SetOutputPin(I2C_SCL_GPIO_Port, I2C_SCL_Pin);
LL_GPIO_SetOutputPin(I2C_SDA_GPIO_Port, I2C_SDA_Pin);
/* 配置SHT15通讯接口GPIO PA9、PA10 */
GPIO_InitStruct.Pin = I2C_SCL_Pin;
GPIO_InitStruct.Mode = LL_GPIO_MODE_OUTPUT;
GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_HIGH;
GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_PUSHPULL;
GPIO_InitStruct.Pull = LL_GPIO_PULL_UP;
LL_GPIO_Init(I2C_SCL_GPIO_Port, &GPIO_InitStruct);
GPIO_InitStruct.Pin = I2C_SDA_Pin;
GPIO_InitStruct.Mode = LL_GPIO_MODE_OUTPUT;
GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_HIGH;
GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_PUSHPULL;
GPIO_InitStruct.Pull = LL_GPIO_PULL_UP;
LL_GPIO_Init(I2C_SDA_GPIO_Port, &GPIO_InitStruct);
}
2.2、I2C操作函数
前面我们介绍了SHT70采用的是类似I2C的通讯接口,所以我们需要按照SHT70的要求来写这个类I2C的操作函数。主要有3个内容:
(1)SCK时钟线的输出操作
/*操作SCK引脚,设置高低操作*/
static void OperationSckPin(BusPinValue value)
{
if (value==Set)
{
LL_GPIO_SetOutputPin(I2C_SCL_GPIO_Port, I2C_SCL_Pin);
}
else if(value==Reset)
{
LL_GPIO_ResetOutputPin(I2C_SCL_GPIO_Port, I2C_SCL_Pin);
}
}
(2)SDA数据线的输出操作
/*操作DATA引脚,设置高低操作*/
static void OperationDataPin(BusPinValue value)
{
if (value==Set)
{
LL_GPIO_SetOutputPin(I2C_SDA_GPIO_Port, I2C_SDA_Pin);
}
else if(value==Reset)
{
LL_GPIO_ResetOutputPin(I2C_SDA_GPIO_Port, I2C_SDA_Pin);
}
}
(3)SDA数据线的方向操作
/*将DATA线设置为输入输出方向模式*/
void SetDataPineDirection(IODirection direction)
{
LL_GPIO_InitTypeDef GPIO_InitStruct;
GPIO_InitStruct.Pin = I2C_SDA_Pin;
if(direction)
{
GPIO_InitStruct.Mode = LL_GPIO_MODE_OUTPUT;
GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_HIGH;
GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_PUSHPULL;
GPIO_InitStruct.Pull = LL_GPIO_PULL_UP;
}
else
{
GPIO_InitStruct.Mode = LL_GPIO_MODE_INPUT;
GPIO_InitStruct.Pull = LL_GPIO_PULL_UP;
}
LL_GPIO_Init(I2C_SDA_GPIO_Port, &GPIO_InitStruct);
}
2.3、通讯函数
现在说明一下传感器通讯的实现。首先看一看其操作命令。传感器的命令包含三个地址位(目前只支持000,这就是只能挂接在空闲的IIC总线上的原因)和五个命令位。SHT1x 会以下述方式表示已正确地接收到指令:在第8个SCK 时钟的下降沿之后,将DATA 下拉为低电平(ACK 位)。在第9个SCK 时钟的下降沿之后,释放DATA(恢复高电平)。命令集如下:
|
命令 |
代码 |
|
预留 |
0000x |
|
温度测量 |
00011 |
|
湿度测量 |
00101 |
|
读状态寄存器 |
00111 |
|
写状态寄存器 |
00110 |
|
预留 |
0101x-1110x |
|
软复位, 接口复位, 状态寄存器复位即恢复为默认状态.在要发送下一个命令前,至少等待 11ms. |
11110 |
而关于各种该命令操作的实现,SHT70与SHT1x是完全相同的,在我们前面的文章中曾详述。而且这部分与LL实际上是没关系的,准确的说与任何库都没关系,所以不再重复,有兴趣可以产看前面的文章。
3、总结
我们已经完成可SHT70的相关函数与端口配置,我们还需要对我们的代码进行验证。将程序下载到目标板,监视结果如下:

从上图,我们可以看到温湿度的数据与实际一致。
欢迎关注:

STM32F0使用LL库实现SHT70通讯的更多相关文章
- STM32F0使用LL库实现Modbus通讯
在本次项目中,限于空间要求我们选用了STM32F030F4作为控制芯片.这款MCU不但封装紧凑,而且自带的Flash空间也非常有限,所以我们选择了LL库实现.本篇将说明基于LL实现USART通讯. 1 ...
- STM32F0使用LL库实现MS5536C通讯
在本次项目中,限于空间要求我们选用了STM32F030F4作为控制芯片.这款MCU不但封装紧凑,而且自带的Flash空间也非常有限,所以我们选择了LL库实现.在本文中我们说明一下,使用LL库实现MS5 ...
- C/C++ 用libcurl库进行http通讯网络编程
C/C++ 用libcurl库进行http通讯网络编程 目录索引: 一.LibCurl基本编程框架 二.一些基本的函数 三.curl_easy_setopt函数部分选项介绍 四.curl_easy_p ...
- C++ 用libcurl库进行http通讯网络编程 【转】
http://www.cnblogs.com/moodlxs/archive/2012/10/15/2724318.html C++ 用libcurl库进行http通讯网络编程 目录索引: 一.Lib ...
- C++ 用libcurl库进行http通讯网络编程
使用libcurl完成http通讯,很方便而且是线程安全,转载一篇比较好的入门文章 转载自 http://www.cnblogs.com/moodlxs/archive/2012/10/15/2724 ...
- C++ 用libcurl库进行http通讯网络编程(转)
转载:http://www.cnblogs.com/moodlxs/archive/2012/10/15/2724318.html 目录索引: 一.LibCurl基本编程框架 二.一些基本的函数 三. ...
- C++ 用libcurl库进行http通讯网络编程[转]
http://www.cnblogs.com/moodlxs/archive/2012/10/15/2724318.html 目录索引: 一.LibCurl基本编程框架 二.一些基本的函数 三.cur ...
- (4)STM32使用HAL库实现串口通讯——理论讲解
一.查询模式 1. 二.中断模式 1.中断接收. 1.1先看中断接收的流程(以 USART2 为例) 在启动文件中找到中断向量 USART2_IRQHandler 找到USART2_IRQHandle ...
- STM32F0使用LL库实现PWM输出
在本次项目中,限于空间要求我们选用了STM32F030F4作为控制芯片.这款MCU不但封装紧凑,而且自带的Flash空间也非常有限,所以我们选择了LL库实现.本文我们将说明如何通过LL库实现PWM信号 ...
随机推荐
- [转]html5监听任何App自带返回键javascript事件
1.前言 如今h5新特性.新标签.新规范等有很多,而且正在不断完善中,各大浏览器商对它们的支持,也是相当给力.作为前端程序员,我觉得我们还是有必要积极关注并勇敢地加以实践.接下来我将和各位分享一个特别 ...
- x86汇编寄存器,函数参数入栈说明
https://en.wikipedia.org/wiki/X86_calling_conventions
- for循环增强
for(声明语句 : 表达式) { //代码句子 } 声明语句:声明新的局部变量,该变量的类型必须和数组元素的类型匹配.其作用域限定在循环语句块,其值与此时数组元素的值相等. 表达式:表达式是要访问的 ...
- 第一章 Python基本语法元素分析(二)
1.3 实例1:温度转换 根据华氏和摄氏温度定义,利用转换公式如下: C=(F-32)/1.8 F=C*1.8+32 代码如下: 运行结果: 1.4 Python程序语法元素分析 注释:不被程 ...
- POJ 1015 Jury Compromise (算竞进阶习题)
01背包 我们对于这类选或者不选的模型应该先思考能否用01背包来解. 毫无疑问物体的价值可以看成最大的d+p值,那么体积呢?题目的另一个限制条件是d-p的和的绝对值最小,这启发我们把每个物体的d-p的 ...
- P2522 [HAOI2011]Problem b (莫比乌斯反演)
题目 P2522 [HAOI2011]Problem b 解析: 具体推导过程同P3455 [POI2007]ZAP-Queries 不同的是,这个题求的是\(\sum_{i=a}^b\sum_{j= ...
- 「洛谷3870」「TJOI2009」开关【线段树】
题目链接 [洛谷] 题解 来做一下水题来掩饰ZJOI2019考炸的心情QwQ. 很明显可以线段树. 维护两个值,\(Lazy\)懒标记表示当前区间是否需要翻转,\(s\)表示区间还有多少灯是亮着的. ...
- IOC的理解(转载)
转载自:https://www.zhihu.com/question/23277575/answer/169698662 要了解控制反转( Inversion of Control ), 我觉得有必要 ...
- C# http 性能优化500毫秒到 60 毫秒
偶然发现 C# 的 HttpRequest 要比 Chrome 请求同一Url 慢好多.C# HttpRequest 要500毫秒 而Chrome 只需要 39ms. 作为有责任感的 码农.这个 必须 ...
- 20175221《Java程序设计》第9周学习总结
20175221 <Java程序设计>第9周学习总结 教材学习内容总结 第十一章主要内容有: MySQL数据库管理系统 下载mysql-8.0.16-winx64 启动MySQL数据库 ...