目录
一、基础知识
上一节我们知道了单片机跟外部设备(电脑)的连接和通信,一个串口可以让单片机跟一个外部设备相连,所以通过串口USART1、USART2、USART3,我们的单片机可以跟三个外部设备相连

但若要连接更多设备,就要使用总线,比如说:
I2C总线

- I2C总线由SCL、SDA组成,
- SCL负责传输高低变化的方波信号,每个时钟周期传输一位,所以时钟的频率越高,传输的速率越快。
- SDA负责传输数据,高电压表示1,低电压表示0;
- 主机和从机各有SCL、SDA引脚,两种引脚各自与I2C总线的SCL、SDA引脚相连;
- SCL、SDA各连接一个阻值4.7k的上拉电阻;
- 主/从机的SCL、SDA引脚都使用开漏输出。
复习开漏输出

那么为什么I2C所有的引脚都要配置开漏输出?为什么要配置两个上拉电阻呢?
这其实是为了实现逻辑线与,
SCL、SDA实现逻辑线与的原理一样,拿一条线来举例:
逻辑线与

当主机、从机均配置高阻抗时,总线由于配置了上拉电阻,所以显示高电压;
只要有一个"机"配置的低电压,那么Vdd的电流就会直接通往此"机",从而总线显示低电压。
I2C总线的通信过程:
1.起始位

主机控制SCL恒定为高电压,SDA产生下降沿
2.寻址

每个从机都有一个地址,主机通过SCL控制着节奏的频率,主机通过控制SDA电平的高低变换,产生七位的0/1数据、一位的数据传输方向,从机产生一位的应答。

3.数据传输阶段

从机应答完成后,主机继续产生相应的二进制数据,此数据即为"有效数据",若传输方向相反,则SCL仍由主机控制,SDA起始位、寻址、数据传输的数据的发送和接受方互换
4.停止位

主机在SCL高电压时,向SDA发送上升沿。
全过程总结

波特率:
波特率越大,数据传输越快,但是越不稳定,
我们用的单片机只支持前两钟模式:


通常我们只使用2:1的。
二、简单数据收发实验
屏幕介绍

具体操作
CubeMX新建项目------选型号------选调试接口------配置PC13引脚(板载LED,跟前几次操作相同)------设置I2C接口

我们的单片机有两个I2C接口I2C1和I2C2,我们任选一个,
还可以看到I2C有三种模式:
1.标准I2C接口
2.一般用不到的
直接选择第一种
此时,我们看到底下出现了各种参数:
当STM32当作主机时,设置Master Features(主机参数,更常用),
当从机时,设置Slave Features(从机参数)。

速度等级其实也就是波特率等级,决定着下面比特率参数的范围。

我们的OLED显示器支持快速模式,所以点击快速模式,
点击快速模式后,底下又出现了一个新的参数选项"占空比":

占空比只要没特殊要求一般就选择2:1
可以发现,CubeMX已经自动帮我们分配了I2C的引脚:

继续点击GPIO------I2C,
可以看到,CubeMX已经自动将GPIO模式设置成立复用输出开漏模式:

我们保持默认就好。
名字、地址、工具链选择:

编写代码
接线:

查找显示屏的地址,查阅手册可以看到:

通过屏幕底部红圈位置可以查看地址为0x78,其具体意思如下:

再阅读手册后可知,
通过I2C总线向屏幕输入如下命令就可以显示:

学习两个新的接口

打开keli可以发现CubeMX已经为I2C1生成了一个句柄:

现在使用第一个接口将命令发送出去,在最开始,我们需要生成一个数组,存放命令:

此外,我们还想将板载指示灯当作OLED屏指示灯来使用,当屏幕开启时,点亮这颗LED,
查阅手册可知,这块屏幕有一个状态字,我们便可以利用它来控制LED灯:

可通过I2C总线读一个字节将它读出来:


最终keil代码如下:

注:如果买的江科大的套件,其屏幕跟铁头山羊的有这些不同:
1.江科大套件屏幕内部自带上拉电阻,其市面上大部分带上拉电阻,所以只要直接将I2C、正负极连接到屏幕即可
2.两个屏幕地址相同,不用更改
3.最后的keil代码有些许不同,此处应该修改
