alexf 0 15 мая, 2020 Опубликовано 15 мая, 2020 · Жалоба У меня 3 платы, на каждой stm32f070, общая i2c шина. Они должны периодически обмениваться небольшим количеством данных - скажем раз в секунду до 64 байт. Моя идея сделать все 3 slave по умолчанию и слушать (с DMA?) каждый свой адрес. Тот кому надо сказать, становится мастером и говорит. Если вдруг 2 проснутся одновременно - мало вероятно, но возможно, один проиграет arbitration и выскажется потом. Я предпологаю заряжать DMA на 64, но если у мастера всего 4 байта, он выдаст стоп и будет STOPF interrupt. Кто нибуть такое подобное делал? Есть подводные камни? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 131 15 мая, 2020 Опубликовано 15 мая, 2020 · Жалоба 13 минут назад, alexf сказал: Кто нибуть такое подобное делал? Делал мультимастер. Правда узлов было не 3, а 2. И МК не F0, а F2 + F4. Но сути это не меняет, в общем-то. 13 минут назад, alexf сказал: Есть подводные камни? Не припоминаю. Если ПО кривое - будут подводные камни. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
1113 5 16 мая, 2020 Опубликовано 16 мая, 2020 · Жалоба 10 hours ago, alexf said: общая i2c шина 2 проснутся одновременно - мало вероятно, но возможно, один проиграет arbitration и выскажется потом подводные камни? а разве I2C допускает одновременное занятие шины мастерами, и вообще такая ситуация описана стандартом? имхо нужно быть готовым к отслеживаю таких нештатных ситуаций, разбираться как периферия I2C в процессоре к ним отнесется, перепосылать данные etc Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
k155la3 26 16 мая, 2020 Опубликовано 16 мая, 2020 · Жалоба можно TokenRing на USART сделать, гарантия отсутствия коллизий и сразу определение неисправного модуля в кольце. К томуже не придется заморачиваться с адресацией. Добавление модуля простое. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 131 16 мая, 2020 Опубликовано 16 мая, 2020 · Жалоба 3 часа назад, 1113 сказал: а разве I2C допускает одновременное занятие шины мастерами... Да, допускает. 3 часа назад, 1113 сказал: и вообще такая ситуация описана стандартом? Описана. 3 часа назад, 1113 сказал: нужно быть готовым к отслеживаю таких нештатных ситуаций, разбираться как периферия I2C в процессоре к ним отнесется... Поэтому я и написал - если ПО будет кривое, то и задумка не взлетит =) STM32 сама умеет по потерянному арбитражу и некоторым другим условиям переходить из режима Master в Slave. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
alexf 0 16 мая, 2020 Опубликовано 16 мая, 2020 · Жалоба Как я понимаю, каждый мастер следит за шиной и если там 0 а он хотел 1, то значит проиграл и надо подождать и послать снова. Чего я не очень понал из мануала, так это "из режима Master в Slave". То что перестает дергать шину, понятно. Но что именно значит переходить в slave? Разве что он начинает слушать по адресу общего вызова (0), если бит стоит? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 131 17 мая, 2020 Опубликовано 17 мая, 2020 · Жалоба 11 часов назад, alexf сказал: То что перестает дергать шину, понятно. Но что именно значит переходить в slave? Разве что он начинает слушать по адресу общего вызова (0), если бит стоит? Нет. Просто заставит того, кто проиграл арбитраж, заткнуться до лучших времен. Если несколько мастеров начали передавать одновременно (вот прям вообще бит в бит), то передавать будут до первого разногласия. Проигравший (тот, что хотел выставить 1 на шину, а обнаружил там 0) перейдет в slave и не будет встревать в обмен до следующего ReSTART- или STOP-условия. Насколько я понял, разрешение коллизий будет вестись по всему кадру, а не только по адресу. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться