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

Я намагаюся спілкуватися з віддалено підключеним FRAM (FM24C04 від Ramtron) через I2C. Ця пам’ять вбудована в карту, яку можна будь-коли вставити та вийняти з системи (зв’язок належним чином припиняється перед видаленням пам’яті).

Проблема полягає в тому, що одразу після вставки картки, що містить FRAM, вказана адреса іноді не підтверджено.

Вимірювання сигналу

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

Правильний зв’язок I2C (прочитано 3 байти):

веденого

Адреса I2C FRAM не підтверджена (підлегла адреса надіслана правильно):

Заходи, вже вжиті для вирішення цієї проблеми (невдалі)

  • Додана затримка після вставлення картки із вбудованим FRAM для забезпечення послідовності живлення.
  • I2C припиняє генерування після розпізнавання невідомої адреси веденого пристрою

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

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

ВИДАЛЕНО (17.04.2013)

Перш за все, велике спасибі за ваші коментарі.

Оскільки пропозицій багато, ось опис проведеного мною дослідження.

Схема

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

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

FRAM підключений наступним чином:

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

Опис карти FRAM

Ця картка є "ISA-подібною" карткою, в яку вбудовано лише FRAM.

Розслідування

Уповільнюйте частоту

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

Ці зміни не вирішили проблему. Я перевірив терміни, і вони відповідають специфікаціям таблиці FRAM.

Забезпечення поточної послідовності

  1. Перемикач рівня I2C переводиться в режим три стану перед тим, як вставити карту, в яку вбудовано FRAM. Сигнали FRAM_SDA та FRAM_SCL занижені.
  2. Після вставки "карти FRAM" додається затримка 100 мс, щоб забезпечити стабілізацію джерела живлення (потрібно принаймні 11 мс до першого стану запуску згідно з технічним паспортом).
  3. Активовано перемикач рівня I2C.
  4. Додається затримка 1 мс, щоб переконатись, що перемикач рівня I2C увімкнено, а лінії високі

