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

STM32F0 I2C: то master то slave

У меня 3 платы, на каждой stm32f070, общая i2c шина. Они должны периодически обмениваться небольшим количеством данных - скажем раз в секунду до 64 байт. Моя идея сделать все 3 slave по умолчанию и слушать (с DMA?) каждый свой адрес. Тот кому надо сказать, становится мастером и говорит. Если вдруг 2 проснутся одновременно - мало вероятно, но возможно, один проиграет arbitration и выскажется потом. Я предпологаю заряжать DMA на 64, но если у мастера всего 4 байта, он выдаст стоп и будет STOPF interrupt. 

Кто нибуть такое подобное делал? Есть подводные камни?

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


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

13 минут назад, alexf сказал:

Кто нибуть такое подобное делал?

Делал мультимастер. Правда узлов было не 3, а 2.

И МК не F0, а F2 + F4. Но сути это не меняет, в общем-то.

 

13 минут назад, alexf сказал:

Есть подводные камни?

Не припоминаю.

Если ПО кривое - будут подводные камни.

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


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

10 hours ago, alexf said:

общая i2c шина
2 проснутся одновременно - мало вероятно, но возможно, один проиграет arbitration и выскажется потом
подводные камни?

а разве I2C допускает одновременное занятие шины мастерами, и вообще такая ситуация описана стандартом?
имхо нужно быть готовым к отслеживаю таких нештатных ситуаций, разбираться как периферия I2C в процессоре к ним отнесется, перепосылать данные etc

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


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

можно TokenRing на USART сделать, гарантия отсутствия коллизий и сразу определение неисправного модуля в кольце. К томуже не придется заморачиваться с адресацией. Добавление модуля простое.

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


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

3 часа назад, 1113 сказал:

а разве I2C допускает одновременное занятие шины мастерами...

Да, допускает.

 

3 часа назад, 1113 сказал:

и вообще такая ситуация описана стандартом?

Описана.

 

3 часа назад, 1113 сказал:

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

Поэтому я и написал - если ПО будет кривое, то и задумка не взлетит =)

STM32 сама умеет по потерянному арбитражу и некоторым другим условиям переходить из режима Master в Slave.

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


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

Как я понимаю, каждый мастер следит за шиной и если там 0 а он хотел 1, то значит проиграл и надо подождать и послать снова. Чего я не очень понал из мануала, так это "из режима Master в Slave".  То что перестает дергать шину, понятно. Но что именно значит переходить в slave? Разве что он начинает слушать по адресу общего вызова (0), если бит стоит? 

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


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

11 часов назад, alexf сказал:

То что перестает дергать шину, понятно. Но что именно значит переходить в slave? Разве что он начинает слушать по адресу общего вызова (0), если бит стоит? 

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

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

Проигравший (тот, что хотел выставить 1 на шину, а обнаружил там 0) перейдет в slave и не будет встревать в обмен до следующего ReSTART- или STOP-условия.

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

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


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

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

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

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

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

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

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

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

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

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