PasocomMini MZ-80CでSPI通信の実験をしてみました。
▲PasocomMiniとラズパイ3をジャンパーワイヤーで接続します。
ワイヤーのオスメスが合わなかったので、ブレッドボードで中継してます。
▲回路図です。PasocomMiniがSPI通信のマスターです。
ラズパイ3をスレーブにします。
▲SPI通信のタイミングです。タイミング設定は0にします。
▲PasocomMini側のプログラムはSPISENDという命令を呼ぶだけです。
通信速度はかなり遅めの4800clock/secにしました。
▲実行結果です。テスト用の文字を256バイト送信し続けます。
-
- -
以下、ラズパイ側のプログラムです。
マシンパワーにものを言わせて、強引にPythonを走らせてますので、ラズパイZeroでは処理速度が足りずうまく動きません。
ラズパイ3がおすすめです。
#spi recv by takuya matsubara import RPi.GPIO as GPIO import time PINCE = 31 PINCLK = 33 PINTX = 35 PINRX = 37 GPIO.setmode(GPIO.BOARD) GPIO.setup(PINTX ,GPIO.OUT) GPIO.setup(PINRX ,GPIO.IN) GPIO.setup(PINCLK ,GPIO.IN) GPIO.setup(PINCE ,GPIO.IN) time.sleep(0.01) #--- def spi1byte( senddat ): mask = 0x80 recvdat = 0 while (mask > 0): state = 0 if (senddat & mask):state = 1 GPIO.output(PINTX ,state) while 1: if (GPIO.input(PINCLK)==1):break if (GPIO.input(PINCE)==1):break #clk = rising if (GPIO.input(PINRX)): recvdat |= mask while 1: if (GPIO.input(PINCLK)==0):break if (GPIO.input(PINCE)==1):break #clk = falling mask = mask >> 1 #wend return recvdat #--- def spisendrecv( sendstr,bytecnt ): while 1: if (GPIO.input(PINCE)==1):break #ce = rising while 1: if (GPIO.input(PINCE)==0):break #ce = falling recvstr = "" for i in range(0,bytecnt): if sendstr=="": ch=0 else: ch=sendstr[i] #endif ret = spi1byte(ch); recvstr += chr(ret) while 1: if (GPIO.input(PINCE)==1):break #ce = rising return recvstr #---main print("start") while 1: buf = spisendrecv( "",256 ) print(buf) print("recv "+str(len(buf))+" Bytes")