我正在开发一个I2C桥接器,使我能够以“智能”方式虚拟扩展ESP8266ex上可用的引脚。 ESP8266ex很不错但是可用的引脚较少。
它看起来像……
终于找到了bug和解决方案,在用ESP的库代码玩了几个小时之后,这是ESP twi库的一个问题。我发布这个作为答案,也许它可以帮助别人。原因:超时范围太小,因此,将超时调用到早期,依赖于此的功能将失败。这就是读取0xFF而不是实际接收数据的原因(它实际上存在)。
我从以前的项目中了解到,Esp8266在延迟方面非常挑剔,由于某种原因需要太长时间的过程可能导致崩溃或设备开始出现故障,但是,实际上,这种超时太小,特别是当您使用更多的phiperials时例如显示或想要通过BUS发送更多字节。
这是ESP8266 twi库中的一个错误 twi_init 功能。它与I2C总线读取超时有关,无法通过类功能更改(您可以更改总线速度但不能更改),此功能内的值是硬编码的。
twi_init
功能是在 的 包/ esp8266 / 2.4.0 /核心/ esp8266 / core_esp8266_si2c.c 强> :
void twi_init(unsigned char sda, unsigned char scl){ twi_sda = sda; twi_scl = scl; pinMode(twi_sda, INPUT_PULLUP); pinMode(twi_scl, INPUT_PULLUP); twi_setClock(100000); twi_setClockStretchLimit(230); // default value is 230 uS }
它在 twi_setClockStretchLimit() 指令,“ClockStretch”(无论这意味着什么)设置为230 uS,这是一种太低或太窄的方式。
twi_setClockStretchLimit()
要修复它,您需要将此值提高到600或更高,并且必须在Wire库初始化后执行此操作,例如:
Wire.begin(); // Give it some time delay( 500 ); // default value is set to 230 uS, we change it here twi_setClockStretchLimit(600); ..... .....
现在我可以收到完整的32个字节(默认缓冲区限制)。因此,当我向ATMega从器件询问EEPROM内的字符串(流)时,我将接收28字节的数据和4字节的数据信息(errorCode(字节),dataType(字节),长度(2字节))。
玩得开心 ;-)