Адресата на роб I2C не е потврдена (понекогаш)

Се обидувам да комуницирам со далечински поврзан FRAM (FM24C04 од Ramtron) преку I2C. Оваа меморија е вградена во картичка што може да се вметне и отстрани од системот во секое време (комуникацијата е правилно прекината пред да се отстрани меморијата).

Проблемот е: Веднаш по вметнувањето на картичката што содржи РАМКА, адресата понекогаш не е потврдено.

Мерења на сигналот

Ги измерив сигналите за да видам што се случило и се чини дека тајмингот е во ред и во двата случаи (работи и не работи).

Точна комуникација со I2C (прочитано 3 бајти):

понекогаш

I2C FRAM адресата не е потврдена (адресата на робот е испратена правилно):

Веќе преземени мерки за решавање на овој проблем (неуспешно)

  • Додадено доцнење по вметнување картичка со вграден FRAM за да се обезбеди следење на низата на напојување.
  • I2C престанува да генерира откако ќе ја признае адресата на робот што не е признаена

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

  • Еден господар (микроконтролер STM32F205 од ST)
  • Три робови (EEPROM 24AA1025 од микрочип, RTC DS1339C од Максим ИЦ и далечинскиот управувач FRAM FM24C04 од Рамтрон
  • Менувачот на ниво I2C (MAX3373E од Maxim IC) овозможува комуникација помеѓу главниот и FRAM
  • Фреквенцијата на автобусот е поставена на 100 kHz

УРЕДЕН (2013-04-17)

Како прво, ви благодарам многу за вашите коментари.

Бидејќи има многу предлози, еве го описот на истражувањето што го направив.

Шема

Следната слика покажува поедноставена шема на автобусот I2C:

I2C_SDA и I2C_SCL сигналите се поврзани директно со микроконтролерот, а сигналите FRAM_SDA и FRAM_SCL се поврзани со FRAM. Забележете дека сигналите SDA и SCL поврзани со FRAM се филтрираат со користење на ферити Murata BLM18.

РАМКОТ е поврзан на следниов начин:

  • NC (пин 1) -> не е поврзан
  • A1 (пин 2) -> GND
  • A2 (пин 3) -> GND
  • VSS (пин 4) -> GND
  • SDA (пин 5) -> FRAM_SDA
  • SCL (пин 6) -> FRAM_SCL
  • WP (пин 7) -> GND (не е заштитено од запишување)
  • VDD (пин 8) -> + 5V

Опис на картичката FRAM

Оваа картичка е картичка „слична на ISA“ во која е вграден само FRAM.

Истраги

Забавете ја фреквенцијата

Истрчав тестови со SCL фреквенција од 50kHz и 10kHz. Го измерив сигналот SCL со осцилоскоп за да се осигурам дека е на очекуваната фреквенција.

Овие измени не го решија проблемот. Јас ги проверив тајмингот и тие се во рамките на спецификациите на листот со податоци FRAM.

Обезбедување на тековната низа

  1. Менувачот на ниво I2C се става во режим на три состојби пред да се вметне картичката во која е вграден FRAM. Сигналите FRAM_SDA и FRAM_SCL се повлекуваат ниско.
  2. По вметнувањето на "FRAM картичката", се додава доцнење од 100 ms за да се обезбеди стабилизирање на напојувањето (потребно е најмалку 11 ms пред првиот услов за стартување според листот со податоци).
  3. Активиран е менувачот на ниво I2C.
  4. Се додава задоцнување од 1ms за да се осигура дека е овозможен менувачот за ниво I2C и линиите се извлекуваат високо (

4 е задолжително според листот со податоци). Се добиваат сигналите FRAM_SDA и FRAM_SCL.

  • Се пристапува до рамката.
  • Сигналите FRAM_SDA и FRAM_SCL беа измерени по секој чекор.

    Проблемот сè уште се јавува.

    Состојба за запирање/стартување наместо повторен почеток

    Се обидов да запрам пред да се рестартирам при пренесување на бајт. Јас го измерив трансферот на бајти со осцилоскоп: состојбата STOP проследена со условот START е во ред.

    За жал, ова решение не го решава проблемот.

    мисли

    Овој проблем се јавува само откако ќе се поврзе картичката вметната во FRAM. Извршив неколку илјади успешни пристапи за читање (адресирање и читање на робови) откако беше вметната и правилно адресирана „ФРАМ картичката“.

    Се повеќе ми звучи како хардверски проблем. Сепак, не знам дали ова може да биде поврзано со менувачот на ниво I2C или со другите робови во автобусот I2C.

    Дали имате други идеи или предлози?

    УРЕДЕН (2013-04-18)

    Проблемот се чини дека е решен

    Го разменив конекторот за модул FRAM и најдов начин да направам мерења директно на FRAM. Се чини дека сè работи добро со овој нов конектор.

    Doе направам повеќе тестирања за да се осигурам дека проблемот е резултат на лошо здружување.

    Иако тие велат дека вашите комуникации биле правилно исклучени пред да ги вметнете или отстраните, ова решение може да вреди да се испроба бидејќи автобусот I2C може да предизвика проблеми само на еден од уредите во автобусот по ресетирање.

    Пред да го иницијализирате главниот хардвер I2C, поставете СДА како влез и тестирајте дали СДА е ниска.

    Ако е ниско, поставете го SCL пинот високо.

    Потоа, вклучете го SCL-пинот ниско и високо додека SDA не отиде високо (т.е. исцртајте ги преостанатите битови што периферните уреди сè уште може да се обидат да ги испратат). Ова не може да трае повеќе од 8 часовни циклуси. Ако е така, тогаш има уште еден проблем.

    Не можам да гарантирам дека ова ќе го реши вашиот проблем, но тој го реши мојот!

    • Прво поврзете ги GND и Vcc.
    • Потоа, проверете дали A1, A2 и WP се на правилно ниво.
    • Само тогаш се поврзуваат пиновите за податоци.

    Поврзувањето иглички освен напојувањето пред да го вклучите чипот може да предизвика проблеми.

    10k се чини како малку голем за вашите бради, а вашите предни рабови изгледаат бавно. Намалете ги отпорите на околу 3k и проверете дали тоа ви помага.

    Зошто напонот на исклучување лебди со текот на времето?

    Дали има шанси нешто друго да се обиде да разговара со овој одбор? Имав таков проблем еднаш; Можев да добијам признание 60% од времето, но не се сеќавам дека некогаш сум видел судир. Се сомневам дека i2c што ми беше даден некако беше изолиран од вистинскиот внатрешен автобус. Можев да го извршувам непрекинато и ќе избрише само 30% од пораките. Проблемот исчезна во моментот кога зборувавме директно со уредот (напојување) без „задниот авион“ помеѓу нив.

    Нема да се прикаже низа запре по вашата грешка во NAK. Претпоставувам дека имате точка на прекин што ја запира програмата во тој момент?

    Ако мислите дека сте единствените во автобусот, можете исто така да се обидете да го замените повторениот почеток со стоп/почеток. Сум видел уреди (особено обични FPGA) кои не знаеле точно како да се справат со РС.

    [Одговори на коментар]: Има многу што не рековте за ФРАМ-картичката, како на пример дали е само меморија или цел потсистем. Но, ако можете да го ставите обемот на пушката директно на каблите на i2c уредот што ви прави проблеми и сеуште можете да видите што е на сликата, јас би исклучил мешање. I2C е толку едноставен што освен ако немате внатрешен проблем, чипот треба да се репродуцира правилно ако ги видите точните сигнали на влезот.

    Особено, сакате да стигнете до страницата FRAM на овој менувач на ниво. Прекин во сигналот е поверојатно од нешто што вообичаено се гледа како судир.

    Pointе истакнам дека НАК-циклусот не се разликува од чипот што едноставно го нема. EEPROM го прават ова за да покажат дека се зафатени. Побарав време за пишување на FRAM и е побрзо од еден бит податоци i2c. па тоа не е проблем.

    Бидејќи проблемот со репродукцијата е постојан бубачки што може да се реши само со отстранување и повторно вметнување на уредот, тоа е една од двете работи: уредот е во лоша состојба од која се опоравува само кога е исклучен и вклучен . или има слаб контакт.

    Ако уредот оди во лоша состојба од која се опоравува кога е исклучен и вклучен, тогаш може да имате дополнителни кола што MCU може да ги користи за да го исклучи уредот. Фирмверот, откако не доби потврда од уредот, потоа може да изврши процес на враќање во кој го затвора чипот некое време, го напојува повторно и потоа се обидува повторно.

    Ако контактот е лош, можеби ќе треба да ја проверите веродостојноста на конекторот и да пронајдете нешто подобро. Користењето на истиот приклучок за да направите повеќе од овие картички може да предизвика проблеми во полето. Во двата случаи, може да има човечки процес за справување со ситуацијата. Операторот што работи со уредот мора да биде свесен за потенцијалниот проблем со вметнување на картичката и можеби ќе треба повторно да се инсталира за да функционира правилно.

    Вашата главна единица може да вклучи аларм што укажува на тоа дека не може да зборува со FRAM: ЛЕР „грешка“ на контролната табла и/или сигнал или што и да е. Или обратно: Светло што се пали и му дава на корисникот повратна информација дека РАМОТ е прифатен и комуникацијата е воспоставена. Ако FRAM е далеку од главниот уред, светлото може да биде на модулот FRAM: друг I2C чип што вози LED.

    Спорадичната природа на проблемот сугерира дека тоа може да биде проблем со тајмингот.

    Листот со податоци содржи две временски серии, една за „стандарден режим“ и друга за „брз режим“. Од вашите мерења може да се види дека сте на работ на тајмингот за „стандарден режим“. Не можам да кажам од листот со податоци како точно е ставен чипот во еден од двата режима.

    Не би претпоставил дека вашиот уред е во брз режим. Ако можете да ги намалите тајмингот со фактор 2-4, проверете дали сте во рамките на стандардните временски рамки за времето на задржување на состојбата, високиот период на часовникот и нискиот период на часовникот и проверете дали овој проблем продолжува?

    Дали имате 24c04a, b или c? Ако е c04a, тоа беше груб дизајн. Дел б е чувствителен на рампи за напојување. Кое раздвојување имате на Pin8? Сакав да кажам нешто за нивоата на сигналот, но гледам дека користите преведувач на ниво. Можеби ќе сакате да проверите дали немате грешка со SCL што чипот ќе го протолкува како дополнителен часовник.