目录
一、了解I2C总线协议
-
什么是I2C协议
I2C 通讯协议(Inter-Integrated Circuit)是由 Phiilps 公司开发的,由于它引脚少,硬件实现简单,可扩展性强,不需要 USART、CAN 等通讯协议的外部收发设备,现在被广泛地使用在系统内多个集成电路(IC)间的通讯。 - I2C 协议的物理层和协议层
①物理层
I2C是一个支持设备的总线。可连接多个 I2C 通讯设备,支持多个通讯主机及多个通讯从机。对于I2C 总线,只使用两条总线线路,一条双向串行数据线(SDA) ,一条串行时钟线(SCL)。
I2C 通讯设备常用连接方式(引用野火资料中的图)
②协议层
主要是定义了通讯的起始和停止信号、数据有效性、响应、仲裁、时钟同步和地址广播等。
通讯的起始和停止信号
数据有效性
从图中可以看出I2C在通讯的时候,只有在SCL处于高电平时,SDA的数据传输才是有效的。SDA 信号线是用于传输数据,SCL 信号线是保证数据同步。
响应
当SDA传输数据后,接收方对接受到的数据进行一个应答。如果希望继续进行传输数据,则回应应答信号(低电平),否则回应非应答信号(高电平)。
3、I2C的两种方式——硬件I2C和软件I2C
①硬件I2C
直接利用 STM32 芯片中的硬件 I2C 外设。
硬件I2C的使用
只要配置好对应的寄存器,外设就会产生标准串口协议的时序。在初始化好 I2C 外设后,只需要把某寄存器位置 1,此时外设就会控制对应的 SCL 及 SDA 线自动产生 I2C 起始信号,不需要内核直接控制引脚的电平。
②软件I2C
直接使用 CPU 内核按照 I2C 协议的要求控制 GPIO 输出高低电平,从而模拟I2C。
软件I2C的使用
需要在控制产生 I2C 的起始信号时,控制作为 SCL 线的 GPIO 引脚输出高电平,然后控制作为 SDA 线的 GPIO 引脚在此期间完成由高电平至低电平的切换,最后再控制SCL 线切换为低电平,这样就输出了一个标准的 I2C 起始信号。
③两者的差别
硬件 I2C 直接使用外设来控制引脚,可以减轻 CPU 的负担。不过使用硬件I2C 时必须使用某些固定的引脚作为 SCL 和 SDA,软件模拟 I2C 则可以使用任意 GPIO 引脚,相对比较灵活。对于硬件I2C用法比较复杂,软件I2C的流程更清楚一些。如果要详细了解I2C的协议,使用软件I2C可能更好的理解这个过程。在使用I2C过程,硬件I2C可能通信更加快,更加稳定。
二、AHT20温湿度传感器的数据采集
1.目的
使用STM32F103完成基于I2C协议(硬件I2C完成)的AHT20温湿度传感器的数据采集,并将采集的温度-湿度值通过串口输出。编程实现:每隔2秒钟采集一次温湿度数据,并通过串口发送到上位机(win10)
2.准备条件
STM32F103C8T6芯片、 AHT20温度传感器、pc机、串口调试助手
3.实现代码
链接:https://pan.baidu.com/s/1TZNBqkWH_aRGktK8Wk8cTA
提取码:qwer
4.线路连接
GND — GND
5v — 3v3 (左边USB接口一定要接5v接口,否则显示的温湿度为0)
TXD — A10
RXD — A9
其中SDA接B7; SCL接B6
5.烧录
烧录结果:
打开串口运行
对着芯片呼气,可以发现温湿度都明显提高,实验成功
三、OLED屏显和汉字点阵编码
1.目的
1) 显示自己的学号和姓名;
2) 显示AHT20的温度和湿度;
3) 上下或左右的滑动显示长字符
2.准备
在上个项目基础上加一块OLED显示屏
3.功能实现
3.1 显示自己的学号和姓名
1、实现代码
链接:https://pan.baidu.com/s/1vawtPaudZmzuWdMjImrF3Q
提取码:qwer
2、修改代码
打开test.c,输入自己的名字和学号
3、添加点阵字
取模
修改字体代码
4、编译烧录并运行
结果:
3.2 显示AHT20的温度和湿度
1、实现代码
链接:https://pan.baidu.com/s/1fwpkkrHpujE57SGZBOXlmQ
提取码:qwer
2、编译烧录并运行
结果:
可以看到温湿度有明显变化
3.3 上下或左右的滑动显示长字符
1、实现代码
链接:https://pan.baidu.com/s/1KhdrhXcBWLVsky-pVAXH_A
提取码:qwer
2、修改代码
打开test.c,输入自己的一句话
添加点阵字按照上面步骤即可,这里不再重复
修改点阵字代码
3、编译烧录并运行
结果:
四、总结
在第一个串口显示温湿度实验时,一开始的时候那个USB我接的是3v3接口,结果显示的温湿度全部为0,刚开始我还以为是代码或者是芯片的问题,但通过我逐一排查才发现,USB应该是要接5v接口的,于是我又更改这个接口,然后烧录并运行串口,结果显示的温湿度都正常,这才解决了这个问题。总的来说,本次实验个人觉得是非常有意思的,收获也不少,感觉很棒。
五、参考资料
https://blog.csdn.net/qq_43279579/article/details/111597278