from machine import Pin
from time import sleep_us
MOSI_PIN = 2
MISO_PIN = 3
SCLK_PIN = 4
CS_PIN = 5
mosi = Pin(MOSI_PIN, Pin.OUT)
miso = Pin(MISO_PIN, Pin.IN)
sclk = Pin(SCLK_PIN, Pin.OUT)
cs = Pin(CS_PIN, Pin.OUT)
HALF_PERIOD_US = 100
sclk.value(0)
cs.value(1)
mosi.value(0)
def spi_transfer_byte(tx_byte):
rx_byte = 0
cs.value(0)
sleep_us(HALF_PERIOD_US)
for bit_index in range(7, -1, -1):
out_bit = (tx_byte >> bit_index) & 1
mosi.value(out_bit)
sleep_us(HALF_PERIOD_US)
sclk.value(1)
in_bit = miso.value()
rx_byte = (rx_byte << 1) | in_bit
sleep_us(HALF_PERIOD_US)
sclk.value(0)
sleep_us(HALF_PERIOD_US)
cs.value(1)
mosi.value(0)
return rx_byte
def spi_transfer_string(text):
received_chars = []
for ch in text:
tx_byte = ord(ch)
if tx_byte > 127:
raise ValueError("Only ASCII characters are allowed")
rx_byte = spi_transfer_byte(tx_byte)
print(
"TX: 0x%02X RX: 0x%02X"
% (tx_byte, rx_byte)
)
received_chars.append(chr(rx_byte))
return "".join(received_chars)
print()
print("Software SPI Loopback")
print("---------------------")
print("SPI Mode 0")
print("CPOL = 0")
print("CPHA = 0")
print("Bit order = MSB First")
print()
print("MOSI = GP2")
print("MISO = GP3")
print("SCLK = GP4")
print("CS = GP5")
print()
while True:
text = input("Enter ASCII string: ")
if text == "":
print("Please enter at least one character.")
print()
continue
try:
received = spi_transfer_string(text)
print()
print("Sent :", text)
print("Received :", received)
if received == text:
print("Loopback test: PASS")
else:
print("Loopback test: FAIL")
print()
except ValueError as error:
print(error)
print()