I2C работает только при испытании или нагрузке 1 МОм

9

Я пытаюсь устранить неполадки связи между msp430fr5847 (ведущим) и подчиненным датчиком с неизвестной микросхемой I2C (часть промышленного датчика)

У меня возникают проблемы с новой партией датчиков, когда мои данные возвращаются со всеми нулями, однако при попытке устранения неполадок с моим Saleae logic pro (2 МОм, 10 пф) или моим осциллографом (10 МОм, 50 пф) система работает отлично при зондировании вывод SDA.

Дальнейшее устранение неисправностей схема работает правильно, если я добавляю резистор 1 МОм между SDA и землей, но не работает, если только добавить конденсатор на 10 или 100 пф.

Я использую 4.7k подтягивающие резисторы к моей 3.3v рейке.

Что может быть причиной этой проблемы, и что можно сделать, чтобы устранить неполадки без непреднамеренного решения проблемы.


РЕДАКТИРОВАТЬ: 19/07/2017 Вот краткий след моих сигналов.

Что-то еще, что я забыл упомянуть, это то, что только проверка SDA приводит к тому, что плата работает, проверка SCL или моя линия прерывания не заставляют ее работать должным образом.

Область трассировки SDA и SCL


РЕДАКТИРОВАТЬ: 21/07/2017

График сгущается, кажется, что при подключении другого осциллографа схема не работает правильно, и видно, что единственное отличие состоит в том, что ACK не передается.

Новая сфера изображения

На рисунке выше синие и зеленые трассы - это SCL и SDA, когда схема работает неправильно. Желтые и розовые следы происходят от того, когда я также подключаю свою логику Saleae к выводу SDA и заземлению, но без подключения USB (пытаясь избежать контуров заземления).

Чтобы добавить немного фона к датчику, это промышленный датчик давления, который мы покупаем у производителя. Ранее мы разработали и протестировали эти печатные платы с нашей первой партией датчиков. Недавно мы получили новую партию и сейчас сталкиваемся с этими проблемами. Я провел небольшое расследование и сильно подозреваю (после поиска уникальных предложений из таблицы данных), что для внутреннего использования датчик использует ZSC31014 или аналогичный документ PDF в формате ЗДЕСЬ


РЕДАКТИРОВАТЬ: 26/07/2017

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

Это работало в основном с данными, поступающими, как и ожидалось, однако теперь кажется, что в первой команде чтения после записи (если это правильный термин для группы битов i2c), ведомое устройство пытается ACK на один бит раньше (в положение бита записи). Я могу сказать, что это ведомый, тянущий линию вниз путем добавления небольшого (47 Ом) последовательно с линией SDA.

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

Сюжет вопроса без объема прилагается

Участок без границ

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

С прикрепленной областью

Hugoagogo
источник
1
Есть ли у вас какие-либо следы прицела
Кевин Уайт
1
Вы случайно перевернули свой тактовый сигнал?
Энди ака
6
Убедитесь, что шина I2C имеет и использует общий провод заземления (MSP к датчику I2C). Требуется 3 провода: SDA, SCL и GND, с SDA и SCL, поднятыми до Vcc (возможно, 4-й провод) через подтягивающие резисторы.
Крис Кнудсен
1
@Hugoagogo - Yikes! Оба SDA и SCL ненормальные, по-разному. Я предполагаю, что трассировка с новыми неисправными датчиками? Если да, можете ли вы поставить след со старыми работающими датчиками? Возможно, разница может быть не такой большой, то есть у вас были проблемы раньше, но она просто работала. Дополнительная справочная информация может раскрыть полезные данные, например. Откуда вы знаете, что это «новые» микросхемы I2C, учитывая, что чип «неизвестен»? Я предполагаю, что был сделан некоторый реверс-инжиниринг, чтобы позволить MSP430 (который вы контролируете?) Использовать с датчиком (который вы не контролируете?). Насколько это отличается от «оригинального» конфига?
СамГибсон
1
Ну, я согласен с СэмГибсоном. Я бы не стал так быстро говорить, что шипы - это ошибки измерения. Я думаю, что вы должны попытаться исследовать это немного дальше и попытаться устранить их, если они исходят из ваших настроек измерения или найти причину, по которой они там есть. В конце концов, они, кажется, выровнены с падающими краями SCL. Я также попытался бы подключить датчик непосредственно к плате. Это может помочь вам исключить, что проблемы вызваны кабелем или расстоянием датчика от основной платы.
Никагян

