CN / EN
文档反馈
感谢关注汇顶文档,期待您的宝贵建议!
感谢您的反馈,祝您愉快!
无匹配项 共计114个匹配页面

如何使用I2C驱动

I2C的HAL驱动的使用方法如下:
  1. 定义一个i2c_handle_t句柄结构体变量,例如:i2c_handle_t i2c_handle(i2c_handle_t结构体由I2C的HAL驱动定义,开发者在使用时需要定义一个该结构体类型的变量)。
  2. 重写hal_i2c_msp_init()接口以初始化I2C底层资源:
    1. 配置I2C对应GPIO引脚的功能复用、使能上拉电阻。
    2. 如果需要使用中断或DMA方式的IO操作接口,则需通过调用相关的NVIC接口来配置:
      • 调用hal_nvic_set_priority()配置I2C的中断优先级。
      • 调用hal_nvic_enable_irq()使能I2C的NVIC中断。
    3. 如果需要使用DMA方式的IO操作接口,则还需要配置使用的DMA通道:
      • 定义用于发送/接收的dma_handle_t句柄结构体变量,如dma_handle_t dma_tx、dma_rx。
      • 配置DMA句柄dma_tx及dma_rx中的参数,如指定TX或RX通道。
      • 将I2C Handler结构体变量中的p_dmatx和p_dmarx指针分别指向已初始化的DMA句柄变量dma_tx和dma_rx。
      • 配置DMA的中断优先级、使能DMA的NVIC中断。
  3. 配置I2C初始化结构体中的数据传输速率、本机设备地址、设备地址模式以及广播地址监测模式。
  4. 调用hal_i2c_init()配置I2C寄存器,配置过程中hal_i2c_init()会自动调用开发者重写的hal_i2c_msp_init()函数初始化I2C所使用的GPIO等底层资源。
  5. 对于I2C的IO读写或IO内存读写操作,I2C的HAL驱动提供三种操作方式的接口:轮询、中断及DMA。

轮询方式的IO读写操作

  1. 作为主设备以轮询方式发送大量数据时使用hal_i2c_master_transmit()。
  2. 作为主设备以轮询方式接收大量数据时使用hal_i2c_master_receive()。
  3. 作为从设备以轮询方式发送大量数据时使用hal_i2c_slave_transmit()。
  4. 作为从设备以轮询方式接收大量数据时使用hal_i2c_slave_receive()。

轮询方式的IO内存读写操作

  1. 以轮询方式向指定地址写入大量数据时使用hal_i2c_mem_write()。
  2. 以轮询方式从指定地址读取大量数据时使用hal_i2c_mem_read()。

中断方式的IO读写操作

  1. 作为主设备以中断非轮询方式发送大量数据时使用hal_i2c_master_transmit_it(),发送完成时回调函数hal_i2c_master_tx_cplt_callback()将会被调用。
  2. 作为主设备以中断非轮询方式接收大量数据时使用hal_i2c_master_receive_it(),接收完成时回调函数hal_i2c_master_rx_cplt_callback()将会被调用。
  3. 作为从设备以中断非轮询方式发送大量数据时使用hal_i2c_slave_transmit_it(),发送完成时回调函数hal_i2c_slave_tx_cplt_callback()将会被调用。
  4. 作为从设备以中断非轮询方式接收大量数据时使用hal_i2c_slave_receive_it(),接收完成时回调函数hal_i2c_slave_rx_cplt_callback()将会被调用。
  5. 如果数据收发过程中发生了错误,则hal_i2c_error_callback()回调函数将会被调用。
  6. 作为主设备时,如果需要中止数据收发,则可以使用hal_i2c_master_abort_it(),中止完成后回调函数hal_i2c_abort_cplt_callback()将会被调用。
说明:

对于上述回调函数,开发者均可通过重写函数完成指定的操作。

中断方式的IO内存读写操作

  1. 以中断非轮询方式向指定地址写入大量数据时使用hal_i2c_mem_write_it(),写入完成时回调函数hal_i2c_mem_tx_cplt_callback()将会被调用。
  2. 以中断非轮询方式从指定地址读取大量数据时使用hal_i2c_mem_read_it(),读取完成时回调函数hal_i2c_mem_rx_cplt_callback()将会被调用。
  3. 如果数据收发过程中发生了错误,则hal_i2c_error_callback()回调函数将会被调用。
说明:

对于上述回调函数,开发者均可通过重写函数完成指定的操作。

DMA方式的IO读写操作

  1. 作为主设备以DMA非轮询方式发送大量数据时使用hal_i2c_master_transmit_dma(),发送完成时回调函数hal_i2c_master_tx_cplt_callback()将会被调用。
  2. 作为主设备以DMA非轮询方式接收大量数据时使用hal_i2c_master_receive_dma(),接收完成时回调函数hal_i2c_master_rx_cplt_callback()将会被调用。
  3. 作为从设备以DMA非轮询方式发送大量数据时使用hal_i2c_slave_transmit_dma(),发送完成时回调函数hal_i2c_slave_tx_cplt_callback()将会被调用。
  4. 作为从设备以DMA非轮询方式接收大量数据时使用hal_i2c_slave_receive_dma(),接收完成时回调函数hal_i2c_slave_rx_cplt_callback()将会被调用。
  5. 如果数据收发过程中发生了错误,则hal_i2c_error_callback()回调函数将会被调用。
  6. 作为主设备时,如果需要中止数据收发,则可以使用hal_i2c_master_abort_it(),中止完成后回调函数hal_i2c_abort_cplt_callback()将会被调用。
说明:

对于上述回调函数,开发者均可通过重写函数完成指定的操作。

DMA方式的IO内存读写操作

  1. 以DMA非轮询方式向指定地址写入大量数据时使用hal_i2c_mem_write_dma(),写入完成时回调函数hal_i2c_mem_tx_cplt_callback()将会被调用。
  2. 以DMA非轮询方式从指定地址读取大量数据时使用hal_i2c_mem_read_dma(),读取完成时回调函数hal_i2c_mem_rx_cplt_callback()将会被调用。
  3. 如果数据收发过程中发生了错误,则hal_i2c_error_callback()回调函数将会被调用。
说明:

对于上述回调函数,开发者均可通过重写函数完成指定的操作。

扫描关注

打开微信,使用“扫一扫”即可关注。