1. 概述
ESP8266 作为 I2C 主机的 SDA 与 SCL 线波形由 GPIO 模拟产生,在 SCL 的上升沿之后 SDA 取数。 SCL 高低电平各保持 5us, 因此 I2C 时钟频率约为 100KHz。
2. I2C Master 接口
2.1 初始化
i2c_master_gpio_init: GPIO 硬件初始化
具体如下:
(1) 选择pin脚功能,配置为GPIO
(2) 配置GPIO为开漏模式
(3) 初始化SDA与SCL为高电平
(4) 使能GPIO中断并复位从机状态
i2c_master_init(void): 复位从机状态
2.2 I2C起始

2.3 I2C停止

2.4 I2C主机回复ACK

2.5 I2C主机回复NACK

2.6 检查I2C从机应答

2.7 向I2C总线写数据

2.8 从I2C总线读数据

3. 使用示例
void ICACHE_FLASH_ATTR
user_mvh3004_init(void)
{
i2c_master_gpio_init();
}
LOCAL bool ICAHE_FLASH_ATTR
user_mvh3004_burst_read(uint8 addr, uint8 *pData, uint16 len)
{
uint8 ack;
uint16 i;
i2c_master_start();
i2c_master_writeByte(addr);
ack = i2c_master_checkAck();
if (!ack)
{
os_printf("addr not ack when tx write cmd \n");
i2c_master_stop();
return false;
}
i2c_master_stop();
i2c_master_wait(40000);
i2c_master_start();
i2c_master_writeByte(addr + 1);
ack = i2c_master_checkAck();
if (!ack)
{
os_printf("addr not ack when tx write cmd \n");
i2c_master_stop();
return false;
}
for (i = 0; i < len; i++)
{
pData[i] = i2c_master_readByte();
if (i == (len - 1))
i2c_master_send_nack();
else
i2c_master_send_ack();
}
i2c_master_stop();
return true;
}

本文详细介绍了ESP8266作为I2C主机时的SDA与SCL线波形产生方式,及时钟频率设置。通过具体的代码示例,展示了I2C接口的初始化过程,包括GPIO硬件初始化、配置为开漏模式、初始化SDA与SCL为高电平等步骤。此外,还提供了I2C起始、停止、写数据、读数据及检查从机应答等操作的实现方法。
636

被折叠的 条评论
为什么被折叠?



