Jump to content
Sign in to follow this  
Nikolay_R

Проблемы в работе I2C

Recommended Posts

Добрый день! В данный момент прохожу производственную преддипломную практику (сам учусь в УРТК). Стоит задача соединить Lego EV3 и Raspberry PI по I2C интерфейсу. До этого, при работе с другими устройствами, у меня никогда не было проблем с I2C интерфейсом, но в данной связке "EV3-RPI" - начались ошибки. Перед описанием ошибок, уточню, что EV3 - Master, а Raspberry - Slave, т.к. EV3 умеет работать только в режиме Master.
Первое, что бросается в глаза, это практически постоянная передача в эфир SLA пакета (адреса Slave-устройства). По-факту, именно с этого и должна начинаться передача, но в данном случае, её попросту не происходит. А, если быть точнее, то происходит она только каждый шестой раз.
Следующая проблема заключается в том, что обмен данными не всегда происходит до конца. Даже если EV3 отправляет свой пакет (два байта), то ответ от Raspberry (он тоже два байта) приходит через-раз, а то и ещё реже.
я также пробовал соединять EV3 с Arduino, Arduino с Raspberry, что бы найти причину, но там всё отлично работало и ошибок было ноль. Стабильный обмен двумя байтами, как и нужно.

Очень нужна помощь в устранении данных ошибок!


P.S: У EV3 используется нестандартный уровень лог. единицы (там он 4.3в) и обычные конверторы уровней уже не работают с ним. Поэтому, мне пришлось перепаивать его под другие номиналы подтягивающих резисторов, что бы всё заработало. В его работе нареканий нет.

Ниже показаны осциллограммы работы I2C между различными устройствами, которые были задействованы.

Снимок экрана (9).png

Снимок экрана (8).png

Share this post


Link to post
Share on other sites

В обеих осциллограммах видно, что при передаче от EV3 в линии SDA уровень нуля не дотягивает до собственно нуля. Причем в рабочем варианте он немного не дотягивает, а в нерабочей процентов 40 остается между нижним уровнем импульса и собственно нулем (GND). сравните с импульсами ACK от raspberry. Предполагаю, что в какой-то момент raspberry просто не может принять то, что прислали и не выдает ACK и в этом случае EV3 начинает слать снова, отсюда и спам.

33 minutes ago, Nikolay_R said:

P.S: У EV3 используется нестандартный уровень лог. единицы (там он 4.3в) и обычные конверторы уровней уже не работают с ним. Поэтому, мне пришлось перепаивать его под другие номиналы подтягивающих резисторов, что бы всё заработало. В его работе нареканий нет.

вот имхо тут и проблема. Какие резисторы сейчас стоят?

Edited by LeonidPr

Share this post


Link to post
Share on other sites

Плата расширения для Arduino с защищенными 24-вольтовыми ключами Infineon семейства PROFET

Компания Infineon представила плату расширения для Arduino c 24-вольтовыми ключами PROFET™+24V (BTT6xxx). Данное семейство ключей верхнего плеча с защитами предназначено для управления резистивными, емкостными и индуктивными нагрузками (лампы автомобилей, реле, двигатели, клапаны, светодиоды, конденсаторы). Использование платы расширения для Arduino с 24-вольтными защищенными ключами ускоряет создание прототипов и позволяет с минимальными затратами проводить тестирование совместимых по распиновке ключей PROFET™+24V.
Подробнее

18.01.2021 в 16:05, LeonidPr сказал:

/////////////////////

Доброго времени суток! Спасибо за хорошую подсказку. На момент поста использовал 47к с обеих сторон, теперь поменял резисторы со стороны EV3 на 30к и оно стало +- стабильно работать.  Кроме того, подтяжка теперь идёт не от 4.3в, а от 5в (опять же, это всё со стороны EV3).
Но! Работает стабильно лишь с подключенным осциллографом (щупы осциллографа ISDS 205B подключены к SDA SCL линиям EV3) . Если отключить щупы от этих контактов, то связь вновь барахлит. Ещё заметил, что связь нормализуется при касании пальцев к этим линиям. Если убрать Щупы, то опять начинаются проблемы (до замены резисторов проблемы были всегда).

Пробовал подвязывать через мегаомные резисторы эти линии к земле - не помогло (пытался сымитировать входное сопротивление осцилла). Так же, пробовал добавлять последовательно конденсатор на 10нФ, но помогло минимально.
Можете подсказать, что ещё можно изменить, что бы добиться такой же стабильности, но у же без осциллографа в схеме?)