Ответы:

11

Я думаю, что нашел ответ. Оказывается, это известная проблема, но я обнаружил ее только после того, как решил, где проблема, и искал ее!

Вот процесс, который я прошел, чтобы вы могли следовать ему (и, если необходимо, затем вы можете адаптировать свое расследование, если увидите результаты, которые отличаются от моих предположений). Суть в том, что, по-видимому, существует несовместимость между (по крайней мере, некоторым) поведением I2C MSP430 и требуемым поведением I²C устройством, которое вы подозреваете как подчиненное устройство I²C, IDT ZSC31014 . Наличие таблицы данных для этого устройства имеет решающее значение для понимания этого, поэтому спасибо за его поиск.

Хорошей новостью является то, что есть (по крайней мере) 2 обходных пути для этой проблемы, которые я объясню в конце.

График сгущается, кажется, что при подключении другого осциллографа схема не работает правильно, и видно, что единственное отличие состоит в том, что ACK не передается.

Новые следы полезны, спасибо, хотя я интерпретирую их немного по-другому.

(Недостаточный сигнал SCL, который касался меня на начальной трассе, все еще там на последней трассе. Интересно, что недолёт на SCL кажется больше, чем недолёт на SDA, особенно учитывая различные вертикальные шкалы между сигналами SCL и SDA на последний след. Я бы все-таки предложил в конце концов исследовать, что SCL не срабатывает, но я не верю, что это связано с основной проблемой.)

На SDA есть два «глюка»:

  • Сбои непосредственно перед или сразу после импульса ACK не редкость, когда ведущий I²C освобождает контроль над SDA, чтобы позволить ведомому устройству выполнить ACK, а затем мастер может снова перезапустить SDA. Поэтому я игнорирую это.

  • Это ранний глюк SDA, перед первым импульсом SCL, который является более необычным. По амплитуде этого раннего сбоя SDA (см. Далее) и того факта, что это происходит только до того первого импульса SCL (обозначено 0), но не происходит до более поздних импульсов SCL, когда мы могли бы видеть сбой на SDA (например, SCL). импульсы, помеченные 4, 5, 6 или 7), мы знаем, что это не артефакт измерения и не связь с SCL (например).

(Для дальнейшего использования ранний сбой SDA выглядит как минимум 2 В на последней трассе, поэтому при Vdd при 3,6 В из предыдущих комментариев это делает амплитуду сбоя SDA как минимум (2 / 3,6) = 0,55 x Vdd. Сравните это с соответствующие пороговые значения логического уровня I2C обсуждаются позже.)

Не обращая внимания на разницу ACK, я полагаю, что вижу еще одно различие между двумя наборами трасс на втором снимке экрана. Амплитуда этого раннего сбоя SDA кажется немного другой, если сравнивать верхнюю кривую SDA, помеченную C1(желтоватый цвет?), И вторую кривую SDA, помеченную M3(синяя). Теперь я считаю, что различия в амплитуде этого раннего сбоя SDA - вот что может вызвать появление или исчезновение вашей проблемы, как я объясню ниже.

Еще большее разрешение, особенно при сбое, могло бы помочь (это одна из проблем при попытке работать над проблемами «удаленно» - я не могу управлять «прицелом сам!»). Я предполагаю, что когда вы увеличиваете масштаб, это выглядит как начало нормальной логики I²C «1» (то есть кривая RC на переднем фронте, особенно если вы временно делаете подтягивания более слабыми, например, 10k), за исключением того, что это не t достичь полного положительного напряжения, прежде чем оно снова будет приведено к логическому «0». Это то, что показано на другой веб-странице, связанной позже. Если вы видите другую форму вашего глюка, мой более поздний анализ может не подойти.

Мастер I²C контролирует шину в точке этого сбоя, между I²C Start и первым тактовым импульсом SCL (который вы пометили как «0», хотя это MSbit). Это заставило меня с подозрением относиться к поведению MSP430, хотя с низким уровнем SCL в этот момент сбой SDA не должен влиять на устройства, совместимые с I²C, так как они будут ожидать повышения SCL, прежде чем они в следующий раз прочитают состояние SDA.

Итак, действительно ли I²C Slave соответствует I²C? Оказывается, ZSC31014 " суетливый " и менее терпимый, чем некоторые другие устройства I2C , именно тогда, когда я считаю, что MSP430 производит этот глюк!

