enjoyneering / ESP8266-I2C-Driver

Fixed built-in I2C driver for Arduino ESP8266 core
76 stars 18 forks source link

Ошибка компиляции для платы Generic ESP8266 Module. #1

Closed selan61 closed 6 years ago

selan61 commented 6 years ago

Выполнил замену. Copy and relpace "twi.h", "core_esp8266_si2c.c" in folder %USERPROFILE%\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\2.3.0\cores\esp8266 Copy and replace "Wire.h", "Wire.cpp" in folder %USERPROFILE%\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\2.3.0\libraries\Wire

Пытаюсь подключить SI7021 к ESP01 на пины 0,2. Беру Ваш пример из библиотеки HTU21D-master SI7021_DEMO при компиляции выдает ошибку.

C:\Users\HOME\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\2.3.0\cores\esp8266_core_esp8266_si2c.c:157:15: error: conflicting types for 'twi_writeTo'

unsigned char twi_writeTo(unsigned char address, unsigned char * buf, unsigned int len, unsigned char sendStop){

^

In file included from C:\Users\HOME\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\2.3.0\cores\esp8266_core_esp8266_si2c.c:21:0:

C:\Users\HOME\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\2.3.0\cores\esp8266\twi.h:66:9: note: previous declaration of 'twi_writeTo' was here

uint8_t twi_writeTo(uint8_t address, uint8_t *buffer, uint8_t length, bool sendStop);

^

C:\Users\HOME\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\2.3.0\cores\esp8266_core_esp8266_si2c.c:181:15: error: conflicting types for 'twi_readFrom'

unsigned char twi_readFrom(unsigned char address, unsigned char* buf, unsigned int len, unsigned char sendStop){

^

In file included from C:\Users\HOME\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\2.3.0\cores\esp8266_core_esp8266_si2c.c:21:0:

C:\Users\HOME\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\2.3.0\cores\esp8266\twi.h:67:9: note: previous declaration of 'twi_readFrom' was here

uint8_t twi_readFrom(uint8_t address, uint8_t *buffer, uint8_t length, bool sendStop);

^

Используем библиотеку Wire версии 1.0 из папки: C:\Users\HOME\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\2.3.0\libraries\Wire Используем библиотеку HTU21D-master версии 1.1.0 из папки: D:\Arduino\libraries\libraries\HTU21D-master exit status 1 Ошибка компиляции для платы Generic ESP8266 Module.

enjoyneering commented 6 years ago

вы не до конца/не правильно выполнили замену. повторите все еще раз.

dontsovcmc commented 6 years ago

А есть где-то diff, чтобы посмотреть Ваши изменения? У меня Wire плохо работает с Attiny85 1Mhz (Internal): ESP-01 спрашивает у него по байтам буфер. Где-то после 20-30 байта возвращается FF FF. Ваше лекарство мне подойдет? =)

enjoyneering commented 6 years ago

diff нет и не будет. я слишком ленивый для этого. теоритический должно помочь. чтоб в этом убедится надо попробовать.

dontsovcmc commented 6 years ago

я решил эту проблему! в wire для ESP надо было увеличить время ожидания бита. а с avr проблемы нет.

enjoyneering commented 6 years ago

вы имете в виду setClockStretchLimit()? и до скольки увеличивали? по умолчанию забито 230

dontsovcmc commented 6 years ago

Да! До 1500. Нижний предел не помню. Так надежно работает. https://github.com/dontsovcmc/waterius/blob/master/ESP8266/src/master_i2c.cpp#L12

enjoyneering commented 6 years ago

на сколько я знаю у Attiny85 нету железного I2C. какой soft Slave I2C либой пользовались для Attiny85?

dontsovcmc commented 6 years ago

Вот здесь и master, и slave. https://github.com/dontsovcmc/USIWire

enjoyneering commented 6 years ago

не пойму зачем? для arduino есть вылизанный фреймворк ATTinyCore. там есть все и master I2C и slave I2C. находится тут - https://github.com/SpenceKonde/ATTinyCore

просто 1500 - это не нормально. похоже на глюк или баг.

p.s. вы писали "Где-то после 20-30 байта возвращается FF FF". в либе по умолчанию буфер 32 байта на прием и передачу. если надо больше ПЕРЕД #include добавьте #define TWI_I2C_BUFFER_LENGTH 40, где 40 размер буфера в байтах. обязательно ПЕРЕД, если добавите после то изменения не вступят в силу. если я не ошибаюсь в soft Slave I2C для Attiny85 такое же ограничение. может у вас просто буфер переполняется с обеих сторон?

в последней версии, есть еще одна недокументированная фича. если ПЕРЕД #include добавить #define TWI_I2C_DISABLE_INTERRUPTS то, на время передачи по I2C, отключатся все прерывания у ESP8266. иногда такой прием увеличивает стабильность связи и скорость между master & slave.

изменение размера буфера и отключение прерываний это уже моя отсебятина, после их использования на оригинальной Wire компилятор может начать ругаться.

и по негласному правилу принято в коментарии писать где искать использованную библиотеку. например так: #include //https://github.com/enjoyneering/LiquidCrystal_I2C

enjoyneering commented 6 years ago

обманул вас. оказывается Arduino IDE линкует библиотечные файлы перед скечем. те вставка #define TWI_I2C_BUFFER_LENGTH 40 ПЕРЕД #include в теле *.ino файла ничего не даст. надо ручками править define в каждой библиотеке.

dontsovcmc commented 6 years ago

Я поясню, почему другую библиотеку взял: я сначала повторил чужой проект метеостанции, а там было переключение i2c Master, потом Slave и возможно это не поддерживает стандартный wire. А потом уже не выкинул. Надо проверить работу wire, спасибо!