Есть ли правило, чтобы определить, кто будет [I 2 C] раб / хозяин?
Да. Только мастер I 2 C может начать передачу. Ведомый I 2 C не может рассказать вам о чем-либо, пока он не будет опрошен ведущим (если вы не добавите дополнительные сигналы прерывания, что увеличивает общую сложность системы).
Игнорирование (редко используемой) функции переключения устройства между ведущим и ведомым устройствами означает, что мастер I 2 C должен обладать достаточными знаниями об общей системе , чтобы знать, как взаимодействовать со всеми I 2 C рабы в этом автобусе.
Какой вопрос я должен задать себе, чтобы сделать правильный выбор? (в общем, не для этой конкретной системы)
Подумайте, какой MCU в вашей системе знает:
- больше всего об общем состоянии системы, и поэтому может решить, когда отправлять команды I 2 C на ведомые устройства;
- какие команды I 2 C необходимо отправить каждому ведомому устройству;
- какие данные необходимо собрать от каждого ведомого I 2 C;
- какие устройства I 2 C просто отвечают на входящие команды (это будет применяться к вашим MCU "S1" - кажется очевидным, что они наиболее подходят для того, чтобы быть подчиненными);
Независимо от того, какой MCU будет ведущим I 2 C, вам необходимо спроектировать общую архитектуру системы и определить, какие команды нужно отправлять на каждое устройство, и как быстро нужно получать ответы. Попытайтесь спроектировать систему, которая имеет очевидный «мастер» и знает все состояние системы, и тогда она, вероятно, также может быть ведущим устройством I 2 C.
Вы сказали:
S3 является центром системы, но, с другой стороны, S2 может отправлять больше сообщений, чем S3.
Не ясно , кто «S2» отправляет сообщения в . Нужно ли активно отправлять сообщения кому-либо ? Или «S2» может опрашиваться «S3» как ведущий I 2 C, чтобы получить информацию о датчике и переключателе, которую собирает «S2»? Если «S2» может опрашиваться «S3», то, исходя из описания, очевидно, что MCU «S3» может быть мастером I 2 C.
Я осторожно добавляю еще один MCU (назовем его «S10») в качестве мастера I 2 C. Это потому, что кажется, что MCU "S10" должен был бы сделать много опросов, просто чтобы собрать общие знания о состоянии системы, которые все (?) Уже известны "S3". Это кажется ненужным дублированием.
Поэтому, если «S3» не может выполнить эту работу из-за достижения своих пределов пространства ОЗУ, флэш-памяти или циклов ЦП и т. Д., Может быть менее сложным иметь «S3» для управления системой, сделав ее ведущим I 2 C, вместо добавления дополнительный контроллер "S10".
С другой стороны, если вы не возражаете против дополнительной сложности, добавление общего контроллера «S10» увеличивает модульность (сегментацию) системы, поскольку «S3» тогда выполняет только Bluetooth и аудио - больше ничего. Это может обеспечить дополнительную гибкость для добавления новых (непредвиденных) функций / дополнительных MCU в будущем без необходимости изменения кода в «S3».