реклама на сайте
подробности

 
 
> I2C - проблема, сбои в работе
Igor_S
сообщение Dec 3 2014, 14:25
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 258
Регистрация: 3-08-04
Пользователь №: 434



Здравствуйте все!
Вопрос у меня по поводу интерфейса I2C, связывающего импульсный блок питания с процессором STM32F407.
Процессор в режиме мастера, говорит с железкой, в которой 3 блока питания на общей шине I2C.
Пока блоки были на столе, без железки - т.е. соединения SDA и SCL между блоками было сделано просто проводами - все было ОК. Как только блоки внутри железки, они там воткнуты во внутреннюю печатную плату, соединения выполнены в виде дорожек на ней - начались проблемы.
Выглядит это таким образом. Процессор в режиме Master RX читает содержимое простого регистра PCF6574 внутри блока питания - и вдруг начинает читать FF.
Я смотрю на шину SDA - действительно высокий уровень, и только ACK от мастера - он, типа, продолжает читать...
Смотрю на SCL - и вижу, перед этим событием - был будто-бы пропуск клока, т.е. передний фронт клока задержался на пол-периода!
Стал исследовать, обращаюсь к несуществующим адресам - вижу те-же пропуски клока...
Эффект пропадает либо при отключении линии SCL от блока питания (еще раз повторю, я обращаюсь не к нему, поетому могу играться), либо при выключении блока питания.

Видимо, это связано с наводкой на SCL сигнал от импульсника (но я ничего криминального не вижу на скопе) - но КАК Мастер об этом знает? Как можно прервать передачу в произвольный момент? Это выглядит как "SCL Stretching", но ведь это релевантно только для Slave? Да, я забыл сказать - источник пропуска именно процессор, я это вижу по уровню сигнала.
Видел ли кто такое? Куда глядеть, как Вы думаете?

Спасибо
Go to the top of the page
 
+Quote Post
2 страниц V   1 2 >  
Start new topic
Ответов (1 - 14)
kovigor
сообщение Dec 3 2014, 15:03
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 5 273
Регистрация: 30-03-10
Пользователь №: 56 295



Цитата(Igor_S @ Dec 3 2014, 17:25) *
Видел ли кто такое? Куда глядеть, как Вы думаете?

"Земля" нигде не разорвана ? Т.е., все ли абоненты шины имеют общую землю ?
Подтягивающие резисторы на линиях интерфейса есть ? Если да, то какого номинала ?
Возможно ли в порядке эксперимента заменить импульсный БП линейным или даже обычным аккумулятором ?
Go to the top of the page
 
+Quote Post
Igor_S
сообщение Dec 3 2014, 15:16
Сообщение #3


Местный
***

Группа: Свой
Сообщений: 258
Регистрация: 3-08-04
Пользователь №: 434



QUOTE (kovigor @ Dec 3 2014, 19:03) *
"Земля" нигде не разорвана ? Т.е., все ли абоненты шины имеют общую землю ?
Подтягивающие резисторы на линиях интерфейса есть ? Если да, то какого номинала ?
Возможно ли в порядке эксперимента заменить импульсный БП линейным или даже обычным аккумулятором ?

Спасибо за ответ,
Земля вроде общая.
Резисторы 4.7К
Насчет заменить - извините, я не уточнил. Сейчас плата с процессором запитана от отдельного линейного лабораторного блока питания, импульсник - это абонент на I2C, его выходное напряжение вообще никуда не идет (сейчас). Только питает его собственную электронику (я имею в виду I2C микрошемы внутри источника).
Go to the top of the page
 
+Quote Post
kovigor
сообщение Dec 3 2014, 15:26
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 5 273
Регистрация: 30-03-10
Пользователь №: 56 295



Цитата(Igor_S @ Dec 3 2014, 19:16) *
импульсник - это абонент на I2C

Самодельный ? Если да, то насколько корректно он сделан, включая разводку ПП ? Можно ли его заменить, например, аккумулятором ?
Go to the top of the page
 
