ESP8266 Developer Zone The Official ESP8266 Forum 2015-08-31T15:02:56+08:00 https://bbs.espressif.com:443/feed.php?f=7&t=1035 2015-08-31T15:02:56+08:00 2015-08-31T15:02:56+08:00 https://bbs.espressif.com:443/viewtopic.php?t=1035&p=3502#p3502 <![CDATA[I2C GPIO 开漏问题]]> 最近在用ESP8266的I2C总线驱动外部传感器,SDK版本是1.3,但发现不管发什么数据多无法返回ACK信号,后发现在SDA=1时输出的是高电平信号,而且该信号还无法拉低。外接2K电阻时还是输出3.3V。
后将SDA=1 SCL=1时设置为输入状态,能够采集到ACK信号,我想问下是不是SDK中的开漏模式设置有问题,程序如下:
void ICACHE_FLASH_ATTR
i2c_master_gpio_init(void)
{
ETS_GPIO_INTR_DISABLE() ;
// ETS_INTR_LOCK();

PIN_FUNC_SELECT(I2C_MASTER_SDA_MUX, I2C_MASTER_SDA_FUNC);
PIN_FUNC_SELECT(I2C_MASTER_SCL_MUX, I2C_MASTER_SCL_FUNC);

GPIO_REG_WRITE(GPIO_PIN_ADDR(GPIO_ID_PIN(I2C_MASTER_SDA_GPIO)), GPIO_REG_READ(GPIO_PIN_ADDR(GPIO_ID_PIN(I2C_MASTER_SDA_GPIO))) | GPIO_PIN_PAD_DRIVER_SET(GPIO_PAD_DRIVER_ENABLE)); //open drain;
GPIO_REG_WRITE(GPIO_ENABLE_ADDRESS, GPIO_REG_READ(GPIO_ENABLE_ADDRESS) | (1 << I2C_MASTER_SDA_GPIO));
GPIO_REG_WRITE(GPIO_PIN_ADDR(GPIO_ID_PIN(I2C_MASTER_SCL_GPIO)), GPIO_REG_READ(GPIO_PIN_ADDR(GPIO_ID_PIN(I2C_MASTER_SCL_GPIO))) | GPIO_PIN_PAD_DRIVER_SET(GPIO_PAD_DRIVER_ENABLE)); //open drain;
GPIO_REG_WRITE(GPIO_ENABLE_ADDRESS, GPIO_REG_READ(GPIO_ENABLE_ADDRESS) | (1 << I2C_MASTER_SCL_GPIO));

I2C_MASTER_SDA_HIGH_SCL_HIGH();

ETS_GPIO_INTR_ENABLE() ;
// ETS_INTR_UNLOCK();

i2c_master_init();
}
SDA,SCL=1时为输入程序如下
#if Input == 0

#define I2C_MASTER_SDA_HIGH_SCL_HIGH() \
gpio_output_set(1<<I2C_MASTER_SDA_GPIO | 1<<I2C_MASTER_SCL_GPIO, 0, 1<<I2C_MASTER_SDA_GPIO | 1<<I2C_MASTER_SCL_GPIO, 0)
#define I2C_MASTER_SDA_HIGH_SCL_LOW() \
gpio_output_set(1<<I2C_MASTER_SDA_GPIO, 1<<I2C_MASTER_SCL_GPIO, 1<<I2C_MASTER_SDA_GPIO | 1<<I2C_MASTER_SCL_GPIO, 0)
#define I2C_MASTER_SDA_LOW_SCL_HIGH() \
gpio_output_set(1<<I2C_MASTER_SCL_GPIO, 1<<I2C_MASTER_SDA_GPIO, 1<<I2C_MASTER_SDA_GPIO | 1<<I2C_MASTER_SCL_GPIO, 0)

#else
#define I2C_MASTER_SDA_HIGH_SCL_HIGH() \
gpio_output_set(0, 0, 0, 1<<I2C_MASTER_SDA_GPIO | 1<<I2C_MASTER_SCL_GPIO)
#define I2C_MASTER_SDA_HIGH_SCL_LOW() \
gpio_output_set(0, 1<<I2C_MASTER_SCL_GPIO, 1<<I2C_MASTER_SCL_GPIO, 1<<I2C_MASTER_SDA_GPIO)
#define I2C_MASTER_SDA_LOW_SCL_HIGH() \
gpio_output_set(0, 1<<I2C_MASTER_SDA_GPIO, 1<<I2C_MASTER_SDA_GPIO , 1<<I2C_MASTER_SCL_GPIO)

#endif

Statistics: Posted by xad74 — Mon Aug 31, 2015 3:02 pm


]]>