Перейти к содержанию
    

Здравствуйте все!

Вопрос у меня по поводу интерфейса I2C, связывающего импульсный блок питания с процессором STM32F407.

Процессор в режиме мастера, говорит с железкой, в которой 3 блока питания на общей шине I2C.

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

Выглядит это таким образом. Процессор в режиме Master RX читает содержимое простого регистра PCF6574 внутри блока питания - и вдруг начинает читать FF.

Я смотрю на шину SDA - действительно высокий уровень, и только ACK от мастера - он, типа, продолжает читать...

Смотрю на SCL - и вижу, перед этим событием - был будто-бы пропуск клока, т.е. передний фронт клока задержался на пол-периода!

Стал исследовать, обращаюсь к несуществующим адресам - вижу те-же пропуски клока...

Эффект пропадает либо при отключении линии SCL от блока питания (еще раз повторю, я обращаюсь не к нему, поетому могу играться), либо при выключении блока питания.

 

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

Видел ли кто такое? Куда глядеть, как Вы думаете?

 

Спасибо

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Видел ли кто такое? Куда глядеть, как Вы думаете?

"Земля" нигде не разорвана ? Т.е., все ли абоненты шины имеют общую землю ?

Подтягивающие резисторы на линиях интерфейса есть ? Если да, то какого номинала ?

Возможно ли в порядке эксперимента заменить импульсный БП линейным или даже обычным аккумулятором ?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

"Земля" нигде не разорвана ? Т.е., все ли абоненты шины имеют общую землю ?

Подтягивающие резисторы на линиях интерфейса есть ? Если да, то какого номинала ?

Возможно ли в порядке эксперимента заменить импульсный БП линейным или даже обычным аккумулятором ?

Спасибо за ответ,

Земля вроде общая.

Резисторы 4.7К

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

импульсник - это абонент на I2C

Самодельный ? Если да, то насколько корректно он сделан, включая разводку ПП ? Можно ли его заменить, например, аккумулятором ?

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Самодельный ? Если да, то насколько корректно он сделан, включая разводку ПП ? Можно ли его заменить, например, аккумулятором ?

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

Смысл такой - моя плата связана по I2C с готовым модулем, содержащим 3 "рэка". Каждый рэк содержит 3 независимых импульсника. Каждый импульсник имеет I2C для чтения его параметров.

это я вообще описываю устройство. Я сейчас работаю только с одним рэком, внутри которого установлен только один импульсник.

Плата питается от отдельного лабораторного источника.

Подтягивающие резисторы установлены на плате, на ее питание 5В.

Сама проблема. Рэки есть 2-х типов.

Первый - каждый блок питания, входящий в рэк, имеет отдельный коннектор для подключения I2C, и соединение SCL, SDA выполнено отдельным внешним кабелем. С этим рэком проблем нет.

Второй тип рэка имеет один коннектор, и соединения SCL, SDA выполнены на внутренней печатной плате, в которую вставлены источники. Разводка этой платы мне не известна - но понятно, что соединения выполнены длинными дорожками на всю длину рэка (сантиметрое 40). Вот с этим типом рыка появляется проблема, что при чтении серии байтов - начиная с какого-то момента, я получаю "FF". Сннхронизируя скоп, я вижу, что перед этим произошел как-бы "clock stretching", т.е. положительный фронт клока как бы задержан на пол-периода... И видимо, начиная с этого момента, "slave" останавливает обмен, а мастер - ничего не подозревая, продолжает гнать клок, давать ACK и т.д.

Кстати, этот момент может наступить в совершенно случайном месте - например, при выдаче мастером адреса слэйва - тогда просто мастер, не получив ACK, завершает обмен по таймауту.

Мастер - процессор STM32F407.

Вот такая проблема...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Смысл такой - моя плата связана по I2C с готовым модулем, содержащим 3 "рэка". Каждый рэк содержит 3 независимых импульсника. Каждый импульсник имеет I2C для чтения его параметров.

это я вообще описываю устройство. Я сейчас работаю только с одним рэком, внутри которого установлен только один импульсник.

1. попробовать снизить скорость обмена по i2c

2. взять что-то типа i2c eeprom, привесить на ту же шины и посмотреть на поведение

3. в БП чипы точно слейвы? мало ли кто-то из них умеет мастерить..

4. как вариант - в разрыв поставить i2c levelshifter (типовая схема у филипса)

5. как радикальный - опторазвязку на i2c

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1. попробовать снизить скорость обмена по i2c

2. взять что-то типа i2c eeprom, привесить на ту же шины и посмотреть на поведение

3. в БП чипы точно слейвы? мало ли кто-то из них умеет мастерить..

4. как вариант - в разрыв поставить i2c levelshifter (типовая схема у филипса)

5. как радикальный - опторазвязку на i2c

Jury,

1. Не влияет

2. В БП имеется eeprom, все то же самое - при чтении начинает выдавать "ff"

3. Точно, eeprom AT24C02, register PCF8574, ADC PCF8591

 

