ESP32C3学习&开发之路——最全的IIC协议_esp32 iic(1)

2.1起始和停止条件

起始(S)和停止(P)条件一般由主机产生,总线在起始条件后被认为处于忙的状态。在停止条件的某段时间后,总线被认为再次处于空闲状态。
起始条件:在 SCL 线是高电平时,SDA 线从高电平向低电平切换
停止条件:当 SCL 是高电平时,SDA 线由低电平向高电平切换
起始(S)和停止(P)条件时序图如下:
在这里插入图片描述
起始条件表示开始交互,停止条件表示交互结束,主机释放总线,在一次交互中主机可以发起多次起始条件(如读数据)。

2.2应答(ACK)和不应答(NACK)

应答:
数据传输必须带响应,相关的响应时钟脉冲由主机产生,在响应的时钟脉冲期间,发送器释放 SDA 线(高),接收器必须将 SDA 线拉低,使它在这个时钟脉冲的高电平期间保持稳定的低电平 。
数据的每个字节(包括地址字节)后面跟着一个来自接收端的ACK位。ACK位允许接收端向发送端发送已成功接收的字节和可以发送的另一个字节。
不应答:
当SDA线在ACK/NACK相关的时钟周期内保持高电平时,这被解释为不应答(NACK)。
有以下几种情况会产生不应答(NACK):
当从机不能响应从机地址时(例如它正在执行一些实时函数不能接收或发送)从机必须使数据线保持高电平。主机然后产生一个停止条件终止传输或者产生重复起始条件开始新的传输。
如果从机-接收器响应了从机地址但是在传输了一段时间后不能接收更多数据字节,主机必须再一次终止传输。这个情况用从机在第一个字节后没有产生响应来表示。从机使数据线保持高电平,主机产生一个停止或重复起始条件。
如果传输中有主机接收器,它必须通过在从机不产生时钟的最后一个字节不产生一个响应,向从机发送器通知数据结束。从机-发送器必须释放数据线,允许主机产生一个停止或重复起始条件。
总结为:
(1)从机无法接收或发送,因为它正在执行一些实时功能,并没有准备好开始与主机通信。
(2)在传输过程中,从机无法接收更多的数据字节。
(3)主机机完成了读取数据并通过NACK指示从机。
(4)在传输过程中,主机获取了它不理解的数据或命令。

应答(ACK)和不应答(NACK)时序图:
在这里插入图片描述

2.3写数据

给从机写数据,主机将在总线先发送起始条件,再发送一个带有写标志的从机地址,在最后一个位(R/W位)设置为0,表示写。 在从机发送应答位后,主机将发送它希望写入的寄存器的寄存器地址。 从机会再次应答,让主人知道它准备好了。 在此之后,主机将开始向从机发送寄存器数据,直到主机发送了它需要的所有数据(有时只是一个字节),并且主机将用STOP条件终止传输,如图所示:
在这里插入图片描述

2.4读数据

在第一个字节后,主机立即读从机如图,在第一次响应时,主机——发送器变成主机——接收器,从机——接收器变成从机——发送器。第一次响应仍由从机产生。之前发送了一个不响应信号的主机产生停止条件。

  • 29
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
ESP32-C3是一款高度集成的低功耗Wi-Fi和蓝牙SoC,是ESP32系列的最新成员。ESP32-C3的硬件支持I2C总线,可以实现多个设备之间的通信。ESP32-C3的I2C实现使用硬件I2C接口,可以实现高速、稳定的数据传输。以下是ESP32-C3 I2C的基本使用方法: 1. 配置I2C总线参数: ```c i2c_config_t conf; conf.mode = I2C_MODE_MASTER; conf.sda_io_num = I2C_SDA_PIN; conf.scl_io_num = I2C_SCL_PIN; conf.sda_pullup_en = GPIO_PULLUP_ENABLE; conf.scl_pullup_en = GPIO_PULLUP_ENABLE; conf.master.clk_speed = I2C_FREQ_HZ; i2c_param_config(I2C_NUM_0, &amp;conf); ``` 其中,I2C_SDA_PIN和I2C_SCL_PIN是SDA和SCL信号线的GPIO引脚号,I2C_FREQ_HZ是I2C总线的时钟频率。 2. 初始化I2C总线: ```c i2c_driver_install(I2C_NUM_0, I2C_MODE_MASTER, 0, 0, 0); ``` 3. 发送I2C数据: ```c i2c_cmd_handle_t cmd = i2c_cmd_link_create(); i2c_master_start(cmd); i2c_master_write_byte(cmd, SLAVE_ADDR << 1 | WRITE_BIT, ACK_CHECK_EN); i2c_master_write_byte(cmd, data, ACK_CHECK_EN); i2c_master_stop(cmd); esp_err_t ret = i2c_master_cmd_begin(I2C_NUM_0, cmd, 1000 / portTICK_RATE_MS); i2c_cmd_link_delete(cmd); ``` 其中,SLAVE_ADDR是从设备的I2C地址,WRITE_BIT是写操作标志位,data是要发送的数据。 4. 接收I2C数据: ```c i2c_cmd_handle_t cmd = i2c_cmd_link_create(); i2c_master_start(cmd); i2c_master_write_byte(cmd, SLAVE_ADDR << 1 | READ_BIT, ACK_CHECK_EN); i2c_master_read_byte(cmd, &amp;data, ACK_CHECK_EN); i2c_master_stop(cmd); esp_err_t ret = i2c_master_cmd_begin(I2C_NUM_0, cmd, 1000 / portTICK_RATE_MS); i2c_cmd_link_delete(cmd); ``` 其中,READ_BIT是读操作标志位,data是接收数据的变量。 以上代码仅供参考,具体实现要根据实际应用场景进行调整。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值