说到IIC,第一次接触应该是在蓝桥杯的备赛时调试的AT24C02存储功能。那时候并不是很懂这个协议到底是什么意思为什么这么设计,看着手册上密密麻麻的时序图,什么起始条件、停止条件、应答位、非应答位......头都大了。一通乱调后写入的数据根本没有实现保存。于是为了确保AT24C02能正常保存数据,我开始背代码------把能用的驱动文件完整地背下来,连每个延时都不敢改。现在想想真是好笑。
后来我才明白,IIC其实没那么复杂,它本质上就是一套"你说我听、我问你答"的规矩。这篇咱们就来聊聊IIC是什么、它怎么工作,为后续点亮OLED屏打下理论基础。

省流版:
-
✅ IIC是什么?一个生活化的比喻帮你秒懂
-
✅ IIC的物理层:就两根线,能挂一堆设备
-
✅ IIC的协议层:起始、停止、应答、数据------就这么几个动作
-
✅ STM32的硬件IIC怎么配置
-
✅ 实验目标:用硬件IIC点亮OLED屏
一、为什么学IIC?
在之前的篇章里,我们已经接触过GPIO点灯、按键中断、定时器PWM、ADC采集------这些都是在跟单片机自己 或者单个传感器 打交道。但从这一篇开始,我们要正式进入设备与设备之间通信的世界了。
本系列的目标是用STM32F103C8T6核心板做一个室内环境检测系统 。系统里需要显示数据,所以我们需要一个显示屏。在各种显示屏里,OLED屏 是个绝佳的选择------功耗低、对比度高、体积小,而且用IIC接口的话,只需要两根信号线就能驱动。

这就引出了我们今天的主角------IIC总线。
二、IIC是什么?一个生活化的比喻
先别急着看寄存器,咱们用一个生活中最常见的场景来理解IIC。
想象一下开家长会的场景:
教室里有一个老师 (主机 ,Master)和一群家长 (从机 ,Slave)。老师站在讲台上,手里拿着话筒 (SCL时钟线 ),还有一根数据线 (SDA数据线)。
老师想跟某位家长交流,会先喊一声:"各位注意,我要开始说话了 "(起始条件,Start Condition)。然后所有家长都安静下来,看向老师。
老师接着说:"张三的家长在吗? "(发送从机地址 ,Slave Address)。张三妈妈举手:"在! "(应答位,ACK)。其他家长听到不是喊自己,就不吭声了。

然后老师和张三妈妈开始一对一交流------老师说一句,张三妈妈回一句,每句话说完对方都要"嗯"一声表示听到了(应答机制 )。交流完了,老师说:"好了,散会 "(停止条件,Stop Condition),其他家长又可以自由活动了。
IIC总线的工作原理,本质上就是这样------一套"一问一答、有始有终"的通信规矩。
三、IIC的物理层:就两根线
IIC总线在物理上非常简单,只需要两根信号线:
-
SCL(Serial Clock Line,串行时钟线)
:由主机产生的时钟信号,决定了数据传输的节奏。就像家长会里老师手里的话筒------谁拿话筒谁说话,节奏由老师掌控。
-
SDA(Serial Data Line,串行数据线)
:传输实际数据的那根线。就像老师说话的内容、家长回答的内容都通过这根线传递。
这两根线都需要接上拉电阻 到电源------因为IIC的引脚都是开漏输出模式,只能输出低电平,高电平要靠上拉电阻来拉高。

