IIC是什么?
IIC(Inter-Integrated Circuit),意为芯片与芯片之间的通讯;IIC是一种总线通讯,为了解决多设备之间的通讯问题,通常采用一主多从模式,比如单片机为主机、屏幕、电机、测距仪等为从机;IIC是一种两线通讯,SCL(时钟线)、SDA(数据线),这种通讯方式决定了在同一时间IIC只能进行读数据或者写数据。
开始(S)和结束(P)标志
当 SCL 线为高电平时,SDA 线由高到低的下降沿,为传输开始标志(S)。
直到主设备发出结束信号(P),否则总线状态一直为忙。
结束标志(P)规定为,当 SCL 线为高电平时,SDA 线由低到高的上升沿。
数据格式/应答
I2C 的数据字节定义为 8-bits 长度,对每次传送的总字节数量没有限制。对每一次传输必须伴有一个应答(ACK)信号,其时钟由主设备提供,而真正的应答信号由从设备发出,在时钟为高时,通过拉低并保持 SDA 的值来实现。如果从设备忙,它可以使 SCL 保持在低电平,这会强制使主设备进入等待状态。
当从设备空闲后,并且释放时钟线,原来的数据传输才会继续。
通信
开始标志(S)发出后,主设备会传送一个 7 位的 Slave 地址,并且后面跟着一个第 8位,称为 Read/Write 位。R/W 位表示主设备是在接受从设备的数据还是在向其写数据。然后,主设备释放 SDA 线,等待从设备的应答信号(ACK)。每个字节的传输都要跟随有一个应答位。应答产生时,从设备将 SDA 线拉低并且在 SCL 为高电平时保持低。数据传输总是以停止标志(P)结束,然后释放通信线路。然而,主设备也可以产生重复的开始信号去操作另一台从设备,而不发出结束标志。综上可知,所有的 SDA 信号变化都要在 SCL 时钟为低电平时进行,除了开始和结束标志。
以单片机向从设备写数据时为例,标准的写数据帧由起始位、7位从设备地址、读写位、应答信号、8位寄存器地址、8位数据、停止位构成。
连续写入字节
当单片机向从设备写数据时
发送起始信号:时钟信号为高电平期间,数据信号完成从高到低的转变(下降沿)
获取设备地址码:单片机需要获取从设备的地址才能准确的发送数据给从设备,7位地址码最多支持128台设备连接。
读写位:写数据置0,读数据置1;此时置0
应答信号:从机发送给主机应答信号,0代表收到,1代表没收到或者读取完成;
8位寄存器地址:访问从设备上的寄存器地址,即写入数据的目标地址。
应答信号:从机发送给主机应答信号,0代表收到,1代表没收到或者读取完成;
8位数据:写入8位数据
应答信号:从机发送给主机应答信号,0代表收到,1代表没收到或者读取完成,告诉主机写入成功;
停止位:时钟信号为高电平期间,数据信号完成从低到高的转变(上升沿),这一点正与起始信号相反。
代码实现
写数据
#include "stm32f10x.h"
#define I2C_Speed 400000
#define I2C1_SLAVE_ADDRESS7 0xA0
void I2C1_GPIO_Config(void)
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); ***使能RCC与GPIO外设***
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; ******
GPIO_InitStructure.GPIO_Mode