Я намагаюся спілкуватися з віддалено підключеною FRAM (FM24C04 від Ramtron) за допомогою I2C. Ця пам'ять вбудована у плату, яку можна вставити та вилучити в будь-який час до системи / з неї (зв’язок належним чином припиняється до вилучення пам'яті).
Проблема полягає в тому, що після вставки карти, яка містить FRAM, іноді вона не підтверджує адресу.
Вимірювання сигналів
Я виміряв сигнали, щоб побачити, що відбувається, і здається, що в обох випадках час працює нормально (працює і не працює).
Правильна комунікація I2C (читання в 3 байти):
Адреса FR2 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)
По-перше, дякую всім за ваші коментарі.
Оскільки є багато пропозицій, ось опис розслідувань, які я робив.
Схематика
На наступному малюнку представлена спрощена схема шини I2C:
Сигнали I2C_SDA і I2C_SCL безпосередньо з'єднані з мікроконтролером, а сигнали FRAM_SDA і FRAM_SCL підключені до FRAM. Зауважте, що сигнали SDA та SCL, підключені до FRAM, фільтруються за допомогою феритів BLM18 з Мурата.
FRAM підключений наступним чином:
- NC (контакт 1) -> не підключено
- A1 (контакт 2) -> GND
- A2 (контакт 3) -> GND
- VSS (контакт 4) -> GND
- ПДД (контакт 5) -> FRAM_SDA
- SCL (контакт 6) -> FRAM_SCL
- WP (контакт 7) -> GND (не захищено від запису)
- VDD (контакт 8) -> + 5V
Опис картки FRAM
Ця карта - це карта "схожа на ISA", в яку вбудовується лише ОЗУ.
Розслідування
Уповільнення частоти
Я проводив тести з частотою 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. Здається, що все добре працює з цим новим роз'ємом.
Я зроблю більше тестів для того, щоб переконатися, що проблема виникла з-за поганого зв’язку.