Снимок экрана (11).png

Edited by Falconist
Оверквотинг

Share this post


Link to post
Share on other sites

Вебинар «Умный и безопасный дом от STMicroelectronics – строим вмеSTе!» (23.06.2021)

Приглашаем 23/06/2021 всех желающих принять участие в вебинаре, посвященном проектированию и разработке систем умного дома на базе компонентов STMicroelectronics. Экосистема продукции STMicroelectronics включает в себя как электронные компоненты, так и средства разработки, готовые стеки протоколов и законченные примеры кода. Предлагаемые ресурсы позволяют разработчику легко построить каркас системы и быстро создать прототип своего приложения. На вебинаре мы также поговорим о беспроводных интерфейсах – ведь благодаря поддержке стандартов BLE и ZigBee вы сможете при необходимости интегрировать устройства сторонних производителей и создавать открытые системы.

Подробнее

3 hours ago, Nikolay_R said:

На момент поста использовал 47к с обеих сторон,

Не совсем понял с каких двух сторон... обычно I2C подтягивается к питанию. Один резистор между SCL и VDD, один между SDA и VDD. Выложите схему, если вы одну и ту же линию подтянули к разным питаниям у вас там некий средний уровень получится (если резюки равны). В общем без схемы сложно. по осциллограмме все как-то странно, уровни скачут

Share this post


Link to post
Share on other sites

TEA от TRACO – семейство 1 Вт DC/DC-преобразователей по доступной цене

Компания TRACO разработала новую серию оптимизированных по стоимости DC/DC-преобразователей TEA с фиксированным входом. Они изготавливаются в наиболее популярных корпусах типа SIP-4 (TEA 1) и SIP-7 (TEA 1E и TEA 1HI) на напряжение «вход-выход» 5-в-5 и изоляцию 1500 и 4000 В (только в корпусе SIP-7). Преобразователи TEA имеют расширенный рабочий температурный диапазон -40…85ºС и предназначены для широкого применения
Подробнее

Схема вышла следующая.  Когда я говорил про подтяжку со стороны EV3, то имел ввиду, что выходы SDA и SCL EV3 подтягиваются теперь не к 4.3в, а к 5в.

P.S. за основу взята стандартная схема преобразователя уровней.
 

unnamed.png

Share this post


Link to post
Share on other sites

Не видел таких схем преобразователей, эта конкретно точно не рабочая. ну окей, со стороны малинки передача пойдет, что и видно на осциллограмме. а когда EV3 начнет тянуть в 0 выход у вас транзистор закрыт будет. ток пойдет через паразитный диод, что и видно на осциллограмме, т.к. падение на этом диоде будет больше вольта (судя по даташиту на транзюк).
Вы ведь осциллограмму снимали со стороны малинки? там как раз такая картина будет при таком подключении.
Что-то не вижу на схеме EV3 что бы там уровни 5 В были, или у вас другой какой-то девайс. Вообще можно попробовать без преобразователей, т.к. в I2C  все девайсы с в режиме открытым коллектором подключаются. т.е. на передачу все нормально должно быть. А если на прием не хватит уровня, будете разбираться. Оставьте подтяжку только со стороны малинки, остальное выкиньте. Но лучше найти точную схему EV3 именно вашей модели и посмотреть как там I2C часть сделана. ту, что привел я взял отсюда

Edited by LeonidPr

Share this post


Link to post
Share on other sites

P.S. Прошу прощения за самоуверенность. поглядел схемы преобразователей именно для I2C.
Плюс статейку на easyelectronics.
Действительно используют такое включение. Как я понимаю тут такой нюанс важен. Когда 5 вольтовое устройство подтягивает в ноль свою сторону и напряжение на истоке падает, разность потенциалов между затвором и истоком должна стать больше, чем Vgs(th), т.е. напряжение, при котором транзистор откроется. Возможно в вашем случае как раз и получается, что он не может открыться и работает только внутренний диод.

Share this post


Link to post
Share on other sites

