Files
beyon-motion/BM/softuart.py

57 lines
1.6 KiB
Python
Raw Permalink Normal View History

2026-03-31 13:10:37 +02:00
from machine import Pin
from rp2 import PIO, StateMachine, asm_pio
## ASM
@asm_pio(autopush=True, push_thresh=8, in_shiftdir=PIO.SHIFT_RIGHT, fifo_join=PIO.JOIN_RX)
def uart_rx_mini():
wait(0, pin, 0)
set(x, 7) [10]
label("bitloop")
in_(pins, 1)
jmp(x_dec, "bitloop") [6]
@asm_pio(sideset_init=PIO.OUT_HIGH, out_init=PIO.OUT_HIGH, out_shiftdir=PIO.SHIFT_RIGHT)
def uart_tx():
pull()
set(x, 7) .side(0) [7]
label("bitloop")
out(pins, 1) [6]
jmp(x_dec, "bitloop")
nop() .side(1) [6]
class UART:
def __init__(self, rx, tx, baudrate, id):
self.UART_BAUD = baudrate
self.PIO_RX_PIN = Pin(rx, Pin.IN, Pin.PULL_UP)
self.PIO_TX_PIN = Pin(tx, Pin.OUT, value=1)
self.smrx = StateMachine(id, uart_rx_mini, freq=8*self.UART_BAUD, in_base=self.PIO_RX_PIN, jmp_pin=self.PIO_RX_PIN)
self.smrx.active(1)
self.smtx = StateMachine(id + 1, uart_tx, freq=8*self.UART_BAUD, sideset_base=self.PIO_TX_PIN, out_base=self.PIO_TX_PIN)
self.smtx.active(1)
def deinit(self):
self.smrx.active(0)
self.smtx.active(0)
def write(self,s):
#self.smtx.put(bytes(s))
self.smtx.put(s)
return len(s)
def read(self):
z = []
for i in range(100):
buflen = self.smrx.rx_fifo()
if buflen:
for c in range(buflen):
z.append(self.smrx.get() >> 24)
return bytes(z)