Я пытаюсь связаться с удаленно подключенной 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_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.
- Сдвиг уровня I2C переводится в режим трех состояний до того, как вставляется карта, которая встраивает FRAM. Сигналы FRAM_SDA и FRAM_SCL находятся на низком уровне.
- После того, как вставлена «карта FRAM», добавляется задержка в 100 мс, чтобы обеспечить стабилизацию источника питания (по крайней мере, 11 мс требуется до первого условия запуска в соответствии с таблицей данных).
- Сдвиг уровня I2C активирован.
- Задержка в 1 мс добавляется для того, чтобы убедиться, что переключатель уровня I2C активирован, и что линии вытянуты (~ 4us требуется согласно спецификации). Сигналы FRAM_SDA и FRAM_SCL повышаются.
- FRAM доступен.
Сигналы FRAM_SDA и FRAM_SCL были измерены после каждого шага.
Проблема все еще возникает.
Условие остановки / запуска вместо повторного запуска
@gbarry.
Я пытался поставить остановку перед повторным запуском во время передачи байтов. Я измерил передачу байтов с помощью осциллографа: состояние STOP и условие START в порядке.
К сожалению, это решение не решает проблему.
мысли
Эта проблема возникает только сразу после подключения карты, встраивающей FRAM. Я выполнил несколько тысяч успешных обращений к чтению (адресация и чтение подчиненного устройства) после того, как карта FRAM вставлена и правильно адресована.
Для меня это все больше и больше похоже на аппаратную проблему. Но я не знаю, может ли это быть связано со сдвигом уровня I2C или с другими ведомыми устройствами на шине I2C.
У вас есть другие идеи или предложения?
РЕДАКТИРОВАНИЕ (2013-04-18)
Кажется, проблема решена
Я заменил разъем модуля FRAM и нашел способ проводить измерения непосредственно на FRAM. Кажется, что все работает хорошо с этим новым разъемом.
Я сделаю больше тестов, чтобы убедиться, что проблема возникла из-за плохой связи.