4us потрібно згідно з технічним паспортом). Отримані сигнали FRAM_SDA та FRAM_SCL.

  • Відбувається доступ до FRAM.
  • Сигнали FRAM_SDA та FRAM_SCL вимірювали після кожного кроку.

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

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

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

    На жаль, це рішення не вирішує проблему.

    думки

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

    Для мене це все більше нагадує апаратну проблему. Однак я не знаю, чи може це бути пов'язано з перемикачем рівня I2C або іншими рабами на шині I2C.

    Чи є у вас інші ідеї чи пропозиції?

    ВИДАЛЕНО (18.04.2013)

    Здається, проблема вирішена

    Я поміняв роз'єм модуля FRAM і знайшов спосіб вимірювати безпосередньо на FRAM. Здається, з цим новим роз’ємом все працює нормально.

    Я проведу ще тестування, щоб переконатися, що проблема пов’язана з поганою асоціацією.

    Хоча вони кажуть, що ваші комунікації були належним чином вимкнені перед тим, як вставляти чи видаляти, це рішення, можливо, варто спробувати, оскільки шина I2C може викликати проблеми лише на одному з пристроїв у шині після скидання.

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

    Якщо він низький, встановіть штифт SCL високо.

    Потім перемикайте штифт SCL низьким і високим, доки SDA не переходить у високий рівень (тобто видаляйте всі біти, які периферія все ще намагається надіслати). Це не може тривати довше 8 тактових циклів. Якщо так, то є інша проблема.

    Я не можу гарантувати, що це вирішить вашу проблему, але вирішило мою!

    • Спочатку підключіть GND і Vcc.
    • Тоді переконайтесь, що A1, A2 і WP на правильному рівні.
    • Тільки тоді шпильки даних підключаються.

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

    10 тис. Здається трохи великим для підборіддя, а передні краї виглядають повільно. Зменшіть опір приблизно до 3k і перевірте, чи це допомагає.

    Чому напруга відключення зміщується з часом?

    Чи є якийсь шанс, що щось інше намагається поговорити з цією дошкою? У мене колись була така проблема; Я міг отримати підтвердження 60% випадків, але не пам’ятаю, щоб коли-небудь бачив зіткнення. Я підозрюю, що наданий мені i2c був якимось чином ізольований від реальної внутрішньої шини. Я міг запускати його безперервно, і це видаляло лише 30% повідомлень. Проблема зникла в той момент, коли ми поговорили безпосередньо з пристроєм (джерелом живлення) без "задньої плати" між ними.

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

    Якщо ви думаєте, що ви єдиний в автобусі, ви також можете спробувати замінити повторний старт зупинкою/стартом. Я бачив пристрої (особливо власні ПЛІС), які не знали точно, як обробляти RS.

    [Відповісти на коментар]: Багато чого ви не сказали про карту FRAM, наприклад, це просто пам’ять чи ціла підсистема. Але якщо ви можете встановити оптичний приціл безпосередньо на дроти пристрою i2c, що створює проблеми, і ви все ще можете побачити, що зображено на малюнку, я б виключив втручання. I2C настільки простий, що якщо у вас немає внутрішніх проблем, чіп повинен грати належним чином, якщо ви бачите правильні сигнали на вході.

    Зокрема, ви хочете потрапити на сторінку FRAM цього перемикача рівнів. Переривання сигналу вірогідніше, ніж те, що зазвичай розглядається як зіткнення.

    Я зазначу, що цикл NAK нічим не відрізняється від чіпа, якого просто немає. EEPROM роблять це, щоб вказати, що вони зайняті. Я знайшов час запису на FRAM, і це швидше, ніж одиничний біт даних i2c. так що це не проблема.

    Оскільки проблема відтворення - це постійна помилка, яку можна виправити лише видаленням та повторною установкою пристрою, це одна з двох речей: пристрій перебуває у поганому стані, після чого відновлюється лише при вимкненому та ввімкненому . або є поганий контакт.

    Якщо пристрій переходить у поганий стан, коли він відновлюється після вимкнення та ввімкнення, тоді у вас може бути додаткова схема, яку ваш MCU може використовувати для вимкнення пристрою. Після того, як мікропрограма не отримала підтвердження від пристрою, вона може виконати процес відновлення, в якому вона на деякий час вимикає мікросхему, знову вмикає її, а потім намагається знову.

    Якщо контакт поганий, можливо, вам доведеться перевірити надійність роз'єму і знайти щось краще. Використання одного і того ж роз’єму для виготовлення більшої кількості цих карток може спричинити проблеми на місцях. У будь-якому випадку може існувати людський процес, щоб вирішити ситуацію. Оператор, що працює з пристроєм, повинен знати про потенційну проблему із вставкою картки, і, можливо, для належної роботи може знадобитися його перевстановити.

    Ваш основний пристрій може спрацьовувати сигнал тривоги, що вказує на те, що він не може розмовляти з FRAM: світлодіод "помилка" на панелі управління та/або звуковий сигнал чи інше. Або навпаки: індикатор, який загоряється та надає користувачеві зворотній зв'язок, що FRAM прийнято та встановлено зв'язок. Якщо FRAM знаходиться далеко від головного пристрою, світло може бути на модулі FRAM: інший чіп I2C, який керує світлодіодом.

    Епізодичний характер проблеми говорить про те, що це може бути проблемою часу.

    Технічний паспорт містить два часові ряди, один для "стандартного режиму" та один для "швидкого режиму". З ваших вимірювань видно, що ви перебуваєте на межі часу "стандартного режиму". З паспорта я не можу сказати, як саме мікросхема вводиться в один із двох режимів.

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

    У вас є 24c04a, b або c? Якщо це c04a, то це був міцний дизайн. Частина b чутлива до пандусів електроживлення. Яке роз’єднання у вас на Pin8? Я хотів сказати щось про рівні сигналу, але я бачу, що ви використовуєте перекладач рівнів. Можливо, ви захочете перевірити, чи не виникає у вас помилка з SCL, яку чіп сприймає як додатковий годинник.