readadc を理解するために MCP3208 の仕様を確認しておこう。


MCP3208資料(日本語)


mcp3208_1
図5-1 MCP3204 あるいはMCP3208 との通信


・通信を開始: CS:High⇒Low    ※デバイスとの通信開始するには CSを Lowに。
・スタートビット(1bit) CS:Low + Din:High で、受取る最初のクロックは、スタートビット
・制御ビット(4bit): 
      SGL/DIFF(1bit): [1]シングルエンドモード ・・・
                  [0]差動入力モード・・・
      D0,D1,D2(3bit): 使用入力チャネル ※今回 CH0 なので [0,0,0]

・アナログ入力のサンプリング開始は、開始ビット後、4 番目クロックUP。
・サンプリング終了は、開始ビット後、5番目のクロックDOWN


ここでプログラムの以下の部分(13~15行目)をみると

 commandout = adcnum
 commandout |= 0x18
 commandout <<= 3

adcnum は、CH0 を使用するので 0 。
加えることの 0x18 = 0001 1000 でスタートビットと制御ビットになる。

3bit 右からづらすと、
1100 0000

ここまで、
0
0001 1000
1100 0000
となった。


16    for i in range(5):
17        # LSBから数えて8ビット目から4ビット目までを送信
18        if commandout & 0x80:
19            GPIO.output(mosipin, GPIO.HIGH)
20        else:
21            GPIO.output(mosipin, GPIO.LOW)
22        commandout <<= 1
23        GPIO.output(clockpin, GPIO.HIGH)
24        GPIO.output(clockpin, GPIO.LOW)


1巡目の18行目では、
     1100 000
          & 論理積
     1000 000
=   1

になる。1巡目22行目で、1bitシフトして

   1 1000 0000

になって、2巡目に

   1 1000 000
          & 論理積
   0 1000 000
=    1

で、3巡目

  11 0000 000
          & 論理積
  00 1000 000
=     0

結果的に、5巡すると、1,1,0,0,0 になる。