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があった場合、

xyor
111
101
011
000

どちらか片方が1である場合、演算後が1になる。

論理和 - Wikipedia


例えば、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の説明等でよく見られる論理和は

のように描かれる。