树莓派串口详解

之前为了使用树莓派的GPIO串口功能,搜了各种解决方案,最终在官方文档里面找到了正确的方法。前面一篇简单三步搞定树莓派GPIO串口通讯描述了如何快速配置好GPIO串口,但没有写为什么这么配置,本篇就根据官方串口文档解释一下问什么那样配置。以下正文:

总览
树莓派包含两个内置的串口,一个是PL011,另一个是迷你串口。它们是用不同的硬件来实现的,所以它们之间稍稍有些不同。但他们都是3.3V的设备,所以将他们跟RS232或者其他电平的设备连接时候,要特别小心。必须要使用合适的转接设备。或者可以使用3.3v的usb转串口线,常见又实惠。

默认情况下,树莓派有无线/蓝牙模块(3和zero w),PL011连接到蓝牙模块,迷你串口作为主要的串口用作linux控制。在其他型号中,PL011用作主串口。

默认情况下,/dev/ttyS0 指的是迷你串口,/dev/ttyAMA0指的是PL011。主串口用作linux控制。两个串口还有别名:/dev/serial0,总是指向主串口,/dev/serial1总是指向第二串口。

迷你串口和cpu频率
迷你串口的波特率基于VC4 GPU上的VPU频率。当VPU调整CPU的频率时,迷你串口的波特率也会发生改变。这会限制迷你串口的使用场合。默认情况下,如果mini uart被设置为主串口,为禁用状态。要启用mini uart,需要在config.txt中增加一句 enable_uart=1。这样会使cpu的频率固定在250MHz。当mini uart不是主串口时,而是用作类似连接蓝牙等,需要增加core_freq=250到config.txt中。否则mini uart不会工作。

标志位enable_uart的默认值取决于uart实际的使用状况。如果ttyAMA0被用作蓝牙模块,enable_uartd的默认值就是0如果mini uart被用作蓝牙模块,enable_uart默认值就是1.
注意:如果通过Device Tree Overlay重新定义了串口,enable_uart始终遵守这个规则。

禁用linux串口命令
在raspbian的默认设置中,主串口(serial0)用作linux命令行控制。要将其移作他用需要改变这个默认设置。开启时,systemd检查linux内核命令是否有控制台输入,并将该控制台用作输入。需要将串口控制台从命令行中删除,以停止这个过程。

可以通过raspi-config程序,或者手动执行。
命令行 sudo raspi-config,选择第interfacing options,在serial中选择No。退出raspi-config。

手动执行的方法,编辑/boot/cmdline.txt。找到命令输入相关的serial0设备,将其删除,包含波特率设置。类似console =serial0,115200.确认其余内容保持不变,否则可能导致树莓派无法启动。

重启使上述配置生效。

串口GPIO脚
默认情况下,串口发送和接收的脚为GPIO14和GPIO15,对应排针座的8脚和10脚。

串口和设备树
在github(kernel github tree)上有多种配置串口的方案。常用的两种是disable-bt和miniuart-bt。
其中disable-bt禁用蓝牙设备,将UART0/ttyAMA0定义到GPIO14和15。同时要禁用系统服务中的modem初始化,以避免其使用uart。命令sudo systemctl disable hciuart。

另一个miniuart-bt切换树莓派3和zeroW的蓝牙功能到mini uart上(ttyS0),同时将uart0/ttyAMA0定义到GPIO14和15上。注意这样会降低最大可用波特率。同样得,需要修改/lib/systemd/system/hciuart.service将ttyAMA0和ttyS0互换,除非系统的设备管理器(udev)规则创建了/dev/serial0和/dev/serial1。如果是这样,使用/dev/serial1代替。如果cmdline.txt中制定了serial0作为用户交互接口,固件将用其他其他口来代替。

在同样的文件夹下,还有其他的uart定义文件。在/boot/overlays/readme中查看更多细节,或者执行dtoverlay –h overlay-name查询介绍和用例信息。

关于如何使用Device Tree Overlays的完整介绍可以参看下面这个链接。https://github.com/raspberrypi/documentation/blob/master/configuration/device-tree.md简而言之,在config.txt中配置如下的一行代码,就可以使其生效dtoverlay=disable-bt。注意文件名的一部分-voerlay.dts已经被删除了。

PL011和mini uart的区别
Mini uart有更小的FIFO,加上流控制的缺失,在波特率较高的时候更容易丢失数据。由于其使用vpu的始终速率,使其比PL011功能弱一些。
Mini uart与PL011的主要区别在于:
没有中断检测
没有帧错误检测
没有校验位
没有接收超时中断
没有DCD,DSR,DTR或者RI信号
更多关于mini uart的内容可以在这个链接查阅:
https://github.com/raspberrypi/documentation/blob/master/hardware/raspberrypi/bcm2835/BCM2835-ARM-Peripherals.pdf

太长不看的总结:

  1. 在raspi-config中修改禁用uart登陆,使用uart硬件
  2. 在config.txt中修改dtoverlay=disable-bt
  3. 执行sudo systemctl disable hciuart
  4. Reboot
  5. Ls –l /dev/serial* 看到serial0已经对应到ttyAMA0上了

简单三步搞定树莓派串口GPIO通讯

你可能感兴趣的:(树莓派)