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

Вебинар «Решения Analog Devices для гальванической изоляции. Обзор технологий и новинок» (27.04.2021)

Компания «Компэл» и Analog Devices приглашают всех желающих 27/04/2021 принять участие в вебинаре, посвященном решениям Analog Devices для гальванической изоляции. В программе вебинара: технологии гальванической изоляции iCoupler, цифровые изоляторы, изолированное питание и технология isoPower, гальванически изолированные интерфейсы (RS-485, CAN, USB, I2C, LVDS) и другое.

Подробнее

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

Пружинные клеммники Degson - высокое качество соединения по оптимальной цене!

Пружинные клеммные блоки Degson для монтажа на печатную плату – это простое и надежное соединение, которое позволяет легко решать задачи для различных приложений за счет обширного ассортимента. Клеммники Degson доступны в двух конструктивных исполнениях (торцевой контакт и зажимная клеть), имеют различные направления ввода проводника (45°, 90°, 180°) и обладают широким диапазоном поперечных сечений (0,2…2,5 мм2).

Подробнее

3 hours ago, Nikolay_R said:

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

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

Share this post


Link to post
Share on other sites

Новое семейство ИП от MEAN WELL мощностью 150, 300, 600 Вт с повышенной перегрузочной способностью

Компания MEAN WELL разработала семейство источников питания номинальной мощностью 150, 300 и 600 Вт с возможностью кратковременной безопасной работы при мощности в 2,5 раза выше номинальной (до 5 секунд). Данное семейство источников питания востребовано в промышленных установках с использованием электродвигателей или с емкостной нагрузкой. Применяя новые источники питания HRP/N можно получить экономический выигрыш.

Подробнее

Схема вышла следующая.  Когда я говорил про подтяжку со стороны 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 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); }  
    • By Любовь Бертулите
      Компания производитель вендинговых автоматов для розлива питьевой воды в поисках инженера-системотехника/инженера электронщика.
      График 5/2 с 9 до 18, здесь удаленный формат не рассматриваем.
      Место работы – г. Екатеринбург.
      Мы ищем специалиста, который будет делать прототипы нового для контроллера, курировать производство, проверять, дорабатывать, перепаивать, а также:
      Переписывать текущие программы на С++; Создавать программу для Android для конфигурации параметров контроллера через bluetooth. (т.е. предлагать новые, современные идеи и подходы для развития имеющихся контроллеров, которыми вы владеете); Предлагать новые программные продукты, среды разработки. Будет в тренде мира микроэлектроники, китайского контрактного производства. Может предложить совершенно новую реализацию наших текущих задач, чтобы это было лучше и эффективнее. В идеале, нам нужен специалист, который имеет:
      Опыт программирования микроконтроллеров Atmega, STM32, ESP32; Опыт работы в Altium Designer; Опыт работы в c++ (IAR, QT); Опыт работы с modbus, rs485/232, SPI. Готовы рассматривать специалистов с разным опытом, поэтому пишите, задавайте вопросы.
      Резюме можно отправить на почту lb@ktekt.ru (да, мы кадровое агентство), позвонить можно по следующему тел. 89068001212 - Любовь. 
       
×
×
  • Create New...