RTL8710 & Arduino & библиотеки & i2c

nhknhk

New member
Подскажите кто имеет успешный опыт / пример как можно работать в RTL8710 c I2C. есть модули семи сегментных индикаторов на TM1637, библиотеки ардуины на ESp8266 и avr проверял нормально работают. есть дисплей с интерфейсом i2c, он также работает на ESP и AVR, но ни то не другое на RTL8710 почему-то с теми же скетчами не работает. даже i2c сканер по не понятной причине отображает все адреса как активные. вот 2й день думаю где я что делаю не так.
 

nhknhk

New member
Как вы подключаете I2C к модулю? И какой модуль у вас кстати, RTL-00 ?
И еще, используете Ардуину от pvvx (pvvx/RtlDuino) или официальную Ameba (Ameba Arduino: Getting Started with RTL8195 – Realtek IoT/Arduino Solution) или RAK (https://github.com/RAKWireless/CREATOR-Arduino-SDK)?
модуль rtl00 B&T (https://www.makerfabs.com/image/cac...Board/RTL8710AF Development Board-700x525.JPG), есть просто сборка без обвески. использую RtlDruino, хотел офф. сдк RTL8195, но первое после компиляции и прошивки модуля с репозитарием RTL8195 у меня модуль не стартует, помогает только полная перепрошивка на AT. во вторых там нет поддержки SSL-клиента для RTL8710, хотя по факту это просто софт. блокировка. с RTLDruino SSL клиент работает отлично.
пробовал пины GC5 (#13 SCL) и GA2 (#2 SDA). хотя например все библиотеки которые работают с tm1637(https://www.makerlab-electronics.com/my_uploads/2017/01/4bitdigit7segmt1637-1-510x480.jpg) i2c вообще не используют, а просто дрыгают GPIO и должны в принципе работать вообще на любых пинах. но с библиотеками типа TM1637 в различных вариациях не приходит ACK на ногу DIO в функции writeByte()
судя по коду должен быть лог. ноль, но всегда лог. единица приходит в ответ.
 

nhknhk

New member
строка 69 TM1637.cpp uint8_t ack = digitalRead(Datapin); у меня всегда возвращает 1, пробовал разные пины.
соотв. в строке 70 условие никогда не выполняется и дата пин назад в режим вывода не переключается.
 

Вложения

A_D

Active member
Посмотрел даташит на этот чип - http://www.mcielectronics.cl/website_MCI/static/documents/Datasheet_TM1637.pdf (я с ним не работал), это больше на SPI похоже (только half duplex), чем на i2c, что и объясняет, почему в библиотеках не используют аппаратный i2c.
Но опять же, от SPI его отличает этот самый АСК - который на аппаратном SPI будет запаристо так генерить:
upload_2018-6-21_15-47-15.png
В итоге - просто на любые пины и вешают поэтому, софтварно дёргая..

И судя по коду:
Код:
  bitDelay();
  uint8_t ack = digitalRead(Datapin);
  if (ack == 0)
  {
     pinMode(Datapin,OUTPUT);
     digitalWrite(Datapin,LOW);
  }
  bitDelay();
  pinMode(Datapin,OUTPUT);
  bitDelay();
вот эти самые bitDelay() сильно зависят от железа на котором работает прошивка, предполагаю, что на 8-битной атмеге задержка больше для записи\чтения и поэтому все работает .. можно собственно попробовать изменить задержку в
Код:
void TM1637::bitDelay(void)
{
    delayMicroseconds(50);
}
И по поводу i2c - я запускал его без проблем на USDK от pvvx, у него и примеры работы есть хорошие, сканер у вас выдаёт все адреса видимо из-за того, что этот дисплей не i2c и его выход лочится при какой то комбинации, да, кст, подтяжки к питанию для i2c не забыли ? и пробовали ли заведомо рабочий датчик\дисплей именно i2c-шный подключать - сканер так же не определяет его?
 

nhknhk

New member
Посмотрел даташит на этот чип - http://www.mcielectronics.cl/website_MCI/static/documents/Datasheet_TM1637.pdf (я с ним не работал), это больше на SPI похоже (только half duplex), чем на i2c, что и объясняет, почему в библиотеках не используют аппаратный i2c.
Но опять же, от SPI его отличает этот самый АСК - который на аппаратном SPI будет запаристо так генерить:
Посмотреть вложение 6492
В итоге - просто на любые пины и вешают поэтому, софтварно дёргая..

И судя по коду:
Код:
  bitDelay();
  uint8_t ack = digitalRead(Datapin);
  if (ack == 0)
  {
     pinMode(Datapin,OUTPUT);
     digitalWrite(Datapin,LOW);
  }
  bitDelay();
  pinMode(Datapin,OUTPUT);
  bitDelay();
вот эти самые bitDelay() сильно зависят от железа на котором работает прошивка, предполагаю, что на 8-битной атмеге задержка больше для записи\чтения и поэтому все работает .. можно собственно попробовать изменить задержку в
Код:
void TM1637::bitDelay(void)
{
    delayMicroseconds(50);
}
И по поводу i2c - я запускал его без проблем на USDK от pvvx, у него и примеры работы есть хорошие, сканер у вас выдаёт все адреса видимо из-за того, что этот дисплей не i2c и его выход лочится при какой то комбинации, да, кст, подтяжки к питанию для i2c не забыли ? и пробовали ли заведомо рабочий датчик\дисплей именно i2c-шный подключать - сканер так же не определяет его?
пробовал ставить 1 мс задержку. подозревал что может быть просто не работает вообще задержка в микросекундах. но это не помогло. может быть еще беда с лог. уровнями ? модуль работает от 5ти вольт, RTL от 3.3 не знаю толерантны ли ее выводы к +5? может для нее лог. ноль в 1.5 вольта ( по даташиту 0.3 VDD ) тоже за лог 1цу идет? дисплей заведомо рабочий тот же скетч на ESP его находит как i2c
 

A_D

Active member
START,ACK и STOP -есть, Значит I2C, а не SPI.
Ага... китайцы вам могут всё, что угодно нарисовать... как и на заборе в принципе.
upload_2018-6-21_16-47-43.png

Не объясните тогда, почему хардварный i2с не используется в библиотеках, если тут якобы i2c ?

ЗЫ. Подсказка из даташита: Note: The communication method is not equal to 12C bus protocol totally because there is no slave address.
 
Последнее редактирование:

A_D

Active member
пробовал ставить 1 мс задержку. подозревал что может быть просто не работает вообще задержка в микросекундах. но это не помогло. может быть еще беда с лог. уровнями ? модуль работает от 5ти вольт, RTL от 3.3 не знаю толерантны ли ее выводы к +5? может для нее лог. ноль в 1.5 вольта ( по даташиту 0.3 VDD ) тоже за лог 1цу идет? дисплей заведомо рабочий тот же скетч на ESP его находит как i2c
По хорошему, надо согласовывать или делителем (в одну сторону правда) или микрухой (типа GTL2003).

Еще кст, из даташита - High-level input voltage = 0.7*VDD и при 5В это 3,5В - т.е. не хватает немного до лог 1цы...согласователь по любому нужен таки.
Еще не плохо было бы проверить пины, куда подключали 5 В логику на всякий случай, не выпалилось ли (но почему то думаю, что они живые) - светодиодом помигать и лог сигнал к примеру от кнопки посмотреть.

Да и еще.... основное, почему может не работать - pinMode() в библиотеках от Ameba не работает повторно, поэтому переключения вход\выход не получатся.
 
Последнее редактирование:

nhknhk

New member
попробовал "осциллографом" посмотреть. vdd около 4,5 вольт. ACK приходит, но может очень быстро? и надо его ждать некоторое время? или сделать сработку по прерыванию, и проверять флаг?
 

Вложения

nhknhk

New member
По хорошему, надо согласовывать или делителем (в одну сторону правда) или микрухой (типа GTL2003).

Еще кст, из даташита - High-level input voltage = 0.7*VDD и при 5В это 3,5В - т.е. не хватает немного до лог 1цы...согласователь по любому нужен таки.
Еще не плохо было бы проверить пины, куда подключали 5 В логику на всякий случай, не выпалилось ли (но почему то думаю, что они живые) - светодиодом помигать и лог сигнал к примеру от кнопки посмотреть.

Да и еще.... основное, почему может не работать - pinMode() в библиотеках от Ameba не работает повторно, поэтому переключения вход\выход не получатся.
GTL2003 посмотрел пооблизывался, но не нашел где ее заказать? может проще поставить 2 транзистора полевых, и еще одну ногу использовать для чтения ACK? или поставить оптопары типа pc817?
 

nhknhk

New member
сделал тестовый скетч проверил переключение режима ввод/вывод через pinMode(), режим переключается все работает. так что проблема в лог. уровнях скорее всего.
 

nhknhk

New member
осциллограф говорит что на выходе максимум 3.45 вольта. если замерять лог единицу.
 

nhknhk

New member
странно вот что почему эта гадость работает на ESP, у которой питание тоже 3.3 вольта и не чирикает?
 

A_D

Active member
странно вот что почему эта гадость работает на ESP, у которой питание тоже 3.3 вольта и не чирикает?
сделал тестовый скетч проверил переключение режима ввод/вывод через pinMode(), режим переключается все работает. так что проблема в лог. уровнях скорее всего.
Тогда дело исключительно в прошивке. Кстати, если есть осциллограф - можно попробовать посмотреть разницу в сигналах от esp и rtl - может натолкнёт на мысли..
 

A_D

Active member
GTL2003 посмотрел пооблизывался, но не нашел где ее заказать? может проще поставить 2 транзистора полевых, и еще одну ногу использовать для чтения ACK? или поставить оптопары типа pc817?
Ну то я как проверенный пример привёл, можно любую другую с аналогичным функционалом, заказать как простой вариант можно в ЧиД, не так и дорого и в Евросеть доставят Результаты поиска «gtl2003» правда срок поставки неадекватный сейчас.. :\ К примеру в электронщике есть Результаты поиска для «gtl2003» но цена не очень..
 

pvvx

Активный участник сообщества
GTL2003 посмотрел пооблизывался, но не нашел где ее заказать? может проще поставить 2 транзистора полевых, и еще одну ногу использовать для чтения ACK? или поставить оптопары типа pc817?
Если применяется аппаратный контроллер I2C в RTL, то никаких делителей не требуется. У него входы-входы открытый коллектор и со всеми тестируемыми микросхемами работает напрямую, при наличии подтяжек у SCL и SDA на 5В.
Простой пример нативной работы с I2C контролерами в RTL: I2C на RTL...
сделал тестовый скетч проверил переключение режима ввод/вывод через pinMode(), режим переключается все работает. так что проблема в лог. уровнях скорее всего.
Глючит повторное переключение режима пина в либах Arduino от Ameba. Проверено на массе сторонних библиотек и тестах. Никогда и ни где не исправлялось, т.к. "ногодрыг" неоптимален, а для каждого устройства всё равно пишут свой драйвер... И для шинных протоколов - есть свои встроенные аппаратные контролеры.
В rtlDгino с контроллером GPIO работает "bitband_io.h"...
 

nhknhk

New member
к сожалению как выше было замечено, tm1637 это не I2C, и похоже что таки RTL8710 не хватает полвольта до лог. единицы, и без ногодрыгания в этом девайсе никак. все вариации библиотек что я пробовал не используют аппаратный контроллер, т.к. протокол у tm не стандартный.
 

nhknhk

New member
попробовал в коде заменить режим OUTPUT на OPEN_DRAIN, вопрос всели выводы RTL сей режим поддерживают и поддерживают ли вообще. но вроде напряжение на выводах доросло до 4.24 вольт, что примерно равно VDD, в любом случае больше 0,7VDD но оно всеравно не заработало. проверял ацк отключив модуль. подтяжкой резистора на GND и VCC. код отрабатывает переключение. что ему еще нужно сижу гадаю. если у кого есть RTLка и tm1637 попробуйте может у вас заработает.
 

Вложения

nhknhk

New member
тотже код на есп работает. картинка примерно похожа. единственное что напряжение всерднем на 0.1 0.2 вольта скачет больше чем 4.24 как у RTL. на дисплей исправно выводится единица.
 

Вложения

Сверху Снизу