第五章、I2C总线接口设备及驱动

第一节、I2C通信原理及时序:

IIC通信协议用一句话来描述就是:主机呼叫从机,从机接受并反馈信号,传输数据后关闭传输。

1、I2C总线简述:(Inter-Integrated Circuit)

由于早期使用uart通信时,当进行多设备通信时,连接过于繁琐复杂,对于近距设备间通信,成本过高,所以在1982年由飞利浦公司开发出了一种基于总线的多设备通讯方式:I²C通信,总线由简洁的SCL时钟线与SDA数据线组成,多个设备都挂载到这两根上。I²C协议的设计初衷是通过减少连接线数量和简化硬件接口,实现低成本、高效的近距离设备通信。该协议允许多个主设备和从设备共享同一总线,使得系统设计更加简便和灵活。是低速设备通信的常用总线。第五章、I2C总线接口设备及驱动_第1张图片

2、I2C总线通信协议:

下面介绍一下:使用从机E2PROM从机为例,通过时序简要介绍一下IIC通信协议:第五章、I2C总线接口设备及驱动_第2张图片

1.写数据帧:第五章、I2C总线接口设备及驱动_第3张图片

2.读数据帧:第五章、I2C总线接口设备及驱动_第4张图片

第五章、I2C总线接口设备及驱动_第5张图片

3.时序图:第五章、I2C总线接口设备及驱动_第6张图片

4.I2C控制器硬件框图:第五章、I2C总线接口设备及驱动_第7张图片

5.使用CubMX快速配置i2C控制器初始化:第五章、I2C总线接口设备及驱动_第8张图片

第二节、I2C接口通信接口函数分类:

1.HAL关于i2c操作模式介绍:

HAL库把对不同的i2c接口设备使用两种类型的接口,分别为Master主模与Memory模式:

1.Master模式

在I2C的Master模式下,STM32微控制器作为主设备,与从设备进行通信。主设备负责生成时钟信号并启动通信。HAL库中的I2C Master模式函数主要用于发送和接收数据。

主要函数包括:

  • HAL_I2C_Master_Transmit(): 主设备发送数据给从设备。
  • HAL_I2C_Master_Receive(): 主设备从从设备接收数据。
  • HAL_I2C_Master_Transmit_IT(): 主设备以中断方式发送数据。
  • HAL_I2C_Master_Receive_IT(): 主设备以中断方式接收数据。
  • HAL_I2C_Master_Transmit_DMA(): 主设备以DMA方式发送数据。
  • HAL_I2C_Master_Receive_DMA(): 主设备以DMA方式接收数据。

2.Memory模式(MeM模式)

在Memory模式下,STM32微控制器作为主设备,访问从设备的内存。这种模式通常用于读取或写入I2C EEPROM或其他具有内部寄存器的设备。

主要函数包括:

  • HAL_I2C_Mem_Write(): 向从设备的指定内存地址写入数据。
  • HAL_I2C_Mem_Read(): 从从设备的指定内存地址读取数据。
  • HAL_I2C_Mem_Write_IT(): 以中断方式向从设备的指定内存地址写入数据。
  • HAL_I2C_Mem_Read_IT(): 以中断方式从从设备的指定内存地址读取数据。
  • HAL_I2C_Mem_Write_DMA(): 以DMA方式向从设备的指定内存地址写入数据。
  • HAL_I2C_Mem_Read_DMA(): 以DMA方式从从设备的指定内存地址读取数据。

 3.i2c总线接口的从机设备的i2c设备地址,及相应的操作命令码:

1.陀螺仪加速度计:i2c地址7bit:0x68/0x69用于设置不同的i2c设备地址。默认是0x68

第三节.阻塞模式i2c接口函数API介绍:

1. Master模式:

  • HAL_I2C_Master_Transmit(): 主设备发送数据给从设备。

 

HAL_StatusTypeDef HAL_I2C_Master_Transmit(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, 
                                            uint8_t *pData, uint16_t Size, uint32_t Timeout);
参数说明
I2C_HandleTypeDef *hi2c: I2C 句柄,包含了 I2C 配置信息。这个句柄是在初始化 I2C 外设时创建的。
uint16_t DevAddress: 从设备的 7 位或 10 位地址。该地址是左对齐的,即地址的最低有效位(LSB)应该是 0。
uint8_t *pData: 指向需要传输的数据缓冲区的指针。
uint16_t Size: 要传输的数据大小(字节数)。
uint32_t Timeout: 指定超时时间(毫秒)。如果在指定时间内传输未完成,则函数返回超时状态。
返回值
HAL_I2C_Master_Transmit 函数的返回值为 HAL_StatusTypeDef 类型,表示函数的执行状态。可能的返回值包括:
HAL_OK: 表示函数执行成功,数据传输完成。
HAL_ERROR: 表示发生错误。
HAL_BUSY: 表示 I2C 外设正忙,无法执行该操作。
HAL_TIMEOUT: 表示操作超时。                                                                               
  • HAL_I2C_Master_Receive(): 主设备从从设备接收数据。
    HAL_StatusTypeDef HAL_I2C_Master_Receive(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, 
                                                uint16_t Size, uint32_t Timeout);
    参数说明
    I2C_HandleTypeDef *hi2c: I2C 句柄,包含了 I2C 配置信息。这个句柄是在初始化 I2C 外设时创建的。
    uint16_t DevAddress: 从设备的 7 位或 10 位地址。该地址是左对齐的,即地址的最低有效位(LSB)应该是 0。
    uint8_t *pData: 指向存储接收数据的缓冲区的指针。
    uint16_t Size: 要接收的数据大小(字节数)。
    uint32_t Timeout: 指定超时时间(毫秒)。如果在指定时间内接收未完成,则函数返回超时状态。
    返回值
    HAL_I2C_Master_Receive 函数的返回值为 HAL_StatusTypeDef 类型,表示函数的执行状态。可能的返回值包括:
    HAL_OK: 表示函数执行成功,数据接收完成。
    HAL_ERROR: 表示发生错误。
    HAL_BUSY: 表示 I2C 外设正忙,无法执行该操作。
    HAL_TIMEOUT: 表示操作超时。

    2.Memory模式:

  • HAL_I2C_Mem_Write(): 向从设备的指定内存地址写入数据。

你可能感兴趣的:(freertos应用开发,单片机,嵌入式硬件,stm32)