+Quote Post
Igor_S
сообщение Dec 4 2014, 06:18
Сообщение #5


Местный
***

Группа: Свой
Сообщений: 258
Регистрация: 3-08-04
Пользователь №: 434



QUOTE (kovigor @ Dec 3 2014, 18:26) *
Самодельный ? Если да, то насколько корректно он сделан, включая разводку ПП ? Можно ли его заменить, например, аккумулятором ?

Нет, увы - не самодельный, иначе бы я хоть представлял разводку его платы.
Смысл такой - моя плата связана по I2C с готовым модулем, содержащим 3 "рэка". Каждый рэк содержит 3 независимых импульсника. Каждый импульсник имеет I2C для чтения его параметров.
это я вообще описываю устройство. Я сейчас работаю только с одним рэком, внутри которого установлен только один импульсник.
Плата питается от отдельного лабораторного источника.
Подтягивающие резисторы установлены на плате, на ее питание 5В.
Сама проблема. Рэки есть 2-х типов.
Первый - каждый блок питания, входящий в рэк, имеет отдельный коннектор для подключения I2C, и соединение SCL, SDA выполнено отдельным внешним кабелем. С этим рэком проблем нет.
Второй тип рэка имеет один коннектор, и соединения SCL, SDA выполнены на внутренней печатной плате, в которую вставлены источники. Разводка этой платы мне не известна - но понятно, что соединения выполнены длинными дорожками на всю длину рэка (сантиметрое 40). Вот с этим типом рыка появляется проблема, что при чтении серии байтов - начиная с какого-то момента, я получаю "FF". Сннхронизируя скоп, я вижу, что перед этим произошел как-бы "clock stretching", т.е. положительный фронт клока как бы задержан на пол-периода... И видимо, начиная с этого момента, "slave" останавливает обмен, а мастер - ничего не подозревая, продолжает гнать клок, давать ACK и т.д.
Кстати, этот момент может наступить в совершенно случайном месте - например, при выдаче мастером адреса слэйва - тогда просто мастер, не получив ACK, завершает обмен по таймауту.
Мастер - процессор STM32F407.
Вот такая проблема...
Go to the top of the page
 
+Quote Post
Jury093
сообщение Dec 4 2014, 06:56
Сообщение #6


Знающий
****

Группа: Участник
Сообщений: 959
Регистрация: 11-01-06
Из: Санкт-Петербург
Пользователь №: 13 050



Цитата(Igor_S @ Dec 4 2014, 09:18) *
Смысл такой - моя плата связана по I2C с готовым модулем, содержащим 3 "рэка". Каждый рэк содержит 3 независимых импульсника. Каждый импульсник имеет I2C для чтения его параметров.
это я вообще описываю устройство. Я сейчас работаю только с одним рэком, внутри которого установлен только один импульсник.

1. попробовать снизить скорость обмена по i2c
2. взять что-то типа i2c eeprom, привесить на ту же шины и посмотреть на поведение
3. в БП чипы точно слейвы? мало ли кто-то из них умеет мастерить..
4. как вариант - в разрыв поставить i2c levelshifter (типовая схема у филипса)
5. как радикальный - опторазвязку на i2c
Go to the top of the page
 
+Quote Post
Igor_S
сообщение Dec 4 2014, 07:30
Сообщение #7


Местный
***

Группа: Свой
Сообщений: 258
Регистрация: 3-08-04
Пользователь №: 434



QUOTE (Jury093 @ Dec 4 2014, 10:56) *
1. попробовать снизить скорость обмена по i2c
2. взять что-то типа i2c eeprom, привесить на ту же шины и посмотреть на поведение
3. в БП чипы точно слейвы? мало ли кто-то из них умеет мастерить..
4. как вариант - в разрыв поставить i2c levelshifter (типовая схема у филипса)
5. как радикальный - опторазвязку на i2c

Jury,
1. Не влияет
2. В БП имеется eeprom, все то же самое - при чтении начинает выдавать "ff"
3. Точно, eeprom AT24C02, register PCF8574, ADC PCF8591

