在本次项目中,限于空间要求我们选用了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通讯的更多相关文章

  1. STM32F0使用LL库实现Modbus通讯

    在本次项目中,限于空间要求我们选用了STM32F030F4作为控制芯片.这款MCU不但封装紧凑,而且自带的Flash空间也非常有限,所以我们选择了LL库实现.本篇将说明基于LL实现USART通讯. 1 ...

  2. STM32F0使用LL库实现MS5536C通讯

    在本次项目中,限于空间要求我们选用了STM32F030F4作为控制芯片.这款MCU不但封装紧凑,而且自带的Flash空间也非常有限,所以我们选择了LL库实现.在本文中我们说明一下,使用LL库实现MS5 ...

  3. C/C++ 用libcurl库进行http通讯网络编程

    C/C++ 用libcurl库进行http通讯网络编程 目录索引: 一.LibCurl基本编程框架 二.一些基本的函数 三.curl_easy_setopt函数部分选项介绍 四.curl_easy_p ...

  4. C++ 用libcurl库进行http通讯网络编程 【转】

    http://www.cnblogs.com/moodlxs/archive/2012/10/15/2724318.html C++ 用libcurl库进行http通讯网络编程 目录索引: 一.Lib ...

  5. C++ 用libcurl库进行http通讯网络编程

    使用libcurl完成http通讯,很方便而且是线程安全,转载一篇比较好的入门文章 转载自 http://www.cnblogs.com/moodlxs/archive/2012/10/15/2724 ...

  6. C++ 用libcurl库进行http通讯网络编程(转)

    转载:http://www.cnblogs.com/moodlxs/archive/2012/10/15/2724318.html 目录索引: 一.LibCurl基本编程框架 二.一些基本的函数 三. ...

  7. C++ 用libcurl库进行http通讯网络编程[转]

    http://www.cnblogs.com/moodlxs/archive/2012/10/15/2724318.html 目录索引: 一.LibCurl基本编程框架 二.一些基本的函数 三.cur ...

  8. (4)STM32使用HAL库实现串口通讯——理论讲解

    一.查询模式 1. 二.中断模式 1.中断接收. 1.1先看中断接收的流程(以 USART2 为例) 在启动文件中找到中断向量 USART2_IRQHandler 找到USART2_IRQHandle ...

  9. STM32F0使用LL库实现PWM输出

    在本次项目中,限于空间要求我们选用了STM32F030F4作为控制芯片.这款MCU不但封装紧凑,而且自带的Flash空间也非常有限,所以我们选择了LL库实现.本文我们将说明如何通过LL库实现PWM信号 ...

随机推荐

  1. 解决IOS微信浏览器底部会出现向前向后返回按钮,返回不刷新的问题

    <script type="text/javascript"> //解决IOS返回页面不刷新的问题 var isPageHide = false; window.add ...

  2. 偏差-方差均衡(Bias-Variance Tradeoff)

    众所周知,对于线性回归,我们把目标方程式写成:. (其中,f(x)是自变量x和因变量y之间的关系方程式,表示由噪音造成的误差项,这个误差是无法消除的) 对y的估计写成:. 就是对自变量和因变量之间的关 ...

  3. 让pip使用python3而不是python2

    步骤 ln -sf $(which pip3) $(which pip)

  4. luogu5290 春节十二响

    题目链接 思路 先考虑一条链的情况怎么做. 因为只有两个子树,并且两个子树都是链.所以可以把这两条链找出来,然后\(sort\)一下.合并起来. 然后推广到树上 对于每一棵树都可以按照和上面同样的方法 ...

  5. mac下安装android-sdk

    安装sdk brew cask install android-sdk 配置Path环境 vim ~/.bash_profile 设置路径 #Setting PATH for android-sdk ...

  6. 深入了解SQL的四种连接&不然要命的!

    1.内联接(典型的联接运算,使用像 =  或 <> 之类的比较运算符).包括相等联接和自然联接.     内联接使用比较运算符根据每个表共有的列的值匹配两个表中的行.例如,检索 stude ...

  7. NFV-Based Scalable Guaranteed-Bandwidth Multicast Service for Software Defined ISP Networks

    文章名称:NFV-Based Scalable Guaranteed-Bandwidth Multicast Service for Software Defined ISP Networks 发表时 ...

  8. I2C(三) linux3.4(内核分析)

    目录 I2C(三) linux3.4(内核分析) (一)总线流程 bus.probe match i2c_device_probe (二)client注册 方式(一)静态加载 方式(二)指定设备 方式 ...

  9. CDN-常用静态资源公共库

    js.css 等静态资源可以放在自己的服务器上,或者引用网络上的公共库使用(CDN) CDN 读取失败时从本地加载 <script src="https://code.jquery.c ...

  10. Java调用第三方http接口的方式

    1. 概述 在实际开发过程中,我们经常需要调用对方提供的接口或测试自己写的接口是否合适.很多项目都会封装规定好本身项目的接口规范,所以大多数需要去调用对方提供的接口或第三方接口(短信.天气等). 在J ...