深入了解STM32 I2C总线和HAL库函数

一、 I2C总线知识

  1. I2C总线物理拓扑结构

    I2C 总线在物理连接上非常简单,分别由SDA(串行数据线)和SCL(串行时钟线)及上拉电阻组成。通信原理是通过对SCL和SDA线高低电平时序的控制,来 产生I2C总线协议所需要的信号进行数据的传递。在总线空闲状态时,这两根线一般被上面所接的上拉电阻拉高,保持着高电平。

  2. I2C总线特征
    I2C总线上的每一个设备都可以作为主设备或者从设备,而且每一个设备都会对应一个唯一的地址(可以从I2C器件的数据手册得知),主从设备之间就通过这 个地址来确定与哪个器件进行通信,在通常的应用中,我们把CPU带I2C总线接口的模块作为主设备,把挂接在总线上的其他设备都作为从设备。
    I2C总线上可挂接的设备数量受总线的最大电容400pF 限制,如果所挂接的是相同型号的器件,则还受器件地址位的限制。
    I2C总线数据传输速率在标准模式下可达100kbit/s,快速模式下可达400kbit/s,高速模式下可达3.4Mbit/s。一般通过I2C总线接口可编程时钟来实现传输速率的调整,同时也跟所接的上拉电阻的阻值有关。
    I2C总线上的主设备与从设备之间以字节(8位)为单位进行双向的数据传输。

  3. I2C总线协议
    I2C协议规定,总线上数据的传输必须以一个起始信号作为开始条件,以一个结束信号作为传输的停止条件。起始和结束信号总是由主设备产生。总线在空闲状态 时,SCL和SDA都保持着高电平,当SCL为高电平而SDA由高到低的跳变,表示产生一个起始条件;当SCL为高而SDA由低到高的跳变,表示产生一个 停止条件。在起始条件产生后,总线处于忙状态,由本次数据传输的主从设备独占,其他I2C器件无法访问总线;而在停止条件产生后,本次数据传输的主从设备 将释放总线,总线再次处于空闲状态。如图所示:

    在了解起始条件和停止条件后,我们再来看看在这个过程中数据的传输是如何进行的。前面我们已经提到过,数据传输以字节为单位。主设备在SCL线上产生每个 时钟脉冲的过程中将在SDA线上传输一个数据位,当一个字节按数据位从高位到低位的顺序传输完后,紧接着从设备将拉低SDA线,回传给主设备一个应答位, 此时才认为一个字节真正的被传输完成。当然,并不是所有的字节传输都必须有一个应答位,比如:当从设备不能再接收主设备发送的数据时,从设备将回传一个否 定应答位。数据传输的过程如图所示:

    在前面我们还提到过,I2C总线上的每一个设备都对应一个唯一的地址,主从设备之间的数据传输是建立在地址的基础上,也就是说,主设备在传输有效数据之前 要先指定从设备的地址,地址指定的过程和上面数据传输的过程一样,只不过大多数从设备的地址是7位的,然后协议规定再给地址添加一个最低位用来表示接下来 数据传输的方向,0表示主设备向从设备写数据,1表示主设备向从设备读数据。如图所示:

  4. I2C总线操作
    对I2C总线的操作实际就是主从设备之间的读写操作。大致可分为以下三种操作情况:
    第一,主设备往从设备中写数据。数据传输格式如下:

    第二,主设备从从设备中读数据。数据传输格式如下:

    第三,主设备往从设备中写数据,然后重启起始条件,紧接着从从设备中读取数据;或者是主设备从从设备中读数据,然后重启起始条件,紧接着主设备往从设备中写数据。数据传输格式如下:

    第三种操作在单个主设备系统中,重复的开启起始条件机制要比用STOP终止传输后又再次开启总线更有效率。

二、I2C的相关函数
IO operation functions
This subsection provides a set of functions allowing to manage the I2C data transfers.

  1. There are two modes of transfer:
    Blocking mode/阻塞模式 : The communication is performed in the polling mode(轮询方式). The status of all data processing is returned by the same function after finishing transfer.
    No-Blocking mode : The communication is performed using Interrupts or DMA.
    These functions return the status of the transfer startup. The end of the data processing will be indicated through the dedicated I2C IRQ when using Interrupt mode or the DMA IRQ when using DMA mode.
  2. Blocking mode functions are :
    HAL_I2C_Master_Transmit()
    HAL_I2C_Master_Receive()
    HAL_I2C_Slave_Transmit()
    HAL_I2C_Slave_Receive()
    HAL_I2C_Mem_Write()
    HAL_I2C_Mem_Read()
    HAL_I2C_IsDeviceReady()
  3. No-Blocking mode functions with Interrupt are :
    HAL_I2C_Master_Transmit_IT()
    HAL_I2C_Master_Receive_IT()
    HAL_I2C_Slave_Transmit_IT()
    HAL_I2C_Slave_Receive_IT()
    HAL_I2C_Mem_Write_IT()
    HAL_I2C_Mem_Read_IT()
  4. No-Blocking mode functions with DMA are :
    HAL_I2C_Master_Transmit_DMA()
    HAL_I2C_Master_Receive_DMA()
    HAL_I2C_Slave_Transmit_DMA()
    HAL_I2C_Slave_Receive_DMA()
    HAL_I2C_Mem_Write_DMA()
    HAL_I2C_Mem_Read_DMA()
  5. A set of Transfer Complete Callbacks are provided in non Blocking mode:
    HAL_I2C_MemTxCpltCallback()
    HAL_I2C_MemRxCpltCallback()
    HAL_I2C_MasterTxCpltCallback()
    HAL_I2C_MasterRxCpltCallback()
    HAL_I2C_SlaveTxCpltCallback()
    HAL_I2C_SlaveRxCpltCallback()
    HAL_I2C_ErrorCallback()

三、8个常用HAL库函数







物联沃分享整理
物联沃-IOTWORD物联网 » 深入了解STM32 I2C总线和HAL库函数

发表评论