特点:只用两根线,就能让主控和多个外设通信
是种同步,半双工,串行通信协议
结构特点
- 电气特点:SCL和SDA都是开漏/开集电极结构,必配上拉电阻。
- I2C设备只能主动把线拉低,不能主动输出高电平。
- 当没有器件拉低总线时,线上的高电平是靠上拉电阻提供的
IIC通信过程是怎么进行的
一帧典型:
- 主机发送起始信号
- 主机发送从机地址
- 主机发送读写方向位
- 从机返回应答
- 主机和从机传输数据
- 每发完1字节,对方返回一次应答
- 最后发送停止信号
起始信号,停止信号,应答信号是什么
起始信号Start
当SCL保持高电平时,SDA从高电平跳变到低电平,这表示起始信号
- 时钟线高
- 数据线由高变低
- 表示通信开始
停止信号Stop
当SCL保持高电平,SDA从低电平跳变到高电平,表示停止信号
- 时钟线高
- 数据线低变高
- 表示通信结束
应答信号ACK
I2C按字节传输,在数据传输阶段,每发完8位数据,接收方都要在第9个时钟给出应答。
- 拉低SDA:表示ACK
- 不拉低SDA:表示NACK
IIC的读写区分
先写地址,再重新开始读数据
- 0 :写
- 1:读
- 主机给器件写数据
- 起始
- 从机地址 + 写位
- 应答
- 寄存器地址或存储地址
- 应答
- 数据
- 应答
- 停止
- 主机从器件读数据
- 起始
- 从机地址 + 写位
- 应答
- 先告诉对方读哪个寄存器地址
- 重启始
- 从机地址 + 读位
- 应答
- 从机发送数据
- 主机应答/非应答
- 停止
为什么IIC可以挂多个设备
因为IIC是靠地址区分设备的
在同一条总线上可以同时挂多个从机
主机发送通信时,先发送从机地址,只有地址匹配的那个设备才会响应,其他设备保持安静
优势:
- 节省引脚
- 布线简单
- 一个主控能挂多个外设
限制:
同一条总线上,设备地址不能冲突
IIC常见速度模式
- 标准模式:100kHz
- 快速模式:400KHz
- 快速模式增强:1MHz
- 高速模式:3.4MHz
STM32使用IIC
硬件IIC
HAL有时用7位地址左移后的格式,根据读写函数自动置读写位
//写 HAL_I2C_Mem_Write(&hi2c1, dev_addr, mem_addr, I2C_MEMADD_SIZE_8BIT, buf, len,1000); //读 HAL_I2C_Mem_Read(&hi2c1, dev_addr, mem_addr, I2C_MEMADD_SIZE_8BIT, buf, len, 1000);