QUOTE (Jury093 @ Dec 4 2014, 10:56) *
3. в БП чипы точно слейвы? мало ли кто-то из них умеет мастерить..

Понимаете, если я смотрю на этот сцвинутый клок со стороны процессора - я четко вижу вместо правильного фронта имеется спайк, т.е. процессор пытается поставить клок, но тут-же его снимает. Со стороны импульсника, этот спайк задавлен по амплитуде, едва виден - на основании этого я делаю вывод, что это работа процессора, а не блока питания...
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Dec 4 2014, 08:27
Сообщение #8


Гуру
******

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



Цитата(Igor_S @ Dec 4 2014, 09:30) *
я четко вижу вместо правильного фронта имеется спайк, т.е. процессор пытается поставить клок, но тут-же его снимает. Со стороны импульсника, этот спайк задавлен по амплитуде,
"Спайк" = "выброс"? В какую сторону этот выброс, он появляется на восходящем фронте? Не может этот выброс быть результатом сбоя или ошибки программы, из-за которого порт переходит на короткое время из режима I2C в режим обычного выхода? Сопротивления подтяжек можно уменьшить до 1 кОм, причем при ваших длинах наверное не только можно, но и нужно. Можно в разрыв линии включить резистор ом на 100 и глядя двумя лучами на оба его вывода будет хорошо видно - кто выдает какой сигнал и видны все конфликты.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
Igor_S
сообщение Dec 4 2014, 09:07
Сообщение #9


Местный
***

Группа: Свой
Сообщений: 258
Регистрация: 3-08-04
Пользователь №: 434



QUOTE (Сергей Борщ @ Dec 4 2014, 12:27) *
"Спайк" = "выброс"? В какую сторону этот выброс, он появляется на восходящем фронте? Не может этот выброс быть результатом сбоя или ошибки программы, из-за которого порт переходит на короткое время из режима I2C в режим обычного выхода? Сопротивления подтяжек можно уменьшить до 1 кОм, причем при ваших длинах наверное не только можно, но и нужно. Можно в разрыв линии включить резистор ом на 100 и глядя двумя лучами на оба его вывода будет хорошо видно - кто выдает какой сигнал и видны все конфликты.

Привет, Сергей!
Это ведь я, твой бывший рижский коллега, чего это мы на Вы?
Как там Эрик, привет ему! Как вы вообще?
По теме, да резистор влепить я не сообразил, спасибо - но вроде по уровню выброса понятно, откуда он.
Насчет перехода в режим обычного выхода - да, может быть. Просто, один и тот-же импульсник нормально читается в одном рэке, где соединения I2C выполнены внешним кабелем, и сбоит в другом рэке с внутренними соединениями. Чето тяжело представить в чем разница, кроме помех на линиях клока и данных, но я скопом особых помех не вижу...

QUOTE (Сергей Борщ @ Dec 4 2014, 12:27) *
В какую сторону этот выброс, он появляется на восходящем фронте?

Да, выброс - как бы вместо положительного фронта. Например, в самом начале сеанса - передается адрес слейва, уже начинает ставиться нужный бит даты (1), затем - выброс на клоке, и дата сбрасывается в 0, затем процесс продолжается - но уже с проглоченным битом
Go to the top of the page
 
+Quote Post
Jury093
сообщение Dec 4 2014, 09:50
Сообщение #10


Знающий
****

Группа: Участник
Сообщений: 959
Регистрация: 11-01-06
Из: Санкт-Петербург
Пользователь №: 13 050



Цитата(Igor_S @ Dec 4 2014, 12:07) *
Просто, один и тот-же импульсник нормально читается в одном рэке, где соединения I2C выполнены внешним кабелем, и сбоит в другом рэке с внутренними соединениями. Чето тяжело представить в чем разница, кроме помех на линиях клока и данных, но я скопом особых помех не вижу...