В техническом описании ZSC31014 перечислены 3 области, в которых они допускают, что поведение I²C устройства «отличается». На вас также могут повлиять первые два в этом списке в другое время (это не является частью этого анализа), но это третий пункт, который я отметил ниже красным, который связан с этим ранним глюк SDA:


извлечение из таблицы данных ZSC31014


Амплитуда этого раннего сбоя SDA является критической . Если этот сбой недостаточно повышается, чтобы ZSC31014 распознал его как логику «1», прежде чем он снова упадет, то все в порядке - устройство должно увидеть спад на SDA, чтобы нарушить это «правило», и оно может быть только падение край , если он уже был признан в качестве логической «1».

Все, что влияет на амплитуду этого глюка SDA, например, дополнительная нагрузка оптического прицела или логического анализатора на сигнал SDA, может быть достаточным, чтобы помешать глюку, распознаваемому ZSC31014, достигать логической «1» и, следовательно, не «падать». SDA edge ", это третья точка в списке, может возникнуть (в хороший день, в зависимости от напряжения, температуры и т. Д.). Однако, как вы обнаружили, различия между осциллографами достаточно, чтобы означать, что некоторые из них добавляют достаточно нагрузки, чтобы остановить проблему, а другие - нет. Эта настройка должна быть очень маргинальной!

Это подтверждает мое беспокойство по поводу того, что ваши предыдущие «рабочие» партии датчиков могут быть «только-только» работающими, поскольку микроконтроллеры MSP430 на этих «рабочих» настройках, вероятно, также будут давать сбои SDA. Моя теория о возможной разнице между партиями датчиков, которая может объяснить различное поведение, о котором вы сообщили («рабочая» партия и «неработающая» партия), объясняется далее.

Интересно, что ZSC31014 отличается от стандартного I²C в другой области, которая не упомянута в этом списке от производителя, и это может объяснить, почему вы видите разницу между партиями датчиков.

Стандартные пороги логики I²C (упрощенные) - ниже 0,3 x Vdd для логической «0» и выше 0,7 x Vdd для логической «1», как показано в спецификации I²C :


пороги логического уровня из спецификации I2C


Однако ZSC31014 имеет разные пороги: 0,2 x Vdd и 0,8 x Vdd, что означает, что его «неопределенная область» между этими порогами больше, чем у обычных устройств I²C:


пороги логического уровня из таблицы ZSC31014


Эта большая «неопределенная область» увеличивает вероятность того, что сбой попадет в неопределенную область уровня напряжения, где он может быть распознан как логическая «1» (помните, что все, что выше 0,2 x Vdd, может быть распознано ZSC31014 как логическая «1»). , поскольку в неопределенной области все разрешено - это только выше 0,8 x Vdd, когда это должно быть распознано как логическая «1»). И, как объяснялось ранее, если ZSC31014 распознает глюк как достигший логической «1», то, когда он снова падает до логической «0», вы нарушили это «правило», помеченное красным для требуемого поведения I²C. по ZSC31014.

Поскольку распознавание логических уровней в этой «неопределенной» области напряжения не указано, производитель датчика не нарушает спецификации, если он делает одну партию, которая распознает логику «1» только тогда, когда она достигает 0,7 x Vdd, но делает другую партию, которая распознает например, логическая «1» всего 0,4 x Vdd. Эта гипотетическая вторая партия, скорее всего, увидит сбой SDA в качестве падающего фронта SDA, что является нарушением этой третьей точки в их списке, но не нарушает их спецификации.

(Многие из проблем, над которыми я работал на протяжении многих лет, были такими: есть два устройства, ни одно из которых не нарушает спецификацию, в которой есть лазейки, - но одно является суетливым и менее терпимым в точке, где другому требуется, чтобы подключенные устройства были более терпимыми из-за своего неясного поведения! Каждое из этих двух устройств прекрасно взаимодействует с большинством других устройств, но ненадежно (или полностью выходит из строя) при подключении друг к другу.)

Так что ты можешь сделать? Я думал о двух вариантах:

  • Не используйте MSP430 - используйте другой MCU, который не создает такого раннего сбоя SDA. Однако я ожидаю, что вы потратили много времени на программное обеспечение и не хотели бы переносить код на другой MCU, если этого можно избежать.

  • «Бит-бэнг» протокола I²C на MSP430 вместо использования встроенного аппаратного модуля I²C. Таким образом, вы полностью контролируете сигналы I²C и можете предотвратить возникновение этого сбоя. Тем не менее, очевидно, что потребуется создать собственные подпрограммы I²C, отладить их, и полученный код может оказаться больше, чем при использовании аппаратного модуля I²C MSP430, что само по себе может стать проблемой, если вам не хватает места во Flash.

