Jump to content

    
Sign in to follow this  
A-10

Помехи на линии I2C при подключении оборудования

Recommended Posts

Всем доброго времени суток.

 

Суть проблемы следующая - есть плата с ARM-овым процессором (от NXP) и тремя линиями I2C, подтянутыми 4.7К резисторами к питанию 1.8В. Частота I2C 100КГц.

 

На плате крутится линукс, пробую по i2cdetect/i2cget получить данные с подключенных к линии микросхем - ID возвращается нормально.

Подключаю преобразователь уровня с камерой - сообщения не приходят (подтягивающие резисторы только на борде). Иногда SCL "залипает" в нуле до сброса.

 

На одной линии I2C без подключенных устройств подсоединился осциллографом к SCL/SDA. Пока нет подключения к SCL - сообщение нормально уходит, как только подключаю щуп, происходит следующая картина:

post-50207-1475048870_thumb.jpg

post-50207-1475048889_thumb.jpg

 

Грешу на избыточную емкость на линии, но может быть еще какие-то варианты? Перепаивать резисторы такого типоразмера сложновато..

Share this post


Link to post
Share on other sites
Грешу на избыточную емкость на линии, но может быть еще какие-то варианты? Перепаивать резисторы такого типоразмера сложновато..

У меня похожее но только по причине использования переходника между доменами питания 3.3В - 5В и мотни из проводов длинной. процессор ВМ10Я. тоже делает такие шила вместо нормального клокового импульса. шила амплитудой примерно 2В - уровня лог1 на домене 3.3В. абонент на домене 5В их не замечает, и пропускает клоки.

 

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

Share this post


Link to post
Share on other sites
Суть проблемы следующая - есть плата с ARM-овым процессором (от NXP) и тремя линиями I2C, подтянутыми 4.7К резисторами к питанию 1.8В. Частота I2C 100КГц.

я бы уменьшил с 4к7 до 3к3 (а то и 2к) при 1V8..

Подключаю преобразователь уровня с камерой - сообщения не приходят (подтягивающие резисторы только на борде). Иногда SCL "залипает" в нуле до сброса.

придется внимательно смотреть в исходниках ядра логику работы драйвера i2c для вашего АРМа.. найдите место где АРМ отлавливает таймауты на шине и попробуйте увеличить интервал ожидания, число попыток и после неуспеха полную реиниализацию этой подсистемы в АРМе.. ну и быть готовым к правкам в софте пользователя из-за "неожиданных" прерванных транзакций по i2c

На одной линии I2C без подключенных устройств подсоединился осциллографом к SCL/SDA. Пока нет подключения к SCL - сообщение нормально уходит, как только подключаю щуп, происходит следующая картина:

похоже на наводки на шуп или от DC/DC на желтой линии - ищите источник помех..

Share this post


Link to post
Share on other sites
похоже на наводки на шуп или от DC/DC на желтой линии - ищите источник помех..

на наводки не похоже: узкие пики - это мастер выставляет на клоке 1, и тут же его в 0 опускает. при этом положительное время клока считается уже прошедшим. почему так делается - спасибо тому кто раскажет.

может уменьшение до подтяжек реально поможет? яб 470ом попробовал.

Edited by AlexRayne

Share this post


Link to post
Share on other sites
У меня похожее но только по причине использования переходника между доменами питания 3.3В - 5В и мотни из проводов длинной.
У меня так же на проводах преобразователь, я сделал плату, дабы устранить эту проблему, т.к. в тот момент не было под рукой осциллографа и все проблемы списывал на провода. Но все оказалось куда интереснее.

 

Jury093

Похоже, заменить резисторы будет проще всего, т.к. для нормальной работы i2c придется ковырять все драйверы подключенных устройств.

 

AlexRayne

на наводки не похоже: узкие пики - это мастер выставляет на клоке 1, и тут же его в 0 опускает. при этом положительное время клока считается уже прошедшим. почему так делается - спасибо тому кто раскажет.

может уменьшение до подтяжек реально поможет? яб 470ом попробовал.

Да, больше пока нечего придумать. Буду ждать ответа от NXP и подумаю, как снять резисторы без последствий.

 

Еще возникла мысль, может быть это clock stretching.. Например, время нарастания фронта недостаточно быстрое и мастер считает, что слейв держит SCL, пробует через полпериода или период выставить новый высокий уровень, но передача в итоге сбивается и слейв не возвращает ack.

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites
А какие у вас преобразователи лог. уровней стоят?
На мосфетах, по такой схеме

post-50207-1475128893_thumb.jpg

С I2C, конечно, убраны pull-up резисторы со стороны борды.

 

Похоже на помехи при соединении шлейфом, данные и синхросигнал проходят в двух проводах, расположенных рядом в шлейфе. Синхросигнал через емкость линии наводится на данные в виде пиков на фронтах. Обычно сигнальные провода в шлейфе разделяют земляным проводом между ними.
Похоже Вы правы. У меня не шлейф, а отдельные провода, но все же - сейчас попробовал прицепиться к земле поближе (тестировал осциллографом) и передача прошла без сбоев.

