Behram 0 7 декабря, 2021 Опубликовано 7 декабря, 2021 · Жалоба Всем привет. Для работы с контроллерами двух последовательно соединенных батарей пришлось, для верхней батареи, использовать гальваноразвязанный I2C. В качестве изолятора выбран TI ISO1541D https://www.ti.com/lit/ds/symlink/iso1540.pdf После сборки устройства выяснилось, что I2C для верхней батареи работает некорректно, мастер (STM32F413CGU6) не видит ACK от слейва (BQ40Z80). Начал разбираться, оказалось, что между мастером и изолятором есть странное состояние шины, при котором напряжение на SDA равно примерно 600 мВ. В даташите на изолятор сказано, что "Low-level output voltage, SDA1 and SCL1" равно от 650 до 800 мВ. Действительно ли в этом дело? Может ли этот уровень мастер интерпретировать как "1" на линии? Сигналы на экране осциллографа: желтый - SDA slave, зеленый - SLC slave, синий - SDA master. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 131 8 декабря, 2021 Опубликовано 8 декабря, 2021 · Жалоба 1. Судя по описанию на ISO1541D, да - низкий уровень это 0.65...0.8В Цитата When the I 2C bus drives SDA2 low, SDA1 follows after a certain delay in the receive path. The output low is the buffered output of VOL1 = 0.75 V, which is sufficiently low to be detected by Schmitt-trigger inputs with a minimum input-low voltage of VIL = 0.9 V at 3 V supply levels. 2. Максимальное значение напряжения, при котором МК все еще воспринимает его как лог. 0, судя по даташиту, есть 0.3*3.3 = 0.99В. Следовательно, на первый взгляд дело не в уровнях напряжений. Меня больше смущают "рога" на ACK. На таких рогах не исключено, например, что slave словит какой-нибудь повторный старт или принудительный стоп. И еще: в RM на STM32 есть описание, как настраивать фильтры и схемы цифровой задержки - очень рекомендую заострить на этом внимание, если этого сделано не было. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Zig 31 8 декабря, 2021 Опубликовано 8 декабря, 2021 · Жалоба Сделайте так, чтобы SDA менялась не по спаду SCL, а после спада, например в середине '0' на SCL. Сам нарывался на такое. Долго ломал голову, пока не перечитал стандарт. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Behram 0 8 декабря, 2021 Опубликовано 8 декабря, 2021 · Жалоба Похоже, дело не в этом. Каким-то образом, в процессе передачи первого байта (запись адреса регистра) слейв притягивает клок к нулю. Из-за того, что изолятор клока однонаправленный, мастер не видит притянутого клока и фигачит данные дальше. Перечитал интернеты про I2C, выяснил, что если слейв не успевает передавать данные, он может притянуть клок к нулю, приостановив работу мастера. Заказал ISO1540, с двунаправленным клоком, впаяю и посмотрю что будет. 6 часов назад, Arlleex сказал: что slave словит какой-нибудь повторный старт или принудительный стоп. На осциллограмме передача адреса, рога это ACK слейва. Просто смутило, что точно такой же слейв в нижнем плече, без изолятора, работает отлично. А про фильтры спасибо, посмотрю что можно накрутить чтобы они точно не мешали. 4 часа назад, Zig сказал: Сделайте так, чтобы SDA менялась не по спаду SCL, а после спада, например в середине '0' на SCL. Сам нарывался на такое. Долго ломал голову, пока не перечитал стандарт. Попробую. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 184 8 декабря, 2021 Опубликовано 8 декабря, 2021 · Жалоба 3 минуты назад, Behram сказал: Похоже, дело не в этом. Каким-то образом, в процессе передачи первого байта (запись адреса регистра) слейв притягивает клок к нулю. Из-за того, что изолятор клока однонаправленный, мастер не видит притянутого клока и фигачит данные дальше. Перечитал интернеты про I2C, выяснил, что если слейв не успевает передавать данные, он может притянуть клок к нулю, приостановив работу мастера. Это называется "clock stretching". 3 минуты назад, Behram сказал: Заказал ISO1540, с двунаправленным клоком, впаяю и посмотрю что будет. Зря. Если причина именно в этом, то достаточно просто понизить скорость I2C. Чтобы slave успевал. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Behram 0 8 декабря, 2021 Опубликовано 8 декабря, 2021 · Жалоба Выставил 10 кБит/сек - поведение ровно то же, слейв притягивает клок к нулю. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 184 8 декабря, 2021 Опубликовано 8 декабря, 2021 · Жалоба 2 минуты назад, Behram сказал: Выставил 10 кБит/сек - поведение ровно то же, слейв притягивает клок к нулю. Значит нужно ещё меньше. Контроллеру батареи думаю большие скорости ни к чему. PS: Если "clock stretching" на границе байта, то ещё можно просто в этом месте поставить задержку при передаче. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 131 8 декабря, 2021 Опубликовано 8 декабря, 2021 · Жалоба Ну посмотрите, насколько (по длительности) slave тянет SCL. Вот с запасом меньшую частоту и используйте как рабочую. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Behram 0 11 декабря, 2021 Опубликовано 11 декабря, 2021 · Жалоба Удивительно, но даже выставив битрейт 100 бит/с, поведение слейва ровно такое же. Если посмотреть осциллограмму с рабочего канала, подключённого просто через буфер то, по прикидкам, даже на 5 кбит/с все должно работать. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Jury093 2 11 декабря, 2021 Опубликовано 11 декабря, 2021 · Жалоба 17 минут назад, Behram сказал: Удивительно, но даже выставив битрейт 100 бит/с, поведение слейва ровно такое же. Если посмотреть осциллограмму с рабочего канала, подключённого просто через буфер то, по прикидкам, даже на 5 кбит/с все должно работать. похоже на конфликт слейвов на шине или мультимастеринг. какая у вас топология подключения? stm32 дальше мультиплексор и пара bq40z80? еще что-то на шине есть? если работать отдельно, физически отключив по очереди каждую bq40z80, то ошибки уходят? bqstudio через адаптер все время подключена или отключаете? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
novsys 0 12 декабря, 2021 Опубликовано 12 декабря, 2021 · Жалоба Скорее всего это замечание вам не поможет но всетаки скажу. Мы много раз использовали ISO1540 и ISO1541 и не имели никаких приключений. Причем между двумя процессора и они менялись ролями в одном из изделий. Во всех случаях на шинах висели только резисторы и чипы. А у вас я вижу защитный диод. Он имеет емкость. Попробуйте его удалить. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Plain 168 12 декабря, 2021 Опубликовано 12 декабря, 2021 · Жалоба 08.12.2021 в 16:07, Behram сказал: Заказал ISO1540 Каналы одинаковые, поэтому проверить можно парой ISO1541, но ИС откровенная халтура. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Behram 0 13 декабря, 2021 Опубликовано 13 декабря, 2021 · Жалоба 11.12.2021 в 14:42, Jury093 сказал: какая у вас топология подключения? stm32 дальше мультиплексор и пара bq40z80? Канал без изоляции: STM32-I2C1 -> BMX160 на плате -> буфер на плате -> bq40z80 на 20 см кабеле. Канал с изоляцией: STM32-I2C2 -> изолятор на плате -> bq40z80 на 20 см кабеле. 11.12.2021 в 14:42, Jury093 сказал: bqstudio через адаптер все время подключена или отключаете? Отключен, конечно. 21 час назад, novsys сказал: Попробуйте его удалить. Уже удалил, но такой же защитный диод стоит на неизолированном канале и всё работает. 20 часов назад, Plain сказал: Каналы одинаковые, поэтому проверить можно парой ISO1541, но ИС откровенная халтура. Штош, осталось только дождаться 1540. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Plain 168 13 декабря, 2021 Опубликовано 13 декабря, 2021 · Жалоба 15 минут назад, Behram сказал: осталось только дождаться 1540 Вы покупаете комплектацию для опытов без запаса? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Jury093 2 13 декабря, 2021 Опубликовано 13 декабря, 2021 · Жалоба 56 минут назад, Behram сказал: Канал без изоляции: STM32-I2C1 -> BMX160 на плате -> буфер на плате -> bq40z80 на 20 см кабеле. Канал с изоляцией: STM32-I2C2 -> изолятор на плате -> bq40z80 на 20 см кабеле. Отключен, конечно. ок. тогда дальше очевидные действия: - поменять каналы i2c1-i2c2 местами, ошибки остались - проблемы на стороне stm32, иначе - проблема на шлейфе с изолятором - врезать изолятор в исправный канал, ошибки появились - пора подбирать другой изолятор Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться