[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デバイスが着信コマンドに純粋に応答するか(これは「S1」MCUに適用されます-それらがスレーブになるのに最も適していることは明らかです)。
どの MCUがI 2 Cマスターになるかに関係なく、システムアーキテクチャ全体を設計し、各デバイスに送信する必要があるコマンドと、応答を受信する必要がある速さを考慮する必要があります。明白な「マスター」があり、すべてのシステム状態を知っているシステムを設計してみてください。そうすれば、それもI 2 Cマスターデバイスになる可能性があります。
あなたが言った:
S3はシステムの中心ですが、S2はS3よりも多くのメッセージを送信できます。
「S2」が誰にメッセージを送信しているかは不明です。誰かにメッセージを積極的に送信する必要がありますか?または、「S2」がI 2 Cマスターとして「S3」によってポーリングされ、「S2」が収集するセンサーおよびスイッチ情報を受信できますか?「S2」が「S3」によってポーリングできる場合、説明に基づいて、「S3」MCUがI 2 Cマスターである可能性があることは明らかであるように見えます。
さらに別の MCU(「S10」と呼ぶことにします)をI 2 Cマスターに追加することに注意します。これは、「S10」MCUは、「S3」がすべて知っている(?)全体的なシステム状態の知識を収集するためだけに、大量のポーリングを実行する必要があるためです。それは不必要な重複のようです。
したがって、「S3」がRAMスペース、フラッシュスペース、またはCPUサイクルなどの制限に達したためにジョブを実行できない場合を除き、「S3」にI 2 Cマスターを追加させるのではなく、I 2 Cマスターにすることでシステムを制御する方が簡単です。追加の「S10」コントローラー。
一方、複雑さを気にしない場合は、「S10」コントローラ全体を追加すると、システムのモジュール性(セグメンテーション)が向上します。「S3」は、Bluetoothとオーディオのみを実行するため、他には何も実行しません。これにより、「S3」のコードを変更する必要なく、新しい(予期しない)機能/ MCUを将来追加するための柔軟性が追加されます。