I2C通信

本文主要参考自《STM32库开发实战》,想进一步了解I2C内容,请参考该书。

1. I2C协议简介

I2C(Inter-Integrated Circuit)协议是由Philips公司开发的,由于其具备引脚少、硬件实现简单、可扩展性强、不需要如USART、CAN的外部收发设备等特点,现在被广泛的使用在系统内多个IC间的通信。

1.1 物理层

  • 它只使用两条总线线路:一条双向串行数据线(SDA),一条串行时钟线(SCL);
  • 每个连接到总线的设备都有一个独立的地址,主机可以利用这个地址进行不同设备之间的访问;
  • 多主机同时使用总线时,为了防止数据冲突,会利用仲裁方式决定由哪个设备占用总线;
  • 具有三种传输模式:标准模式的传输速率为100KB/s,快速模式为400KB/s,高速模式下可达3.4MB/s,但目前大多I2C设备尚不支持高速模式;
  • 片上的滤波器可以滤去总线数据线上的毛刺波以保证数据完整;
  • 连接到相同总线的IC数量受到总线的最大电容400pF限制;
  • 下图所示为常见的I2C通信系统
    I2C通信

1.2 协议层

  • I2C的协议包括起始和停止条件、数据有效性、响应、仲裁、时钟同步和地址广播等环节;

  • 在51单片机中,由于并没有相应的硬件接口,所以需要用软件去模拟SDA和SCL线的时序,详情可以参考郭天祥的《十天教你学会单片机》;

  • 在这里一般使用的更多的是STM32集成的硬件I2C接口;

  • I2C通信的流程图如下所示:
    I2C通信

  • 具体通信步骤可以归纳为:

  1. 起始信号产生后,所有从机就开始等待主机接下来广播的从机地址信号(SLAVE ADDRESS),在I2C总线上,每个设备的地址都是唯一的。当主机广播的地址与某个设备地址相匹配,则选中了该设备。根据I2C协议,从机地址可以是7位或10位。
  2. 在地址位后,是传输方向的选择位,该位为0时,表示后面的数据传输方向是由主机传输到从机,为1则相反;
  3. 从机接收到匹配的地址后,主机或从机会返回一个应答(A)或非应答信号,只有接收到应答信号后,主机才能继续发送或接收数据。
  4. 接收到应答信号之后,主机开始正式向从机传输数据,数据包的大小为8位,没发完一个数据都要等待从机的应答信号。可以传输多个连续的数据。输出传输结束时,主机向从机发送一个停止传输信号§,表示不再传输数据;
  5. 若配置传输方向为读数据,则按照上图右边的子图来进行传输。

2. STM32的I2C特性及架构

2.1 I2C接口特性

  • 能够工作于多主模式或从模式,分别为主接收器、从接收器及发送器;
  • 支持标准模式100kb/s和快速模式400kb/s,不支持高速模式;
  • 支持7位或10位寻址;
  • 内置了硬件CRC发生器/校验器;
  • I2C的接收和发送都可以使用DMA操作;
  • 支持系统管理总线(SMBus)。

2.2 I2C架构

架构图如下所示:
I2C通信

2.3 I2C接口读写实验

由于篇幅过大,请参考《STM32库开发实战》。