|
|
  |
STM32F4: Помехи по I2C. |
|
|
|
Apr 9 2017, 15:41
|
Гуру
     
Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713

|
Цитата(Jury093 @ Apr 4 2017, 16:07)  - на контакты питания esp8266 навесить 22-50uF - для теста закормить плату с esp8266 от отдельного стабилизатора, в идеале только esp8266 - в точке подключения пуллапов i2c к +3в3 временно припаять кондей на 10uF, у вас два комплекта пуллапов, тогда и на второй тоже свой кондей - может удасться этим отсечь возможный путь для помех.. Это всё делалось - ничего не помогло. Написал тесты плотной работы со всеми слэйвами на шине, запускал эти тесты на несколько часов: если без обмена с ESP8266 - работало пару суток без единого сбоя, за это время на I2C-FRAM-ку записалось несколько гигабайт (запись-чтение-проверка) и с другими I2C-слэйвами было много операций. Как только включаешь обмен с ESP8266 - не позднее чем через минуту следует сбой, а обычно - уже через несколько секунд. Перепробовал разные подтяжки, скорости по I2C, конденсаторов кучу навесил, резисторы 50 Ом последовательно на все сигналы ESP8266, пробовал отдельно запитывать ESP, дросселя на питание (и на GND) - ничего не помогало.  ((((( Сейчас вдруг решил поменять режим ноги SCL на МК на push-pull вместо open-drain. И все проблемы исчезли! Работает ещё недолго, но уже полчаса прошло - такого ещё не было. Достаточно ничего не меняя опять вернуть open-drain ножке SCL - сразу начинает сбоить. Это конечно неправильно и противоречит спецификации I2C, но ничего не поделаешь - оставлю наверное push-pull для SCL. Без ESP8266 и с open drain нормально работает, но....  (((
|
|
|
|
|
Apr 10 2017, 02:54
|
Местный
  
Группа: Свой
Сообщений: 480
Регистрация: 21-11-04
Пользователь №: 1 188

|
Цитата(jcxz @ Apr 9 2017, 18:41)  Сейчас вдруг решил поменять режим ноги SCL на МК на push-pull вместо open-drain. И все проблемы исчезли! Ну, если Ваши слэйвы клок не придерживают - Вам повезло. Но вообще-то это хрень какая-то... Ваш "прием" по сути означает резкое уменьшение импеданса шины в "единице". Очень похоже на сильную наводку или звон с амплитудой, пробивающей клампы...
|
|
|
|
|
Apr 10 2017, 07:02
|
Гуру
     
Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713

|
Цитата(AnatolyT @ Apr 9 2017, 19:23)  Если проблема исчезла когда переключили резисторы подтяжки шины с внешних на внутренние, то вероятно помеха наводится по питанию на участке цепи между контроллером и этими резисторами. Прочитайте мой пост внимательнее - я включил push-pull вместо open drain (стандартного для I2C). Подтягивающие резисторы при этом не используются. До этого включал и отключал и внутренние и внешние подтяжки в разных комбинациях - не было никакого толку. Цитата(AnatolyT @ Apr 9 2017, 19:23)  Может быть имеет смысл провести отдельным проводником напряжение питания непосредственно от контактов питания контроллера до резисторов подтяжки. Вы не понимаете схему включения. Всё описано постами выше. Цитата(Axel @ Apr 10 2017, 04:54)  Ну, если Ваши слэйвы клок не придерживают - Вам повезло. Но вообще-то это хрень какая-то... Ваш "прием" по сути означает резкое уменьшение импеданса шины в "единице". Очень похоже на сильную наводку или звон с амплитудой, пробивающей клампы... Я согласен с Вами, что это хрень. Поэтому и долго не пробовал так сделать. Но пока вроде всё работает ок до 400кГц со всеми слэйвами. Да и ещё я как-то думал, что в STM32 (мало опыта с ними) характеристики пина определяются включенной альтернативной функцией и думал что невозможно включить push-pull для пинов если для них выбрана функция I2C. В некоторых других МК именно так. Цитата(vladec @ Apr 10 2017, 08:46)  Напротив, полагаю, если режим Buse не используется, то всегда лучше иметь SCL в push-pull, это существенно уменьшает возможности для проникновения на шину помех Кто-ж его знает - используется или нет? Я же не могу влезть в схемотехнику всех своих слэйвов. Но пока вроде всё работает ок до 400кГц со всеми слэйвами.
|
|
|
|
|
Apr 10 2017, 08:24
|
Частый гость
 
Группа: Участник
Сообщений: 176
Регистрация: 29-03-10
Пользователь №: 56 269

|
В свое время делал следующее: в существующий измерительный прибор необходимо было добавить блок памяти, решил использовать i2c, так как только два порта контроллера прибора были доступны и они же использовались для обмена с дисплеем для отображения результатов, и все это в ограниченном объеме. Добавил м\с памяти на платку дисплея. Все это работало в руках на проводах, как собираем все в корпус сбой при обмене. Пришлось экранировать шину i2c, на шлейфе, соединяющим платку дисплея, между шинами scl и sda и с двух сторон оставить заземленные проводники. И после этого все равно были единичные сбои, пришлось организовать обмен с подтверждением и циклическим контролем. Какие причины возникновения помехи: импульсный ток в цепи питания и по землям от внешнего устройства и радиопомеха на шину i2c. На 32F429IDISCOVERY есть резисторы подтяжки шины, R29 и R30 номиналом 4,7 кОм. Когда включается push pull используется верхний транзистор управления порта, то есть он шунтирует резистор подтяжки и тем самым вероятно устраняет влияние помехи. По всей видимости i2c, организованный на этом порте, может работать в режиме мастера, и все равно это нарушение протокола i2c.
|
|
|
|
|
Apr 11 2017, 10:06
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
QUOTE (gerber @ Apr 11 2017, 12:34)  Я бы предположил, что ESP8266 иногда ловит ложное старт-условие с последующим обнаружением своего адреса, Ребята, а давайте читать тему целиком, а не только последнее сообщение? QUOTE (jcxz @ Apr 3 2017, 16:36)  Он подключен по UART - коллизий никаких быть не может. На AT-команды отвечает.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Apr 11 2017, 11:08
|
Гуру
     
Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713

|
Цитата(vladec @ Apr 11 2017, 09:26)  Если Buse в изделии не используется, нет ни какого смысла конфигурировать SCL в режим открытого коллектора. Повторю для непонятливых: Не знаю что такое "Buse", но если это "clock stretch", то как определить: "используется в изделии" он или нет? Цитата(AnatolyT @ Apr 10 2017, 10:24)  И после этого все равно были единичные сбои, пришлось организовать обмен с подтверждением и циклическим контролем. Что Вы имеете в виду под подтверждением? Стандартный ACK? Так он и так есть. И что такое "циклический контроль"? Свой протокол обмена по I2C я накрутить не могу - у меня связь не между двумя МК. Сбои идут в виде: NACK на передачу адреса слэйва; arbitration lost, bus error и т.п. Можно конечно усложнить драйвер I2C - добавить обработку этих ситуаций, в виде повторных транзакций и т.п. Но неохота это делать, ибо: во 1-х - получается громоздко; во-2-х - считаю принципиально неверным подход придумывания костылей по устранению последствий вместо лечения самой причины (а причина - аппаратная, а не программная). Цитата(AnatolyT @ Apr 10 2017, 10:24)  По всей видимости i2c, организованный на этом порте, может работать в режиме мастера, и все равно это нарушение протокола i2c. Он и работает в режиме мастера всегда. Других мастеров на шине нет. Про "clock stretching" знаю. Надеюсь мои слэйвы его не используют. Цитата(Сергей Борщ @ Apr 11 2017, 12:06)  Ребята, а давайте читать тему целиком, а не только последнее сообщение? Спасибо
|
|
|
|
|
Apr 11 2017, 11:08
|
Местный
  
Группа: Участник
Сообщений: 319
Регистрация: 27-09-07
Пользователь №: 30 877

|
Цитата(jcxz @ Apr 11 2017, 13:56)  Повторю для непонятливых: Не знаю что такое "Buse", но если это "clock stretch", то как определить: "используется в изделии" он или нет? 1) клоки посмотреть. в норме должны стоять ровные посылки по 9 клоков с паузой. если конечно пауза есть. в середине посылки если есть дрожание - это уже намек на стретч. 2) можно врезать резистор в цепь клока. и на нем будет видно - просаживает ли слейв свой конец или нет.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|