С преобразователем та же проблема, вероятно.. буду тестировать на новой отдельной плате.

Share this post


Link to post
Share on other sites
AlexRayneДа, больше пока нечего придумать. Буду ждать ответа от NXP и подумаю, как снять резисторы без последствий.

Зачем снимать? накиньте паралельно где получиться

Share this post


Link to post
Share on other sites
Зачем снимать? накиньте паралельно где получиться
Спасибо, что-то я затупил, попробую воткнуть 4.7К на преобразователе.

 

Сейчас подключил свежезапаяную плату преобразователя уровня, i2cdetect выдает мусор, трансивер на шине перестает работать.

Если к пинам подключиться еще и осциллографом, то при загрузке линуха (видимо в этот момент CPU пытается записать данные в трансивер HDMI) SDA падает в ноль намертво, до следующего ресета.

 

Не думаю, что дело в разводке, хотя она и не идеальна (2 слоя, отдельной земли нет), попробую подпаять резистор сегодня.

 

upd. на линии I2C без других микросхем, при запросе i2cdetect процентов 60% сообщений проходят нормально (нет мусора), при подключении щупов - процентов 15%.

Edited by A-10

Share this post


Link to post
Share on other sites
upd. на линии I2C без других микросхем, при запросе i2cdetect процентов 60% сообщений проходят нормально (нет мусора), при подключении щупов - процентов 15%.

1. попробуйте отвязать щупы через транзисторные буфера или подходящую низковольтовую логику

2. шина i2c "не любит" большую емкость физических линий (мы с этим столкнулись поставив в левелшифтер полевики с большой собственной емкостью), но это вроде не ваш случай - фронты вполне валидные

3. вместо камеры для тестов подключите что-то типа 24c02/04 или подобную i2c eeprom - этим отсекаете возмущения по питанию и можно тестировать работоспособность шины, варируя длиной проводков..

 

на наводки не похоже: узкие пики - это мастер выставляет на клоке 1, и тут же его в 0 опускает

согласен, посчитал импульсы, действительно это похоже на клоки с очень странным поведением - если бы давил слейв, то была бы ступенька.. с другой стороны мне неизвестны АРМы с таким поведением корки мастера i2c - всегда считал, что клок атомарен и импульс должен быть полный при отсуствие внешних воздействий.. в общем это вопрос к NXP

 

(вопрос к ТС - а что, собственно, за АРМ? NXP который freescale или нативный NXP типа LPC?)

Share this post


Link to post
Share on other sites
согласен, посчитал импульсы, действительно это похоже на клоки с очень странным поведением - если бы давил слейв, то была бы ступенька.. с другой стороны мне неизвестны АРМы с таким поведением корки мастера i2c - всегда считал, что клок атомарен и импульс должен быть полный при отсуствие внешних воздействий.. в общем это вопрос к NXP

 

(вопрос к ТС - а что, собственно, за АРМ? NXP который freescale или нативный NXP типа LPC?)

и2ц мастер должен както отлавливать удерживание клока, или захват его - так что атомарность у него с оговорками.

к нашему элвису (ВМ10Я) тот же самый вопрос. имхо они могли взять готовую глючную корку и2ц, может на какихто опенкорес....

полагаю у данного проца всегда есть выход - захватить пины и програмно реализовать интерфейс. гораздо поганее если такой возможности нету.

Share this post


Link to post
Share on other sites
upd. на линии I2C без других микросхем, при запросе i2cdetect процентов 60% сообщений проходят нормально (нет мусора), при подключении щупов - процентов 15%.

У вас какие то ужасы.

Проверьте уровень логического нуля, сравните с ДШ всех чипов на шине. Бывает VIL = 0.2*VCC = 0.35V

Видел в ДШ даже 0,3V.

ноль 0,3v обеспечить и без преобразователя уровня не всегда получается.

 

Share this post


Link to post
Share on other sites
(вопрос к ТС - а что, собственно, за АРМ? NXP который freescale или нативный NXP типа LPC?)
Скорее Freescale, проц - s32v234, во многих моментах пересекается с imx6.

 

Так или иначе, добавил в параллель 4.7К (получилось 2.35К) со стороны борды, и заменил на 2.2К со стороны преобразователя - I2C работает, даже на линии с микросхемами!

 

До самого девайса (камера) не удалось пока достучаться. Утром еще заметил, что сигнал тактовой 27МГц после преобразователя получается со смещением. Заменил резисторы на 2.2К так же (думал из-за емкости не успевает разряжаться), но результат такой же практически:

post-50207-1475158674_thumb.jpg

Сверху 1.8В сигнал от борды, снизу - соот-но от преобразователя. Частота не верно показана, она 27МГц.

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this