помех нет, левых мастеров на шине нет..
а что там с питанием слейвов, величина напряжения?
если 3в3, то остаются два варианта:
- баги в софте мастера (как предположили выше)
- развязка шины между блоками - опторазвязка (so-08) или левелшифтер на паре полевиков..
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Dec 4 2014, 09:55
Сообщение #11


Гуру
******

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



Цитата(Igor_S @ Dec 4 2014, 11:07) *
Это ведь я, твой бывший рижский коллега, чего это мы на Вы?
Ремарыч? Сколько лет... Вот же совпадение - вспоминал тебя недавно. Остальное в личку напишу.

Цитата(Igor_S @ Dec 4 2014, 11:07) *
Насчет перехода в режим обычного выхода - да, может быть. Просто, один и тот-же импульсник нормально читается в одном рэке, где соединения I2C выполнены внешним кабелем, и сбоит в другом рэке с внутренними соединениями. Чето тяжело представить в чем разница, кроме помех на линиях клока и данных, но я скопом особых помех не вижу...
Тогда хорошо бы понаблюдать за выбросами между землей процика и землей импульсника.

Цитата(Igor_S @ Dec 4 2014, 11:07) *
Да, выброс - как бы вместо положительного фронта. Например, в самом начале сеанса - передается адрес слейва, уже начинает ставиться нужный бит даты (1), затем - выброс на клоке, и дата сбрасывается в 0, затем процесс продолжается - но уже с проглоченным битом
Вот это и странно. Ведь на шину никто не имеет права выставлять единицу, шину можно только притягивать к земле открытым коллектором/стоком. Значит, если процессор начал тянуть линию к земле, а потом на ней появилась единица - то либо он ее по каким-то непонятным причинам отпустил, либо на шину влез кто-то еще, совершенно нестандартный со своей активной единицей. Если бы сработал арбитраж - передача должна оборваться совсем и начаться сначала. А тут как будто бит в середине посылки укорачивается. Даже и не знаю, в какую сторону копать посоветовать.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
Igor_S
сообщение Dec 4 2014, 10:41
Сообщение #12


Местный
***

Группа: Свой
Сообщений: 258
Регистрация: 3-08-04
Пользователь №: 434



QUOTE (Сергей Борщ @ Dec 4 2014, 13:55) *
Ремарыч? Сколько лет... Вот же совпадение - вспоминал тебя недавно. Остальное в личку напишу.

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

Вот это и странно. Ведь на шину никто не имеет права выставлять единицу, шину можно только притягивать к земле открытым коллектором/стоком. Значит, если процессор начал тянуть линию к земле, а потом на ней появилась единица - то либо он ее по каким-то непонятным причинам отпустил, либо на шину влез кто-то еще, совершенно нестандартный со своей активной единицей. Если бы сработал арбитраж - передача должна оборваться совсем и начаться сначала. А тут как будто бит в середине посылки укорачивается. Даже и не знаю, в какую сторону копать посоветовать.

Нет, все не так - дата пошла вверх (должен передаться 1), клок пошел вверх - т.е процессор отпустил стоки - и вдруг оба срываются в 0, т.е. на месте клока - короткий импульс, на месте даты - подлиннее. Но все нормально, т.е. никаких нестандартных единиц нет.
Чего это процессору вздумалось обрывать клок и дату - непонятно, вот с этим и разбираюсь...
Кстати, тут еше такое дело. Поскольку мне нужны были несколько (4) отдельных каналов I2C, я не мог обойтись только процессором, их там 3. Поэтому, я использую мультиплексер (хаб) PCA9518. T.e. канал I2C процессора идет на один из 5 каналов хаба (нулевой), а каналы 1,2,3,4 выбираются процессором при помощи просто дискретных входов разрешения на мультиплексере.
PCA9518 не совсем мультиплексор, поскольку позволяет подключить любой канал к любому, но у меня он используется как мултиплексер.
Я не упоминал о нем, поскольку он, вроде, не обладает никакими интеллектуальными функциями типа clock stretching или master.
Может, ты знаком с этой хренью?