IIC总线最大的优势是:一根总线上可以挂载多个设备 ,最多能挂 127个 从设备(7位地址的情况下)。所有设备都并联在同一对SCL和SDA上,通过设备地址来区分谁跟谁通信。
四、IIC的协议层:就这几个动作
IIC的通信协议其实就几个基本动作,掌握了这几个,IIC你就懂了一大半。
4.1 起始条件(Start Condition)
主机想开始一次通信时,会在SCL为高电平的时候,把SDA从高电平拉低到低电平。
这就像老师拿起话筒说"各位注意"------告诉所有从机:我要开始说话了。
4.2 停止条件(Stop Condition)
主机想结束通信时,会在SCL为高电平的时候,把SDA从低电平拉高到高电平。
这就像老师说"散会"------告诉所有从机:通信结束了。
4.3 数据位传输
在SCL为高电平的时候,SDA上的数据必须保持稳定------高电平就是1,低电平就是0。数据只能在SCL为低电平的时候发生变化。
这就像老师说话时,每个字必须吐字清晰;换字的时候可以换口气(SCL低电平的时候换数据)。
4.4 应答位(ACK)与非应答位(NACK)
每传输完8位数据(一个字节),接收方需要在第9个时钟周期内把SDA拉低,表示"收到了"(ACK)。如果接收方把SDA保持高电平,就表示"没收到"或"不想收了"(NACK)。
这就像每说完一句话,对方都要"嗯"一声表示听到了。如果对方不吭声,就知道出问题了。
4.5 完整的通信流程

一次完整的IIC通信是这样的:
-
主机发送起始条件(START)
-
主机发送从机地址(7位)+ 读写位(1位)
------ 7位地址加1位读写标志,一共8位
-
从机发送应答位(ACK)
------ 表示"我在,找我什么事?"
-
主机发送数据(8位)
------ 可以是命令,也可以是数据
-
从机发送应答位(ACK)
------ 表示"收到了"
-
重复第4、5步
------ 可以连续发送多个字节
-
主机发送停止条件(STOP)
注意 :上面描述的是主机写从机 的流程。如果是主机读从机,流程稍有不同------主机发送完地址和读标志后,就由从机来发送数据,主机来应答。
五、STM32的IIC外设
STM32F103内部集成了硬件IIC外设 ,支持标准模式(100kHz) 和快速模式(400kHz) 。
使用硬件IIC的好处是:
-
不需要手动翻转SCL和SDA
------硬件自动完成时序控制
-
不需要软件模拟时序
------不用操心起始条件、停止条件这些细节
-
CPU占用低
------数据传输由硬件完成,CPU可以去做别的事
当然,STM32的硬件IIC早年有些争议------据说F1系列的硬件IIC有一些bug,所以很多老工程师习惯用软件模拟IIC 。但实际上,只要你配置正确,硬件IIC完全可以用。这次我们就用硬件IIC来驱动OLED屏。
六、本次实验目标
理论讲完了,接下来进入实战环节------用STM32的硬件IIC点亮OLED屏,显示字母汉字数字 。
硬件准备:
-
Jlink OB
-
STM32F103C8T6核心板 × 1
-
0.96寸OLED屏(IIC接口) × 1
-
杜邦线 × 4(VCC、GND、SCL、SDA)

实验步骤(代码部分交给你自己来写):
-
硬件连接:把OLED的VCC接到3.3V、GND接GND、SCL接STM32的SCL引脚(PB6)、SDA接SDA引脚(PB7)
-
CubeMX配置:打开IIC外设,选择合适的模式(I2C),配置速度为100kHz
-
生成代码:让CubeMX生成初始化代码

-
编写驱动:这次我们直接把厂家例程和自己的工程都交给ai,告诉他要根据例程代码实现OLED的初始化、写命令、写数据、清屏、显示字符串等函数

一般参考程序都会使用软件模拟iic确保兼容性,而实际使用的话有硬件iic最好用硬件iic从性能和稳定性上都好于模拟iic。可以看到我提问有专门告诉ai要用我们cubemx生成的iic驱动。
-
下载验证:编译下载,看OLED屏上是否正常显示

资源包
通过网盘分享的文件:OLED显示.rar 链接: https://pan.baidu.com/s/13lAImi3z9l4FVIJWV3z-xA 提取码: wv9h --来自百度网盘超级会员v4的分享
七、总结
本次不仅仅是教大家如何通过iic驱动OLED,而且还是告诉大家如何从买到的模块资料中借力让AI能更好的准确的实现功能。如果没有例程可能AI调试显示屏会慢很多,因为涉及不同的驱动芯片的协议问题、字符集问题等。
动手实践才是最好的学习方式。遇到问题别慌------IIC的时序就那么几个动作,对照着协议一步一步排查,一定能调通。