Огромное вам спасибо за все ответы! Благодаря вам, мне всё же удалось заставить работать эту штуку!
Задача выполнена. 
 

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
Sign in to follow this  

  • Сообщения

  • Similar Content

    • By Антон Палыч
      Мне нужно сделать структурную схему по вот такой электрической схеме для дипломного проекта. Это примочка дилея на основе ардуио нано. Сам я в электронике совсем не сведущ, выбрал такой проект только из-за программирования самой ардуины.

    • By admin
      В видео поговорим об энергоэффективности микроконтроллеров. Сравним потребление в режима сна arduino, blue pill с STM32F103 и представителя новой линейки энергоэффективных микроконтроллеров от st — STM32L552.
      Подробную информацию об линейке L5 можно найти тут: https://www.compel.ru/lib/143383
      Пи тест часть 1: https://youtu.be/ozu1IUjH1_Q
      Пи тест часть 2: https://youtu.be/uLOWYE-JJpA
    • By Dj_Grander Z Play
      У меня есть ESP32Cam которая берет кадры (240*176пкс. QQVGA) и пересылает их серверу по UDP. С этой частью проекта проблем нет всё работает всё ОК. Но хочу прикрутить получение данных по UDP от того же сервера причем с достаточно приличной частотой. Кто пробовал работать с такими модулями, не подскажете не будет и помехой работа с камерой, работе с сервером по UDP-протоколу. У меня есть сомнения по поводу того не будет ли эспешка в момент взятия кадра зацикливаеся на этом и в этот момент не сможет принять сообщения от сервера и управлять периферией. Подскажите пожалуйста кто может т.к. работаю с этими камнями впервые. Заранее спасибо.
    • By YetiSPb
      Здравствуйте. Мои знания в электронике малы, но мне необходимо подружить датчик давления и модуль тока и напряжения, если это возможно.
      Итак, есть датчик дифференциального давления NPH-8-172DH и модуль тока и напряжения CJMCU-219 для Arduino .
      Если я правильно понял то датчик отдаёт два сигнал нала в mV. Пины 5, 6 вход отдают данный по давлению на входе, пины 4, 10 по давлению на выходе.
      Возможно ли измерить сигнал датчика модулем CJMCU-219?  Какое должно на датчик подаваться напряжение и какой должен быть ток? Как правильно подключить датчик и модуль дуг у дугу правильно?
    • Guest kaisarali1997ss@gmail.com
      By Guest kaisarali1997ss@gmail.com
      Доброго времени суток.
      Не смог реализовать повторный Serial.available() внутри условия Serial.available.
      Может кто-то уже сталкивался с этим.
      Задача состоит в том, что нужно зажечь светодиодные ленты WS2812b. 
      Алгоритм действий:
      1)  Ожидаем появления данных на входе serial с помощью if (Serial.available()){}
      2) Принимаем значения int val=Serial.paresInt();
      3)Условие сравнивания if(val>123){chess=val;} esle if(val<124){color=val;} т.е номер светодиода это chess, цвет это color
      4) На смартфон отправляем 'n', для разрешения отправки следующих данных
      5)Ждем уже цвет светодиода на входе serial далее по предыдущему алгоритму 
      6)Зажигаем указанный светодиод на указанный цвет. 
      #include <FastLED.h> #define LED_PIN 6 #define NUM_LEDS 123 CRGB leds[NUM_LEDS]; const unsigned int DIM1 = 123; const unsigned int DIM2 = 1; const unsigned int DIM3 = 3; int ary[DIM1][DIM2][DIM3]; void setup() { Serial.begin(9600); FastLED.addLeds<WS2812, LED_PIN, GRB>(leds, NUM_LEDS); } void loop() { if(Serial.available()){ int val=Serial.parseInt(); int chess=val; Serial.println(chess); delay(1); Serial.println('n'); clear_serail(); if(Serial.available()){int color=Serial.parseInt(); Serial.println(color); if(color>0){ if(color==124){ ary[chess][1][1]=0; ary[chess][1][2]=255; ary[chess][1][3]=0; Serial.println(ary[chess][1][1]); Serial.println(ary[chess][1][2]); Serial.println(ary[chess][1][3]); leds[chess]=CRGB(ary[chess][1][1],ary[chess][1][2],ary[chess][1][3]); FastLED.show(); Serial.println('l'); clear_serail(); } if(color==125){ ary[chess][1][1]=255; ary[chess][1][2]=0; ary[chess][1][3]=0; leds[chess]=CRGB(ary[chess][1][1],ary[chess][1][2],ary[chess][1][3]); FastLED.show(); Serial.println('l'); clear_serail(); }}} } } void clear_serail(){ Serial.end(); Serial.begin(9600); }  
×
×
  • Create New...