Спасибо, что вспоминал всуе... Мне не икалось чего-то, видимо по-доброму вспоминал?

QUOTE (Jury093 @ Dec 4 2014, 13:50) *
помех нет, левых мастеров на шине нет..
а что там с питанием слейвов, величина напряжения?
если 3в3, то остаются два варианта:
- баги в софте мастера (как предположили выше)
- развязка шины между блоками - опторазвязка (so-08) или левелшифтер на паре полевиков..


Jury, а что вы имеете в виду, почему если 3.3, то только 2 причины? А если 5? У меня как раз 5!
Go to the top of the page
 
+Quote Post
Jury093
сообщение Dec 4 2014, 10:48
Сообщение #13


Знающий
****

Группа: Участник
Сообщений: 959
Регистрация: 11-01-06
Из: Санкт-Петербург
Пользователь №: 13 050



Цитата(Igor_S @ Dec 4 2014, 13:41) *
Jury, а что вы имеете в виду, почему если 3.3, то только 2 причины? А если 5? У меня как раз 5!

а мастер на 3в3?
тогда однозначно шины надо изолировать..
и если у вас все работает через относительно длинный кабель, то это объясняется падением напряжения на кабеле..
google.ru->"philips i2c level shifter" наглядно в картинках
Go to the top of the page
 
+Quote Post
Igor_S
сообщение Dec 4 2014, 11:37
Сообщение #14


Местный
***

Группа: Свой
Сообщений: 258
Регистрация: 3-08-04
Пользователь №: 434



QUOTE (Jury093 @ Dec 4 2014, 14:48) *
а мастер на 3в3?
тогда однозначно шины надо изолировать..
и если у вас все работает через относительно длинный кабель, то это объясняется падением напряжения на кабеле..
google.ru->"philips i2c level shifter" наглядно в картинках

Jury, понятно.
Но я использую между процессором и выходом платы мультиплексер (хаб) PCA9518, его выходной интерфейс питается 5В.
Я не сказал об этом, поскольку вроде это совершенно неинтеллектуальный чип, не способный на такие фокусы - но хрен его знает, я уже ни в чем не уверен...
Go to the top of the page
 
+Quote Post
Jury093
сообщение Dec 4 2014, 12:10
Сообщение #15


Знающий
****

Группа: Участник
Сообщений: 959
Регистрация: 11-01-06
Из: Санкт-Петербург
Пользователь №: 13 050



Цитата(Igor_S @ Dec 4 2014, 14:37) *
Но я использую между процессором и выходом платы мультиплексер (хаб) PCA9518, его выходной интерфейс питается 5В.
Я не сказал об этом, поскольку вроде это совершенно неинтеллектуальный чип, не способный на такие фокусы - но хрен его знает, я уже ни в чем не уверен...

тогда похоже в этом хабе источник проблемы..
вот его диаграммы обмена с "подозрительными" площадками:


и ниже написана фраза мне совершенно непонятная:

"It is important to note that any arbitration or clock stretching events on Bus 1 require that
the VOL of the devices on Bus 1 be 70 mV below the VOL of the PCA9518 (see VOL-VILc in
Section 9 “Static characteristics”) to be recognized by the PCA9518 and then transmitted
to Bus 0."

возможно надо крутить величину пуллапов, впрочем вот тут:
http://electronix.ru/forum/index.php?showtopic=81998
это не помогло..

я бы для проверки убрал бы хаб и поставил вышепосоветованные шифтер/изолятор и проверил функционирование без длинного кабеля..
и поищите аппноту для pca9518 - может там расписаны расчеты пуллапов..

PS если что, существуют еще i2c мультиплексоры..

Сообщение отредактировал Jury093 - Dec 4 2014, 12:38
Go to the top of the page
 
+Quote Post

2 страниц V   1 2 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 19th July 2025 - 04:39
Рейтинг@Mail.ru


Страница сгенерированна за 0.0141 секунд с 7
ELECTRONIX ©2004-2016