矿石收音机论坛

 找回密码
 加入会员

QQ登录

只需一步,快速开始

搜索
查看: 1068|回复: 6

RP2040 PIO模拟串口

[复制链接]
     
发表于 2025-1-14 21:45:34 | 显示全部楼层 |阅读模式
Image 049.jpg
Image 048.jpg
事实证明,无源晶振无法使用PIO,非常的不准确
     
 楼主| 发表于 2025-1-14 21:49:15 | 显示全部楼层
用手触摸晶振时会立马改变PIO输出内容
不用手触摸时可能过比较长的时间会随机改变内容
回复 支持 反对

使用道具 举报

     
 楼主| 发表于 2025-1-14 21:51:10 | 显示全部楼层
本帖最后由 JuncoJet 于 2025-1-14 21:52 编辑

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

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

使用道具 举报

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

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

使用道具 举报

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

一样的话用PIO输出波形,CH340收不到正确数据
回复 支持 反对

使用道具 举报

     
发表于 2025-1-15 17:26:47 | 显示全部楼层
不知道你用的哪家的板子,代码估计也有问题。

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

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

  1. # Example using PIO to create a UART TX interface

  2. from machine import Pin
  3. from rp2 import PIO, StateMachine, asm_pio

  4. UART_BAUD = 115200
  5. PIN_BASE = 10
  6. NUM_UARTS = 8


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


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

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


  31. # Print a different message from each UART
  32. while True:
  33.     for i, u in enumerate(uarts):
  34.         pio_uart_print(u, "Hello from UART {}!\n".format(i))
复制代码

ScreenImg.png
ScreenImg(2).png

评分

1

查看全部评分

回复 支持 反对

使用道具 举报

     
 楼主| 发表于 2025-1-15 21:21:40 | 显示全部楼层
scoopydoo 发表于 2025-1-15 17:26
不知道你用的哪家的板子,代码估计也有问题。

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

这代码确实没问题   ch340 长时间接收都是正常的
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 加入会员

本版积分规则

小黑屋|手机版|矿石收音机 ( 蒙ICP备05000029号-1 )

蒙公网安备 15040402000005号

GMT+8, 2025-4-25 23:58

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表