Затем я начал искать проблемы MSP430 I²C и обнаружил, что эта комбинация MSP430 + ZSC31014 является известной проблемой из-за раннего сбоя SDA в MSP430! Смотрите эту тему на форуме TI E2E MSP430:

Форум TI E2E: сбой импульсов MSP430 I2C, создающий проблемы для периферийного чипа I2C

Обходное решение, упомянутое там, состоит в том, чтобы изменить адрес I²C ZSC31014 таким образом, чтобы уровень SDA был высоким в тот момент, когда мог произойти положительный сбой , и, поскольку SDA был сделан высоким, то в любом случае фактического сбоя в SDA не было:

Наш обходной путь состоит в том, чтобы сконфигурировать микросхему ZSC, чтобы у нее был адрес с установленным битом 6 (например, мы сейчас используем 0x42) - это превращает импульс сбоя в хороший чистый "старший" бит для длительности адреса 6, который избавляется проблемного спада.

Тот же обходной путь фактически противоположен предложению в техническом описании ZSC31014, в красном поле, которое я отметил. Они говорят, что сбой SDA должен быть предотвращен, если первый бит (который является MSbit) адреса I²C ZSC31014 равен 0 - так что не делайте MSbit адреса I²C "0", вместо этого сделайте его "1", т.е. установите бит 6 в 7-битном адресе I²C!

Так как эта ветка форума TI E2E и таблица данных ZSC31014 фокусируются на адресе I²C, то, возможно, либо сбой SDA не возникает, либо не является проблемой, если он возникает, во время отправки других данных по шине. Вам нужно будет исследовать это.

Поэтому, игнорируя первый обходной путь использования другого MCU, два (более практичных) обходных пути:

  • Ударьте по шине MSP430 I²C, написав свой собственный код, чтобы вы не создавали этот глюк на SDA, или
  • Измените адрес I²C ZSC31014 таким образом, чтобы был установлен бит 6 его 7-битного адреса, что означает, что SDA уже имеет высокий уровень, когда в противном случае возникнет сбой, поэтому на SDA не возникает фактический сбой при обращении к ZSC31014 (при условии, что сбой SDA либо не происходит после других событий I²C Start во время передачи данных, или, если они происходят, ZSC31014 не «расстраивается»).

Надеюсь, это поможет!

SamGibson
источник
2
Это удивительный и очень полезный ответ, прежде чем я отмечу как принятый, есть ли какой-нибудь способ, которым я могу дать вам еще одного представителя для того, чтобы придерживаться его при устранении неполадок. Я также обновлю свой вопрос с моим обходным путем, когда я получу его.
Hugoagogo
1
@Hugo - Это очень добрая мысль :-) Я полагаю, что это можно сделать, предложив вознаграждение, где причиной вознаграждения будет « Вознаграждение за существующий ответ ». Я не эксперт в этом процессе, поэтому я не могу сказать намного больше, чем это. Конечно, я был бы рад иметь дополнительного представителя (это заняло несколько часов, чтобы провести анализ и написание ;-)), но если вы не хотите использовать вознаграждение или не можете понять процесс , тогда не беспокойтесь, это все положительная карма в любом случае :-) Надеюсь, мой ответ работает!
СамГибсон
@Hugo - Я не знаю, будете ли вы получать уведомления об обновлениях ответов, но, к вашему сведению, я добавил параграф о SCL и его неполадках (все еще загадка, но я сомневаюсь, что это связано с основной проблемой), и я ' мы предположили, что амплитуда «раннего сбоя SDA» в последней трассе области видимости составляет не менее 0,55 x Vdd, что находится в «неопределенной» области напряжения, где могут обрабатываться разные датчики (или разные партии датчиков ;-)) что как логика «1» или нет, не нарушая их спецификации. Скоро я буду в оффлайне, так что еще раз удачи!
СамГибсон
1
Еще раз спасибо за помощь, я пойду с наградой в понедельник, когда нахожусь. (Для протокола, я не получаю уведомления об обновлениях ответов)
Hugoagogo
смогу ли я заставить вас взвесить одно последнее обновление вопроса.
Hugoagogo