UARTについてを知る4までの記事でUARTについて触れた。
UARTのAが非同期という意味があり、非同期の理解を深める為には同期の理解を深める必要があり、
同期の方にRaspberry PiにPH4502Cを繋いでみたの記事で触れたSPIがある。
上記の記事ではGPIO Zeroという複雑な手続き無しで、SPI経由でAD変換器の値を受け取った。
この時の記事で
/************************************************/
ラズパイ4対応 カラー図解 最新 Raspberry Piで学ぶ電子工作 作る、動かす、しくみがわかる! - ブルーバックスシリーズの特設ページの本には、GPIO Zeroを用いないでMCP3208を使用するコードが記載されているが、現時点での知識レベルではコードの理解が出来なかった。
/************************************************/
と記載したが、本のコードを解読すれば、SPIの理解が進むので、挑戦してみることにした。
コードの詳細に触れる前に、ざっくりと挙げておくと、16進法の値とシフト演算が使われていた。
例えば、
n = 0 cmdout = n cmdout |= 0x18 cmdout <<= 3
上記のようなコードがある。
※変数名は略した
各行でのコードを確認してみたら、
cmdout |= 0x18
の後は24で
cmdout <= 3
の後は192であった。
上から順に見ていくことにするので、最初は |= の方の意味を調べる。
| は論理和 (OR)の演算子になっている。
論理和は2進法の二つの入力値のxとyがあった場合、
x | y | or |
---|---|---|
1 | 1 | 1 |
1 | 0 | 1 |
0 | 1 | 1 |
0 | 0 | 0 |
どちらか片方が1である場合、演算後が1になる。
例えば、5 (0b101)と 2(0b010)の論理和を求めてみると
※頭文字に0bを付けると2進数の表現になる。
x = 5 # 101 y = 2 # 010 t = x | y print(t) print(bin(t))
実行結果は7 (0b111)になる。
分かりやすく数値を縦に並び替えてみたら下記になる。
# 101 | 010 101 or 010 ------------ 111
cmdout |= 0x18
のコードを見てみると、cmdoutには元々 0 という値が格納されていた。
0x18を二進数にすると 00011000 であるため、
# 00000000 | 00011000 00000000 or 00011000 ----------------- 00011000
になり、10進数では24 + 23 = 16 + 8 = 24 になる。
ちなみにCPUの説明等でよく見られる論理和は
のように描かれる。