Skip to content

Commit a072ab0

Browse files
authored
Merge pull request #18 from adafruit/jepler-rxuart-example
rxuart: Receive-only 8N1 UART
2 parents 3046ca3 + d51f129 commit a072ab0

File tree

1 file changed

+59
-0
lines changed

1 file changed

+59
-0
lines changed

examples/rxuart.py

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
# SPDX-FileCopyrightText: 2021 Jeff Epler, written for Adafruit Industries
2+
#
3+
# SPDX-License-Identifier: MIT
4+
5+
import rp2pio
6+
import adafruit_pioasm
7+
8+
code = adafruit_pioasm.assemble(
9+
"""
10+
.program uart_rx_mini
11+
12+
; Minimum viable 8n1 UART receiver. Wait for the start bit, then sample 8 bits
13+
; with the correct timing.
14+
; IN pin 0 is mapped to the GPIO used as UART RX.
15+
; Autopush must be enabled, with a threshold of 8.
16+
17+
wait 0 pin 0 ; Wait for start bit
18+
set x, 7 [10] ; Preload bit counter, delay until eye of first data bit
19+
bitloop: ; Loop 8 times
20+
in pins, 1 ; Sample data
21+
jmp x-- bitloop [6] ; Each iteration is 8 cycles
22+
23+
"""
24+
)
25+
26+
27+
class RXUART:
28+
def __init__(self, pin, baudrate=9600):
29+
self.pio = rp2pio.StateMachine(
30+
code,
31+
first_in_pin=pin,
32+
frequency=8 * baudrate,
33+
auto_push=True,
34+
push_threshold=8,
35+
)
36+
37+
@property
38+
def timeout(self):
39+
return 0
40+
41+
@property
42+
def baudrate(self):
43+
return self.pio.frequency // 8
44+
45+
@baudrate.setter
46+
def baudrate(self, frequency):
47+
self.pio.frequency = freqency * 8
48+
49+
@property
50+
def in_waiting(self):
51+
return self.pio.in_waiting
52+
53+
def read(self, n):
54+
b = bytearray(n)
55+
n = self.pio.readinto(b)
56+
return b[:n]
57+
58+
def readinto(self, buf):
59+
return self.pio.readinto(n)

0 commit comments

Comments
 (0)