一、IIC 总线协议
IIC(Inter-Integrated Circuit)总线协议是一种用于短距离通信的串行总线协议,广泛应用于嵌入式系统和微控制器的内部通信,另一种写法是I²C总线协议。它是一种串行通信总线,使用多主从架构,由飞利浦公司在1980年代为了让主板、嵌入式系统或手机用以连接低速周边设备而发展。
IIC总线协议有很多的特点,目前应用十分广泛。首先是双线制通信,IIC协议使用两根线进行通信,SDA(Serial Data Line)数据线,用于传输数据;SCL(Serial Clock Line)时钟线,用于提供同步信号。其次是支持多个主从设备,IIC总线允许多个主机设备(Master)控制总线。主机负责生成时钟信号,并向从设备发送命令。同样的I²C可以连接多个从设备(Slave)。每个从设备都有一个唯一的地址,主机通过该地址与特定从设备进行通信。IIC使用7位或10位地址来标识每个从设备,7位地址可以支持最多127个从设备,而10位地址可以支持最多1023个从设备。再其次是数据传输方式,IIC总线的数据传输是基于字节(8位)的,每次传输一个字节,数据从主机传输到从设备或从设备传输到主机。最后,IIC支持多种数据传输速度,常见的速度模式有标准模式、快速模式、高速模式等。
|------------------------|---------|
| 模式 | 传输速度 |
| 标准模式(Standard Mode) | 100kb/s |
| 快速模式(Fast Mode) | 400kb/s |
| 增强快速模式(Fast Mode Plus) | 1Mb/s |
| 高速模式(High Speed Mode) | 3.4Mb/s |
| 极速模式(Ultra-FastMode) | 5Mb/s |
表 6.1 IIC协议不同模式下传输速度汇总表
I²C协议的通信过程主要分为四个部分。分别为启动条件、地址传输、数据传输、停止条件。
启动条件:通信开始时,主机通过将SDA线从高电平拉低到低电平来发出启动信号(SDA下降沿,SCL保持高电平)。
|---------------------------------------------------------------------------------------------|
|
图1 IIC开始/停止信号时序图 |
地址传输:在启动条件后,主机发送一个包含从设备地址和读/写位的数据字节。根据从设备的应答,通信继续进行。
数据传输:数据通过SDA线传输,每次传输8位(1字节)。SDA在SCL低电平时改变数据,在SCL高电平时保持数据,每个SCL脉冲的高电平传递1位数据。每次字节传输后,从设备或主机会产生一个应答信号(ACK),确认数据的接收。数据的先后顺序为高位在前 。
|------------------------------------------------------------------------------------------|
|
图2 IIC数据传输时序图 |
停止条件:通信结束时,主机通过将SDA线从低电平拉高到高电平,发出停止信号,表示总线的释放(SDA上升沿,SCL保持高电平)。
IIC协议的优势有很多。如其连接简单,由于只需要两根线,硬件连接简洁,降低了布线成本。并支持多设备,通过地址机制,IIC可以连接多个设备,节省了主板上的引脚数量。IIC协议的实现成本较低,适合用于低功耗的设备。IIC适用于芯片间的短距离通信,如主板上的传感器、存储器等外围设备。
此外,IIC协议也有一些局限性。如通信距离短,IIC的通信距离通常较短,适用于PCB板内或近距离设备间的通信。数据传输速率较低,尽管IIC有不同的传输速率,但相比于SPI或UART等其他串行通信协议,IIC的传输速率较低。
二、IIC设备-OLED屏
OLED屏幕(Organic Light Emitting Diode,有机发光二极管屏幕)是一种基于有机材料的自发光显示技术。OLED 屏幕的基本工作原理基于有机发光二极管(OLED)技术。OLED 屏幕由多个像素(每个像素由红、绿、蓝三种子像素组成)组成,每个子像素都由一个微小的发光二极管单元构成,依靠有机材料的电致发光效应发光。OLED屏幕的工作过程涉及电致发光效应。当电流通过 OLED 器件时,阴极(负极)注入电子,阳极(正极)注入空穴,电子和空穴在有机发光层内复合,释放出光子(光)。
OLED屏幕共有四个引脚,分别是VCC电源、GND地、SDA数据线、SCL时钟线,将VCC电源连接到开发板电源,将GND地连接到开发板接地端,将SDA数据线连接到开发板SDA,将SCL时钟线连接到开发板SCL。
|------------------------------------------------------------------------------------------|
|
图3 OLED显示屏实物图 |
三、IIC实验
用STM32CubeMX启用IIC1,并生成Keil5工程。 
首先添加两个.c/.h文件到工程中,然后修改主函数。main.c主函数如下所示,编译后0错误0警告。
cpp
int main(void)
{
/* USER CODE BEGIN 1 */
/* USER CODE END 1 */
/* MCU Configuration--------------------------------------------------------*/
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init();
/* USER CODE BEGIN Init */
/* USER CODE END Init */
/* Configure the system clock */
SystemClock_Config();
/* USER CODE BEGIN SysInit */
/* USER CODE END SysInit */
/* Initialize all configured peripherals */
MX_GPIO_Init();
MX_I2C1_Init();
/* USER CODE BEGIN 2 */
OLED_Init();
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
OLED_ShowString(0,0,(uint8_t *)"HelloWorld!",2);
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
}
/* USER CODE END 3 */
}
