はじめに
この記事は株式会社ビットキー Advent Calendar 2022 1日目の記事です。
本日(初日!!)は @hu11911が担当します。よろしくお願いたします。
(この記事は主に組み込みエンジニア向け記事です。
しかし、基本的な内容ですのでそれ以外の方も読みやすいかと思います。)
最後まで楽しく読んでいただければ幸いです。
自己紹介
まずは私の自己紹介から。
現職では組み込みソフトの設計開発を行っています。C言語を使って設計しています。
その中でも、市場リリース済みの既存製品の保守や機能追加が主な担当です。
(周りを見渡す。どうやら組み込みソフトエンジニアはQiitaではあまり生息していないようだ。)
前職は半導体製造装置メーカーで制御ソフトエンジニアでした。
そこから約4年半、半導体製造装置業界という、何やら不可思議な業界に身を置いておりました。
ロジックやメモリメーカー様向けに商売をしてまして、世に言う半導体不足の一端を担っておりました。
半導体不足すぎて、お客様の半導体部品を作るための装置が、そのお客様の半導体部品が納品されないため製造が進まないという一種のデッドロック状態に陥ったりしておりました。(社員個人個人はベストを尽くしておりました)
前職ではC++やC、UI設計もやっていたのでJavaScriptとHTML/CSSなんかも。あと、VBAですね。
Windowsアプリケーション開発が主な業務で、あとはマイコン上の会社独自OSにおけるアプリケーション設計とか行なっていました。
1992年千葉県生まれです。
と言いつつ、思春期は学校生活を含めてほとんどの生活を東京で過ごしてきました。
しかし、大学時代ぐらいからやっと千葉県の良さを感じることができました。
おすすめの観光地は養老渓谷と東京ディズニーシーです。
前置きが長くなってしまいましたが、いよいよ本題に移ります。
組み込みの通信規格"きほんのき" の前に...
早速本題。と思ったのですが、その前にこの記事を書こうと思った背景をお話しします。
組み込みの通信規格知らない
これは問題です。
今までの経験からも通信規格の基本を理解をしないと痛い目にあうのはわかっています。
自己紹介にも書いた通り、前職では制御ソフトの設計開発を行なっていました。
入社当時はこう思っていました、ソフトの知識とプラスアルファでモータやバルブの理解さえとかしてれば良いか、と。
しかし、いろいろな痛い目にあう中でそれは勘違いということがわかります。
モータやバルブの知識とさらに通信の知識も必須でした。
まず、PC同士の通信はTCP/IP。
そのTCP/IP上で実装された会社独自のプロトコルでプロセス同士がメッセージのやり取りをしていました。
TCP/IPの理解はもちろん、ソケット通信、プロセス間通信そして会社独自プロトコルの理解が必須でした。
あとは、UIとしてWEBブラウザを採用していたのでWEBソケットの理解。
モータ制御に最適化されたリアルタイム性重視の産業用通信プロトコルの理解も必要です。例としてEtherCAT、RTEXなどです。
あとは、RS-485、RS-232Cなどのシリアル通信のインターフェースとその上に実装された独自プロトコルなど。
通信まみれ。それだけレイヤーが多く存在していたということです。
現職になってから、これらの通信知識が直接活かせる場面はまだありません。
(今まで仲良くしてきたのでちょっともの寂しいような。)
とはいえ入社から数ヶ月、やはり組み込みソフトでも通信規格の理解は重要だ、とひしひしと感じてきました。
人は過ちを繰り返す。同じ轍を踏みたくない。転ばぬ先の杖。
良い機会なので組み込み領域における通信規格を"きほんのき"から調べてみました。
(初心を忘れず。全力投球!オー!)
組み込み領域の通信規格"きほんのき"
- そもそもプロトコルって何?
- シリアル通信とは?
- よく使われる組み込み領域の通信規格
- SPI
- I2C
- UART
そもそもプロトコルって何?
呼吸をするようにプロトコルと連呼しておりましたが、そもそものこいつ何者なのでしょう。
元々のプロトコルの意味は、儀礼や典礼、議定書だそう。
現在では、以下の意味で使われています。
プロトコルとは、コンピュータでデータをやりとりするために定められた手順や規約、信号の電気的規則、通信における送受信の手順などを定めた規格を意味します。異なるメーカーのソフトウエアやハードウエア同士でも、共通のプロトコルに従うことによって、正しい通信が可能になります。
(https://www.keyence.co.jp/ss/general/iot-glossary/protocol.jsp より引用)
"通信プロトコル"とつけば、通信する上ので取り決めや約束事ということですね。
例として、ピンアサイン、データ形式、パケット構成、同期の取り方、エラー処理などがプロトコルとして取り決められます。
もちろん、レイヤーによってどこまでをプロトコルとして定めるのかは異なります。
プロトコルさえ守っていれば異なるメーカー同士がデバイス内部の詳細な仕様を知らなくてもデータのやり取りができるわけです。
これは便利!
なるほど、プロトコルについてはわかりました。(コーヒーをすする。)
次に通信について調べる中で、よく見た言葉がシリアル通信です。
シリアル通信とは?
そもそもシリアル通信とはなんでしょう。
シリアル通信:1つのデータ伝送路を使い。1ビットずつデータを送信する方式
パラレル通信:複数の伝送路を使い、1度に複数のデータを送信する方式
(https://emb.macnica.co.jp/articles/8191/)より引用
1ビットずつ送ると聞くとなにやら原始的に見えます。
しかし、その単純さゆえパラレル通信と比べ線が少なく済みます。
この利点からノイズに強く、同期も取りやすく、それゆえ長距離通信もいける。
これらがシリアル通信が多くの規格で採用されている所以でしょう。
シリアル通信に関しては組み込み/制御関係なくよく耳にします。
例えばご存知のUSBなんかもUniversal Serial Busと読んで字の如く、シリアル通信を採用しています。
先の述べた規格の多くもシリアル通信です。(RS-485、Ethernetなど)
このことからも、多くの規格がシリアル通信を採用していることがわかります。
一方でパラレル通信は通信速度がシリアル通信よりも早いことが理論上の利点です。
これは、1クロックで複数の線から同時にデータが取れるためです。
が、技術の発展により最近ではシリアル通信の速度も速くなってきています。
悲しいかなパラレル通信の唯一の利点もあまり活かされなくなってきました。
パラレル通信の規格ってなんだっけ...というレベルで普及はしていないのが現状です。
(パラレル通信の規格を5つ答えよ、と問われても答えられない。)
完全に余談ですが、Serial(シリアル)は連続の意味ですが、Cereal(シリアル)は穀物です。
ホテルの朝食バイキングにあるとCOOLなのがCereal食品ですね。ドライフルーツも入ってると尚良し。
基礎が固まったところで、具体的に組み込み領域でよく使われる通信規格を調べてみます。
組み込み領域の通信規格(SPI、I2C、UART)
手始めに社内ひいては世の中にあるデバイスの製品概要仕様書をまじまじと読んでみます。
すると、以下の3つの通信規格がよく出てくることがわかりました。
- SPI
- I2C
- UART
組み込み通信規格の御三家、三銃士です。
この三つさえ理解すれば"きほんのき"までは押さえられそうです。
一つづつ見ていきましょう。
SPI
SPIはシリアル通信の規格で、Serial Peripheral Interfaceの略です。
SPIは同期式の全二重のマスタスレーブ型の通信です。はて、全二重?マスタスレーブ?
この辺りの説明を理解するために、SPIの通信線を見てみます。
SPIデバイスには4つの信号線があります。
・クロック(SPI CLK、SCLK)
・スレーブ・セレクト(SS)
・マスタ出力/スレーブ入力(MOSI)
・マスタ入力/スレーブ出力(MISO)
クロック生成する側をマスタ、クロックを受け取る側をスレーブと呼びます。
上記のマスタスレーブ型というのはここからきています。
そして、クロックの立ち上がり/立ち下がりエッジによって同期をとっています。
全二重とは一つの通信路でデータを送る方向は一方通行の通信だけ、という方式です。
SPIでは出力と入力が二つに分かれているので全二重です。
スレーブ・セレクト(SS)はマスタからスレーブへデータを送る線で、マスタが通信したいスレーブにLOWを入力します。
送受信の対象から切り離す場合はHIGHを入力します。
このスレーブ・セレクトのラインにより、単一のマスタと複数のスレーブ間でのデータの送受信が可能になります。
デバイスによってはチップ・セレクト(CS)と表記されている場合もあります。
内容は理解できましたが、これだけだとSPIの立ち位置がわかりません。
続いて、I2Cについて見てみます。
I2C
I2CはInter-Integrated Circuitの略で、同期式の半二重のマスタスレーブ型の通信。
名前からはわかりませんが、こちらもシリアル通信の一種です。
一部の仕様書では、TWI(Two-Wire serial Interface)とも言われています。
TWIの方がどんな通信か名前からわかりやすいですね。
I2Cの信号線は2つで、一つは送受信、もう一つはクロック信号です。
SPIと同じく、クロック信号の線がI2Cにもあります。
こちらもマスタ/スレーブの概念があり、SPIと同じですね。
信号線の違いとしてはSPIでは4本だった信号線がI2Cでは2つのみという点が挙げられます。(1/2倍です1/2倍)
まず、スレーブ・セレクトがありません。
その代わりにI2Cではマスタからのデータにスレーブのアドレス(7bit or 10bit)が含まれます。
スレーブは送られたアドレスと自分自身のアドレスを比較して、一致すればマスタとのデータの送受信を行います。
なので、I2CでもSPIと同じく単一マスタと複数スレーブのシステムを組めます。
さらにI2Cは複数マスタと複数スレーブのシステムにも対応しています。
マスタは送受信のラインを監視することで、マスタ同士のデータの衝突を防ぎます。
他のマスタが送受信中は、自身の送受信を行いません。
ただし、マスタにはアドレスがないので、マスタ同士の送受信には対応していません。
さらにSPIでは送信受信で別々になっていた線も、I2Cでは送受信で1つの線となっています。
このように送受信で一つの信号線で行う方式が半二重方式です。
トランシーバーをイメージしていただければわかりやすいですね。こちらは無線ですが、半二重という点では同じです。
通信路を送受信で共有しているため、一方が話している(=送信している)間は受信側は話すことができません。
「・・・です。どうぞ」と相手の応答を仰ぐのは、このためです。
I2Cの利点は、複雑な配線を回避して双方向のデータのやり取りを実現できることです。
SPIと比べても通信線が4→2となっているので、SPIより実装が容易です。
一方の欠点として、SPIと比べると通信速度は劣ります。先述の通り、半二重であることがこれに起因します。
少ない通信線が、メリットでありデメリットでもあるわけです。
UART
最後にUARTです。
こちらはUniversal Asynchronous Receiver/Transmitterの略。非同期の全二重方式です。
信号線は送信(Tx)と受信(Rx)の2本のみです。
送信受信が分かれているのでSPIと同じく全二重ですね。
送信(Tx)と受信(Rx)・・・おや、何か足りない気がします。
クロック信号がありません!
先のSPIやTWIと異なり、クロック信号がないことがUARTの特徴です。
それゆえUARTはAsynchronous(非同期)な通信規格なのです。
UARTにはクロック信号がないため、通信する前に送受信デバイス両方で同一のボーレートを設定する必要があります。
ボーレートはいわゆるbps(bit per sec)で、1秒あたりの最大転送ビット数を表しています。
(厳密にはボーレートは一秒間に行われる変調レートを表していてbpsとは異なります。
が、シリアル通信では同義と捉えて差し支えないです。)
そして、送信開始/終了もクロック信号がないためデータラインの立ち下がり/立ち上がりエッジで判定されます。
UARTはSPIの全二重方式とI2Cの信号線の少なさをまさにいいとこ取りをした規格のように見えます。
しかし、ボーレートの設定が同一でなかった場合に送受信のタイミングがずれてしまうというデメリットがあります。
逆にいうと、ボーレートの設定さえ同一であれば信号線の少ない全二重を採用した通信としてその力を発揮してくれます。
さらに、マスタスレーブの関係がないため、単一のデバイス同士のやり取りのみ対応しています。
通信規格まとめ
ここまでの3つの規格のざっくりまとめです。
規格 | SPI | I2C(TWI) | UART |
---|---|---|---|
信号線の本数 | 4 | 2 | 2 |
双方向通信 | 全二重 | 半二重 | 全二重 |
同期/非同期 | 同期 | 同期 | 非同期 |
クロック信号 | あり | あり | なし |
システム | 単一マスタ/複数スレーブ | 複数マスタ/複数スレーブ | 単一デバイス/単一デバイス |
特徴 | I2Cよりも速い通信速度 | 複雑な配線の回避 | ボーレートの設定が必須 |
おわりに
いかがだったでしょうか。
組み込み領域におけるシリアル通信規格の"き"を押さえられましたでしょうか。(コーヒカップをおく。)
この辺りの技術は当たり前すぎて読み飛ばしがちですが、今一度じっくりと調べてみると奥が深い。
立ち返ってあえて基本を深く掘っていくことは、新鮮な気持ちですね。
知っているつもりで、ずるずる社会人歴を積み重ねていくのなかなかにリスキーです。
むしろ「ああ、シリアル通信ね?知ってるけど知らないような気がします。」みたいな中途半端なのが一番危険です!
無常の風は時を選ばず。
ぜひ、ふとした時に業務の中できほんのきの大切さを思い出していただければと思います。
(よし、まとまったな!とガッツポーズ。)
ここまでお読みいただきありがとうございます!
2日目は、@qiita-de-giidaが担当します。
引き続き株式会社ビットキー Advent Calendar 2022をお楽しみください!
参考資料
Analog-Dialogue SPIの基本を学ぶ
https://www.analog.com/jp/analog-dialogue/articles/introduction-to-spi-interface.html
Analog-Dialogue UART――多様な非同期通信に対応可能なハードウェア通信プロトコル
https://www.analog.com/jp/analog-dialogue/articles/uart-a-hardware-communication-protocol.html
IO-DATA Raspberry Pi 4 Model B(UD-RP4Bシリーズ) 仕様
https://www.iodata.jp/product/pc/raspberrypi/ud-rp4b/spec.htm
Macnica よく分かる! シリアル通信基礎講座
https://emb.macnica.co.jp/articles/8191/
DENGYO 無線通信に必要な変調技術
https://www.den-gyo.com/labo/kouza/radio03.html
Rohm インターフェースの選び方
https://www.rohm.co.jp/electronics-basics/memory/memory_what7
Nordic semiconductor Products
https://www.nordicsemi.com/Products