软件学习——I2C(7)

本文介绍了I2C协议的基本概念,包括其作为串行、同步、半双工通信协议的特性,以及在ESP32微控制器中的应用。ESP32拥有两个I2C控制器,可作为主站或从站。文章详细阐述了配置I2C驱动的过程,如设置工作模式、GPIO引脚、时钟速度等,并展示了如何进行主站和从站通信,以及中断处理和错误处理的方法。此外,还提及了I2C命令链接的创建和使用,用于读写操作。

i2c

I2C是一种串行、同步、半双工通信协议,允许在同一总线上共存多个主站和从站。I2C 总线由两条线路组成:串行数据线(SDA) 和串行时钟 (SCL)。两条线路都需要上拉电阻。

具有简单、制造成本低等优点,I2C主要用于短距离(一英尺以内)低速外围设备的通信。

ESP32 有两个I2C控制器(也称为端口),负责处理两个 I2C 总线上的通信。每个 I2C 控制器都可以作为主控制器或从控制器运行。例如,一个控制器可以同时充当主控制器,另一个控制器充当从控制器。

驱动程序功能

I2C驱动程序通过 I2C 总线控制设备的通信。该驱动程序支持以下功能:

1在主模式下读取和写入字节

2从模式

3读取和写入寄存器,而寄存器又由主站读/写

以下各节介绍配置和操作I2C驱动:

  • 配置 -设置初始化参数(主模式或从模式、SDA 和 SCL 的 GPIO 引脚、时钟速度等)

  • 安装驱动程序 -在两者之一上激活驱动程序I2C控制器作为主控制器或从控制器

  • 根据您是为主设备还是从设备配置驱动程序,选择适当的项目

  • 作为主站通信 -处理通信(主站)

  • 作为从站通信 -响应来自主站(从站)的消息

  • 中断处理 -配置和服务I2C中断

  • 自定义配置 -调整默认值I2C通信参数(时序、位顺序等)

  • 错误处理 -如何识别和处理驱动程序配置和通信错误

  • 删除驱动程序 -发布资源I2C通信结束时的驱动程序

i2c_config

int i2c_master_port = 0;

i2c_config_t conf = {

.mode =I2C_MODE_SLAVE(I2C从模式)或者I2C_MODE_MASTER(I2C主模式), // 选择工作模式

.sda_io_num = I2C_MASTER_SDA_IO, // 选择SDA管脚的GPIO编号

.sda_pullup_en = GPIO_PULLUP_DISAB或者GPIO_PULLUP_ENABLE= 0x1//禁用 GPIO 上拉电阻,使能 GPIO 上拉电阻

.scl_io_num = I2C_MASTER_SCL_IO, // 选择SCL管脚的GPIO编号

.scl_pullup_en = GPIO_PULLUP_DISAB或者GPIO_PULLUP_ENABLE= 0x1//禁用 GPIO 上拉电阻,使能 GPIO 上拉电阻

.master.clk_speed = I2C_MASTER_FREQ_HZ, // 选择一个合适的时钟频率

};

i2c_param_config(I2C_NUM_0, &conf);//I2C 参数初始化。

i2c_driver_install(i2c_port_t i2c_num, //I2C 端口号

i2c_mode_t mode, //I2C模式(主或从)

size_t slv_rx_buf_len,//从模式的接收缓冲区大小,主模式为零

size_t slv_tx_buf_len,//从模式的发送缓冲区大小,主模式为零

int intr_alloc_flags//用于分配中断的标志。忽略中断为0

);//I2C 驱动程序安装。

i2c_driver_install(0, I2C_MODE_MASTER, 0, 0, 0);

i2c_cmd_handle_t

i2c_cmd_handle_t 任务句柄 读写方式差不多

i2c_cmd_link_create()创建并初始化 I2C 命令链接。

在构建 I2C 命令链接之前,我们需要调用i2c_cmd_link_create() 以创建命令链接。发送完命令后,我们需要调用 i2c_cmd_link_delete() 来释放并返回资源。

i2c_master_start()//I2C 主站的队列命令以生成启动信号。仅在 I2C 主模式下调用此函数 调用 i2c_master_cmd_begin()// 以发送所有排队的命令

i2c_master_write_byte()//I2C 主站将一个字节写入 I2C 总线的队列命令。仅在 I2C 主模式下调用此函数 调用 i2c_master_cmd_begin() 以发送所有排队的命令

i2c_master_write()//I2C 主站将缓冲区写入 I2C 总线的队列命令。仅在 I2C 主模式下调用此函数 调用 i2c_master_cmd_begin() 以发送所有排队的命令

i2c_master_stop()//I2C 主机的队列命令,用于生成停止信号。仅在 I2C 主模式下调用此函数 调用 i2c_master_cmd_begin() 以发送所有排队的命令

i2c_master_cmd_begin()//I2C 主设备发送排队的命令。此函数将触发发送所有排队的命令。该任务将被阻止,直到所有命令都发出。I2C API 不是线程安全的,如果要在不同的任务中使用一个 I2C 端口,则需要处理多线程问题。仅在 I2C 主模式下调用此函数

i2c_cmd_link_delete()//免费的 I2C 命令链接。在构建 I2C 命令链接之前,我们需要调用 i2c_cmd_link_create() 来创建命令链接。发送完命令后,我们需要调用i2c_cmd_link_delete() 释放和返还资源。

代码解析:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值