3. в БП чипы точно слейвы? мало ли кто-то из них умеет мастерить..

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

я четко вижу вместо правильного фронта имеется спайк, т.е. процессор пытается поставить клок, но тут-же его снимает. Со стороны импульсника, этот спайк задавлен по амплитуде,
"Спайк" = "выброс"? В какую сторону этот выброс, он появляется на восходящем фронте? Не может этот выброс быть результатом сбоя или ошибки программы, из-за которого порт переходит на короткое время из режима I2C в режим обычного выхода? Сопротивления подтяжек можно уменьшить до 1 кОм, причем при ваших длинах наверное не только можно, но и нужно. Можно в разрыв линии включить резистор ом на 100 и глядя двумя лучами на оба его вывода будет хорошо видно - кто выдает какой сигнал и видны все конфликты.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

"Спайк" = "выброс"? В какую сторону этот выброс, он появляется на восходящем фронте? Не может этот выброс быть результатом сбоя или ошибки программы, из-за которого порт переходит на короткое время из режима I2C в режим обычного выхода? Сопротивления подтяжек можно уменьшить до 1 кОм, причем при ваших длинах наверное не только можно, но и нужно. Можно в разрыв линии включить резистор ом на 100 и глядя двумя лучами на оба его вывода будет хорошо видно - кто выдает какой сигнал и видны все конфликты.

Привет, Сергей!

Это ведь я, твой бывший рижский коллега, чего это мы на Вы?

Как там Эрик, привет ему! Как вы вообще?

По теме, да резистор влепить я не сообразил, спасибо - но вроде по уровню выброса понятно, откуда он.

Насчет перехода в режим обычного выхода - да, может быть. Просто, один и тот-же импульсник нормально читается в одном рэке, где соединения I2C выполнены внешним кабелем, и сбоит в другом рэке с внутренними соединениями. Чето тяжело представить в чем разница, кроме помех на линиях клока и данных, но я скопом особых помех не вижу...

 

В какую сторону этот выброс, он появляется на восходящем фронте?

Да, выброс - как бы вместо положительного фронта. Например, в самом начале сеанса - передается адрес слейва, уже начинает ставиться нужный бит даты (1), затем - выброс на клоке, и дата сбрасывается в 0, затем процесс продолжается - но уже с проглоченным битом

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

помех нет, левых мастеров на шине нет..

а что там с питанием слейвов, величина напряжения?

если 3в3, то остаются два варианта:

- баги в софте мастера (как предположили выше)

- развязка шины между блоками - опторазвязка (so-08) или левелшифтер на паре полевиков..

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Это ведь я, твой бывший рижский коллега, чего это мы на Вы?
Ремарыч? Сколько лет... Вот же совпадение - вспоминал тебя недавно. Остальное в личку напишу.

 

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

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ремарыч? Сколько лет... Вот же совпадение - вспоминал тебя недавно. Остальное в личку напишу.

 

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

 

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

Нет, все не так - дата пошла вверх (должен передаться 1), клок пошел вверх - т.е процессор отпустил стоки - и вдруг оба срываются в 0, т.е. на месте клока - короткий импульс, на месте даты - подлиннее. Но все нормально, т.е. никаких нестандартных единиц нет.

Чего это процессору вздумалось обрывать клок и дату - непонятно, вот с этим и разбираюсь...

Кстати, тут еше такое дело. Поскольку мне нужны были несколько (4) отдельных каналов I2C, я не мог обойтись только процессором, их там 3. Поэтому, я использую мультиплексер (хаб) PCA9518. T.e. канал I2C процессора идет на один из 5 каналов хаба (нулевой), а каналы 1,2,3,4 выбираются процессором при помощи просто дискретных входов разрешения на мультиплексере.

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

Я не упоминал о нем, поскольку он, вроде, не обладает никакими интеллектуальными функциями типа clock stretching или master.

Может, ты знаком с этой хренью?

 

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

 

помех нет, левых мастеров на шине нет..

а что там с питанием слейвов, величина напряжения?

если 3в3, то остаются два варианта:

- баги в софте мастера (как предположили выше)

- развязка шины между блоками - опторазвязка (so-08) или левелшифтер на паре полевиков..

 

Jury, а что вы имеете в виду, почему если 3.3, то только 2 причины? А если 5? У меня как раз 5!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Jury, а что вы имеете в виду, почему если 3.3, то только 2 причины? А если 5? У меня как раз 5!

а мастер на 3в3?

тогда однозначно шины надо изолировать..

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

google.ru->"philips i2c level shifter" наглядно в картинках

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

а мастер на 3в3?

тогда однозначно шины надо изолировать..

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

google.ru->"philips i2c level shifter" наглядно в картинках

Jury, понятно.

Но я использую между процессором и выходом платы мультиплексер (хаб) PCA9518, его выходной интерфейс питается 5В.

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Но я использую между процессором и выходом платы мультиплексер (хаб) PCA9518, его выходной интерфейс питается 5В.

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

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

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

4d68c69e84673d8d40727f39d907642b.jpg

 

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

 

"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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...