Адрес ведомого I2C не подтвержден (иногда)

11

Я пытаюсь связаться с удаленно подключенной FRAM (FM24C04 от Ramtron) с помощью I2C. Эта память встроена в плату, которая может быть вставлена ​​и удалена в любое время в / из системы (связь должным образом прекращается до удаления памяти).

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

Измерение сигналов

Я измерил сигналы, чтобы увидеть, что происходит, и кажется, что синхронизация в обоих случаях в порядке (работает и не работает).

Корректная связь I2C (чтение 3 байтов): введите описание изображения здесь

Адрес FRAM I2C не подтвержден (адрес подчиненного устройства отправляется правильно): введите описание изображения здесь

Действия, уже выполненные для решения этой проблемы (без успеха)

  • Задержка добавляется после вставки карты со встроенной FRAM, чтобы обеспечить соблюдение последовательности питания.
  • I2C остановка генерации после обнаружения адреса подчиненного устройства, а не подтверждения

Конфигурация шины I2C

  • Один мастер (микроконтроллер STM32F205 от ST)
  • Три ведомых (EEPROM 24AA1025 от Microchip, RTC DS1339C от Maxim IC и удаленный FRAM FM24C04 от Ramtron
  • Один переключатель уровня I2C (MAX3373E от Maxim IC) используется для обеспечения связи между ведущим и FRAM
  • Частота шины установлена ​​на 100 кГц

РЕДАКТИРОВАНИЕ (2013-04-17)

Во-первых, спасибо всем за ваши комментарии.

Поскольку предложений много, вот описание расследований, которые я провел.

Schematics

На следующем рисунке показана упрощенная схема шины I2C:

Схема шины I2C

Сигналы I2C_SDA и I2C_SCL напрямую подключаются к микроконтроллеру, а сигналы FRAM_SDA и FRAM_SCL подключаются к FRAM. Обратите внимание, что сигналы SDA и SCL, подключенные к FRAM, фильтруются с использованием ферритов BLM18 от Murata.

FRAM подключен следующим образом:

  • NC (контакт 1) -> не подключен
  • A1 (контакт 2) -> GND
  • A2 (контакт 3) -> GND
  • VSS (контакт 4) -> GND
  • SDA (вывод 5) -> FRAM_SDA
  • SCL (контакт 6) -> FRAM_SCL
  • WP (контакт 7) -> GND (не защищен от записи)
  • VDD (контакт 8) -> + 5 В

Описание карты FRAM

Эта карта является "ISA-подобной" картой, которая включает только FRAM.

исследования

Замедление частоты

Я запускал тесты с частотой SCL, установленной на 50 кГц и 10 кГц. Я измерил сигнал SCL с помощью осциллографа, чтобы убедиться, что он был на ожидаемой частоте.

Эти модификации не решили проблему. Я проверил сроки, и они находятся в пределах технических характеристик FRAM.

Обеспечение силовой последовательности

@jippie.

  1. Сдвиг уровня I2C переводится в режим трех состояний до того, как вставляется карта, которая встраивает FRAM. Сигналы FRAM_SDA и FRAM_SCL находятся на низком уровне.
  2. После того, как вставлена ​​«карта FRAM», добавляется задержка в 100 мс, чтобы обеспечить стабилизацию источника питания (по крайней мере, 11 мс требуется до первого условия запуска в соответствии с таблицей данных).
  3. Сдвиг уровня I2C активирован.
  4. Задержка в 1 мс добавляется для того, чтобы убедиться, что переключатель уровня I2C активирован, и что линии вытянуты (~ 4us требуется согласно спецификации). Сигналы FRAM_SDA и FRAM_SCL повышаются.
  5. FRAM доступен.

Сигналы FRAM_SDA и FRAM_SCL были измерены после каждого шага.

Проблема все еще возникает.

Условие остановки / запуска вместо повторного запуска

@gbarry.

Я пытался поставить остановку перед повторным запуском во время передачи байтов. Я измерил передачу байтов с помощью осциллографа: состояние STOP и условие START в порядке.

К сожалению, это решение не решает проблему.

мысли

Эта проблема возникает только сразу после подключения карты, встраивающей FRAM. Я выполнил несколько тысяч успешных обращений к чтению (адресация и чтение подчиненного устройства) после того, как карта FRAM вставлена ​​и правильно адресована.

Для меня это все больше и больше похоже на аппаратную проблему. Но я не знаю, может ли это быть связано со сдвигом уровня I2C или с другими ведомыми устройствами на шине I2C.

У вас есть другие идеи или предложения?


РЕДАКТИРОВАНИЕ (2013-04-18)

Кажется, проблема решена

Я заменил разъем модуля FRAM и нашел способ проводить измерения непосредственно на FRAM. Кажется, что все работает хорошо с этим новым разъемом.

Я сделаю больше тестов, чтобы убедиться, что проблема возникла из-за плохой связи.

johsey
источник
Можете ли вы опубликовать схему? Попробуйте более медленную частоту шины, чтобы увидеть, если это имеет значение.
Suirnder
Проблема возникла только после вставки, а не в другое время? Как скоро "только после"?
Каз
В дополнение к другим экспериментам, вы можете попробовать удалить других рабов и посмотреть, влияет ли это на поведение.
Бен Гартнер
Правильно ли установлены два адресных контакта на низком уровне или они оставлены плавающими?
fm_andreas
@Suirnder Я разместил схему в своем ответе.
Johsey

Ответы:

6

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

Перед инициализацией аппаратного обеспечения Master I2C установите SDA в качестве входа и проверьте уровень SDA на низком уровне.

Если оно низкое, установите высокий уровень сигнала SCL.

Затем переключите вывод SCL на низкий и высокий уровень, пока SDA не станет высоким (т. Е. Отключите все оставшиеся биты, которые периферийные устройства все еще могут пытаться отправить). Это не может занять более 8 тактов - если это так, то возникает другая проблема.

Я не могу гарантировать, что это решит вашу проблему, но это решило мою!

Buzby
источник
Неплохая идея добавить этот «алгоритм восстановления шины» перед инициализацией мастера. Я реализую это. Спасибо.
Johsey
2

Для FRAM:

  • сначала подключите GND и Vcc;
  • затем убедитесь, что A1, A2 и WP имеют правильный уровень;
  • только тогда подключите контакты данных.

Подсоединение контактов, отличных от источника питания, до включения питания чипа может вызвать проблемы.

jippie
источник
2

10k кажется немного большим для ваших подтягиваний, и ваши передние края выглядят медленными. Уменьшите резисторы примерно до 3 кОм и посмотрите, поможет ли это.

Кроме того, почему напряжение смещения дрейфует со временем?

Скотт Сейдман
источник
Я уменьшил подтягивающие резисторы до 3,3 кОм, и это не помогает. Понятия не имею об этом дрифте.
Johsey
На экране он выглядит маленьким, но, думаю, его около 250 мВ. У вас может быть проблема с питанием на стороне 3,3 В
Скотт Сейдман
Вы правы, дрейф составляет около 300 мВ по обе стороны от преобразователя уровня I2C. Источник питания + 3,3 В, кажется, работает нормально (нет дрейфа на его выходе, когда происходит дрейф сигнала SCL). Может ли это быть связано со смещением уровня I2C?
Johsey
Не уверен вообще. Откуда 3,3 В? Переключающий преобразователь? В любом случае это подозрительно. Вы потребляете МИНИМАЛЬНЫЙ ток, требуемый устройством, обеспечивающим 3,3 В для таблицы? Если нет, зарядите ваш источник питания резистором. Что произойдет, если вы подождете секунду или две, прежде чем начать общение?
Скотт Сейдман
3,3 В исходит от SMPS (LM3103MH от TI). Я не специалист по источникам питания, но, как я понял, у этого устройства нет минимального необходимого тока, поскольку он может работать в режиме прерывистой проводимости при небольшой нагрузке. Та же проблема возникает, если я подожду две секунды, прежде чем начать связь.
Johsey
2

Есть ли шанс, что кто-то еще пытается поговорить с этой доской? Однажды у меня была такая проблема; Я мог получить около 60% времени, но я не помню, чтобы когда-либо видел столкновение. Я подозреваю, что i2c, который мне предоставили, был каким-то образом изолирован от реальной внутренней шины. Я мог бы запустить его непрерывно, и он просто отбросил бы 30% сообщений. Проблема исчезла в тот момент, когда мы начали говорить напрямую с устройством (источником питания) без промежуточной «объединительной платы».

Я не вижу последовательности остановки после вашей ошибки NAK. Я предполагаю, что у вас есть точка останова, которая останавливает программу в этот момент?

Наконец, если вы думаете, что вы единственный в автобусе, вы можете также попробовать заменить повторный запуск на остановку / запуск. Я видел устройства (особенно пользовательские ПЛИС), которые не совсем знали, как обращаться с RS.

[В ответ на комментарий]: Вы многое не сказали о плате FRAM, например, память это или целая подсистема. Но если вы можете поставить «прицел» прямо на выводы устройства i2c, которое доставляет вам неприятности, и вы по-прежнему видите то, что изображено, я бы исключил помехи. I2C достаточно прост, так что если вы видите правильные сигналы на входе, то чип должен играть правильно, если у него нет внутренней проблемы.

В частности, вы хотите получить на стороне FRAM этого сдвига уровня. Перерыв в сигнале более вероятен, чем то, что обычно считается столкновением.

Я укажу, что цикл NAK неотличим от чипа, которого просто нет. ЭСППЗУ сделают это, чтобы указать, что они заняты. Я посмотрел время записи на FRAM, и оно быстрее, чем один бит данных i2c ... так что это не проблема.

gbarry
источник
На шине I2C есть только один мастер, и плата, в которую встроен FRAM, подключена только к этой шине. Таким образом, я думаю, что нет никаких шансов, что что-то еще пытается с ним поговорить. Да, я ставлю точку останова перед последовательностью останова. Я постараюсь заменить этот повторный запуск на остановку / запуск, как вы предлагаете, и протестирую его снова. Согласно данным, FRAM должен поддерживать повторный запуск. Как вы думаете, если я изолирую FRAM (например, на выделенной шине I2C), это может в конечном итоге решить эту проблему?
Johsey
Плата FRAM встраивает только FRAM. Это доска, подобная ISA. Трудно измерить сигналы непосредственно на выводах FRAM, поскольку эта карта встроена в пластиковый элемент. В любом случае, я постараюсь найти способ измерить эти сигналы как можно ближе к FRAM.
Джози
Переход на FRAM сторону U13 был бы большим шагом.
gbarry
2

Поскольку проблема при воспроизведении - это постоянный сбой, который устраняется только путем удаления и повторной вставки устройства, то это одна из двух вещей: устройство переходит в плохое состояние, из которого оно восстанавливается только в цикле питания, или плохой контакт.

Если устройство переходит в плохое состояние, из которого оно восстанавливается во время цикла питания, у вас может быть дополнительная схема, которая позволяет вашему MCU выключать устройство. После этого прошивка, не получив подтверждения от устройства, может выполнить процедуру восстановления, в результате чего она на некоторое время выключает микросхему, снова включает ее и затем повторяет попытку.

Если это плохой контакт, то, возможно, вам придется посмотреть на надежность разъема и найти что-то лучшее. Если вы используете один и тот же разъем для изготовления этих плат, могут возникнуть проблемы в полевых условиях. В любом случае, может быть человеческая процедура для обработки ситуации. Оператор, работающий с устройством, должен знать о потенциальной проблеме со вставкой карты и о том, что для правильной работы его, возможно, придется пересаживать.

Ваше основное устройство может иметь способ поднять тревогу, указывающую, что оно не может общаться с FRAM: светодиод «проблемы» на панели и / или звуковой сигнал или что-то еще. Или наоборот: какой-то свет, который дает пользователю обратную связь о том, что FRAM принят и установлена ​​связь. Если FRAM находится далеко от ведущего устройства, индикатор может быть расположен на модуле FRAM: другом чипе I2C, который управляет светодиодом.

Kaz
источник
0

Спорадический характер проблемы предполагает, что это может быть проблемой времени.

таблице приведены два набора временных параметров: один для «Стандартного режима» и один для «Быстрого режима». Из ваших измерений кажется, что вы находитесь на границе времени «Стандартного режима». По просмотру таблицы я не могу понять, как именно чип будет переведен в один из режимов.

Я не предполагаю, что ваше устройство находится в быстром режиме. Можете ли вы уменьшить время в 2-4 раза, убедитесь, что вы находитесь в пределах времени стандартного режима для времени удержания условия запуска, высокого тактового периода и низкого тактового периода, и посмотрите, возникает ли эта проблема?

Бен Гартнер
источник
Мое устройство находится в «Стандартном режиме» (частота SCL 100 кГц). Действительно, эта частота находится на границе этого режима. Я постараюсь уменьшить его в два раза и проведу несколько тестов.
Johsey
0

У тебя есть 24c04a, b или c? Если это c04a, это был надежный дизайн. Часть b имеет чувствительность к пандусам питания. Какую развязку ты делаешь на pin8 до gnd? Я собирался что-то сказать об уровнях сигнала, но я вижу, что вы используете переводчик уровня. Возможно, вы захотите проверить, что у вас не возникнет сбоя в SCL, который чип будет интерпретировать как дополнительные часы.

GMan
источник
3
Вы набрали это на старом мобильном телефоне с интерфейсом из девяти кнопок?
angelatlarge
Используемая FRAM - FM24C04B . Откуда вы взяли эту информацию относительно энергетической чувствительности этой памяти? Можете ли вы дать мне больше информации? На выводе 8 нет разделения. Конструкция этого модуля была сделана несколько лет назад, и мы должны потреблять всю продукцию. Согласно измерениям, выполненным с помощью осциллографа, кажется, что на линии SCL нет сбоев, когда подключен модуль FRAM и активирован переключатель уровня.
Johsey
1
Я понимаю, что этот ответ очень поздно, но моя информация относительно чувствительности Vcc основана на том, что много лет назад я поддерживал Ramtron в приложениях. Я не помню точных деталей, но при определенных скоростях и температурах линейного изменения микросхема по существу блокируется и не разрешает связь I2C, пока вы не включите «хороший» темп. Не иметь развязывающего колпачка рядом с чипом - это не хорошо. Вы можете обнаружить, что при использовании развязки 0,1 мкФ против 10 мкФ изменяется рампа Vcc, где один работает, а другой нет. @angelatlarge, да, извините, я набрал свой первый ответ с телефона.
мужчина