JuncoJet 发表于 2025-1-14 21:45:34

RP2040 PIO模拟串口



事实证明,无源晶振无法使用PIO,非常的不准确

JuncoJet 发表于 2025-1-14 21:49:15

用手触摸晶振时会立马改变PIO输出内容
不用手触摸时可能过比较长的时间会随机改变内容

JuncoJet 发表于 2025-1-14 21:51:10

本帖最后由 JuncoJet 于 2025-1-14 21:52 编辑

另外串口高电平和低电平的时长是不一样的?
逻辑分析仪(RP2040)上显示高电平1.1个宽度,低电平1个宽度

网上串口有关的帖子,没有见过这个说法
但 PIO 实现时一样的宽度uart信号,上机位CH340 无法识别内容

zhxzhx 发表于 2025-1-15 11:18:36

JuncoJet 发表于 2025-1-14 21:51
另外串口高电平和低电平的时长是不一样的?
逻辑分析仪(RP2040)上显示高电平1.1个宽度,低电平1个宽度
...

串口高低电平的长度是一样的,你这个不一样是 Python设置高低电平的时间不准确或逻辑分析仪的阈值不是设置的中间值,可以用硬件的串口看一下,晶振可以试一下外壳接地,模拟串口最好不要连续发,发一个字节后多等一会,最小的脉冲宽度的倒数就是波特率,你这个是 104uS 9600的,每个脉冲间隔时间最好用定时器,不要用延时.

JuncoJet 发表于 2025-1-15 11:43:02

zhxzhx 发表于 2025-1-15 11:18
串口高低电平的长度是一样的,你这个不一样是 Python设置高低电平的时间不准确或逻辑分析仪的阈值不是设置 ...

一样的话用PIO输出波形,CH340收不到正确数据

scoopydoo 发表于 2025-1-15 17:26:47

不知道你用的哪家的板子,代码估计也有问题。

原厂的板子用的就是无源晶振,用手触摸也不会有任何影响。

跑了一下树莓派官方的例程,八个 PIO 串口工作稳定,高低电平的宽度也是一样的。

# Example using PIO to create a UART TX interface

from machine import Pin
from rp2 import PIO, StateMachine, asm_pio

UART_BAUD = 115200
PIN_BASE = 10
NUM_UARTS = 8


@asm_pio(sideset_init=PIO.OUT_HIGH, out_init=PIO.OUT_HIGH, out_shiftdir=PIO.SHIFT_RIGHT)
def uart_tx():
    # Block with TX deasserted until data available
    pull()
    # Initialise bit counter, assert start bit for 8 cycles
    set(x, 7).side(0)      
    # Shift out 8 data bits, 8 execution cycles per bit
    label("bitloop")
    out(pins, 1)            
    jmp(x_dec, "bitloop")
    # Assert stop bit for 8 cycles total (incl 1 for pull())
    nop()      .side(1)      


# Now we add 8 UART TXs, on pins 10 to 17. Use the same baud rate for all of them.
uarts = []
for i in range(NUM_UARTS):
    sm = StateMachine(
      i, uart_tx, freq=8 * UART_BAUD, sideset_base=Pin(PIN_BASE + i), out_base=Pin(PIN_BASE + i)
    )
    sm.active(1)
    uarts.append(sm)

# We can print characters from each UART by pushing them to the TX FIFO
def pio_uart_print(sm, s):
    for c in s:
      sm.put(ord(c))


# Print a different message from each UART
while True:
    for i, u in enumerate(uarts):
      pio_uart_print(u, "Hello from UART {}!\n".format(i))

JuncoJet 发表于 2025-1-15 21:21:40

scoopydoo 发表于 2025-1-15 17:26
不知道你用的哪家的板子,代码估计也有问题。

原厂的板子用的就是无源晶振,用手触摸也不会有任何影响。 ...

这代码确实没问题   ch340 长时间接收都是正常的
页: [1]
查看完整版本: RP2040 PIO模拟串口