PasocomMini MZ-80CでSPI通信の実験

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")


▲ラズパイ側の実行結果です。
無事に受信できました。