I2C
先ほど、UART シリアル通信の形式を見ました。UART シリアルは、単純で、ほとんど太古の昔から使われているため、広く利用されています。(ホストデバイスが “TeleTYpe” に由来して “tty” と呼ばれることを覚えていますか? そう、そのことです。)この普及度と単純さにより、簡単な通信の手段として人気があります。
配線長 vs 信号品質に関するハードウェア上の制約と、正確にデコードすることの難しさのため、UART シリアルは通常、理想的な条件でも約 115200 ボー程度が上限です。UART シリアルポートは、帯域幅が低く(11.5KB/s)、レイテンシが高い(87µs/byte)という特徴があります。
UART シリアルはポイントツーポイントです。同じ配線に 3 台以上のデバイスを接続する方法はなく、また各配線の両端には専用のハードウェアデバイスが必要です。
良い知らせ(であると同時に悪い知らせ)として、組み込みの分野には、これらの制約を克服する、ハードウェア支援のシリアル通信プロトコルがたくさんあります。その一部はデジタルセンサーで広く使われています。
私たちが使っている micro:bit ボードには、2 つのモーションセンサー、つまり加速度計と磁力計が搭載されています。これら 2 つのセンサーは 1 つのコンポーネントにまとめられており、I2C バス経由でアクセスできます。
I2C は “EYE-SQUARED-CEE” と発音し、Inter-Integrated Circuit の略です。I2C は同期式のシリアル バス 通信プロトコルです。データをやり取りするために 2 本の線、データ線(SDA)とクロック線(SCL)を使います。クロック線は通信を同期させるために使われます。同期シリアルは、非同期シリアルよりも高速かつ高信頼で動作できます。I2C デバイスにはバスアドレスがあります。ハードウェア実装により、特定のデバイスに対してバイトを送信でき、同じ配線に接続された他のデバイスはこの通信を無視します。
I2C は controller/target モデルを使用します。controller は、target デバイスとの通信を開始し、主導するデバイスです。複数のデバイスを同じバスに同時に接続でき、それぞれが controller としても target としても振る舞うことを選べます。controller デバイスは、まず target アドレスをバスにブロードキャストすることで、特定の target デバイスと通信できます。このアドレスは 7 ビットまたは 10 ビット長です。controller が target との通信を開始すると、controller がその通信を終了するまで、controller と target 以外のデバイスはバス上で送信することを許されません。
NOTE “Controller/target” は以前は “master/slave” と呼ばれていました。文献やボード上のラベルでは、今でもその表記を見かけることがあります。この用語は現在、公式規格でも新しい文書でも非推奨ですが、私たちの nRF52833 部品向けの Nordic マニュアルや、一部の組み込み Rust ドキュメントでは使われています。
クロック線によって、どれくらいの速さでデータをやり取りできるかが決まります。MB2 I2C インターフェースは 100、250、400 Kbps の速度で動作できます。他のデバイスでは、さらに高速なモードも可能です。