STM32GPIO模拟I2C驱动SHT20获取温湿度。

I2C(Inter-Integrated Circuit)是一种串行通信协议,用于在集成电路之间进行短距离的数据传输。

I2C协议使用两根信号线来进行通信:
1. SDA(Serial Data)线:用于传输数据,由主设备和从设备共享。
2. SCL(Serial Clock)线:用于传输时钟信号,由主设备控制。

I2C协议通过地址寻址的方式来进行设备之间的通信。每个I2C设备都有一个唯一的7位地址,用于在总线上寻址。主设备通过发送起始条件和设备地址,选择要与之通信的从设备,然后进行读写操作。

I2C协议具有以下特点:
1. 多从设备:支持多个从设备连接到同一条总线上。
2. 速度可变:I2C总线的通信速率可以根据设备的要求进行调整。
3. 硬件简单:I2C只需要两根信号线,相对于其他通信协议来说,硬件的成本和复杂度较低。
4. 双向通信:I2C支持主设备和从设备之间的双向数据传输。

前面介绍完I2C协议的一些基本特性,下面我们来用GPIO来模拟I2C通信

因为我们是用GPIO进行模拟I2C通信,所以不需要在软件中配置用到的引脚的状态。

首先初始化GPIO,这个我用的是PB6作为SCL线,PB7作为SDA线,具体初始化哪些IO看自己的设备接的是哪些IO。因为SCL是由主设备控制,所以我们只需要初始化为输出模式即可,SDA则要初始化为输入、输出两个模式。

因为在进行I2C通信的时候会经常拉高电平和拉低电平,所以为了方便和代码整洁,我定义了一些宏。

当SCL线在保持高电平的时候SDA线由高电平变为低电平就为代表着起始条件,这个起始条件告诉所有设备,总线将要开始传输数据,并使总线上的设备进入接收模式以准备接收数据。当SCL线在保持高电平的时候SDA线由低电平变为高电平则代表着终止条件,这个停止条件告诉所有设备,总线上的数据传输已经完成。

 

开始函数,首先将SDA线和SCL线都初始化为输出模式,然后将SDA线和SCL线都拉高为高电平,等待1微秒,然后再将SDA线拉为低电平,这样就完成了一个开始信号。

停止函数,因为停止信号肯定是用在开始信号后的,SCL已经初始化过了,所以我们只需要初始化SDA就行了。首先将SDA线初始化为输出模式,然后将SDA线和SCL线都拉为低电平,等待2微秒,先将SCL线拉为高电平,等待2微秒,再将SDA线拉为高电平,这样就完成了一个停止信号。

 

因为SHT20每发送完一个字节都要接收对方给的一个 确认报文,所以写完一个字节后我们要将SDA初始化为输入模式并将SCL线拉为高电平,并且读SDA线的数据。

发送字节函数。因为SHT20是从MSB开始发送的,所以我们要先发高位字节。定义mask为0x80,mask和byte(我们要发送的字节)与过之后就剩最高位的数,也就是我们要发送的数据。

接收字节函数,发送是从MSB开始发送的,接收数据也是从MSB位开始接收的,接收到的数据从高位开始或。每当我们接收完一个数据的时候也要接收一个确认报文。如果为ACK则还有数据未接收完,如果未NAK则代表已经接收完数据。

接收数据的函数,先调用开始函数,再调用写函数将要发送数据过来的设备的地址写过去,再开始调用读字节函数。

发送数据的函数,先调用开始函数,再调用写函数将要发送数据过去的设备的地址写过去,再开始调用写字节函数。

GPIO模拟I2C的头文件,我们声明发送数据和接收数据的函数即可,其他函数都是本文件内调用。

 

这样GPIO模拟I2C的的文件函数就完成了。

接下来写sht20.c/文件

获取温度值函数,因为获取温度需要时间,所以我们发送完命令后要先等待85毫秒,等待sht20获取温度后再读取温度。

获取湿度函数,因为获取湿度需要时间,所以我们发送完命令后要先等待29毫秒,等待sht20获取湿度后再读取湿度。

 获取数据的函数,用于main函数中调用

sht20.h文件,因为我们只需要调用SHT20_SampleData函数,所以在.h文件中声明SHT20_SampleData函数即可。

 main函数调用SHT20_SampleData即可获取到温湿度。

 

 烧录进单片机开始运行,打开串口助手即可看到获取到的温湿度。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值