linux - UART3 RX在TI Omap AM335x Sitara Variscite开发板上保持高电平(强上拉)

标签 linux serial-port embedded-linux uart texas-instruments

我有一个
华力士VAR-SOM-AM33 SOM和开发板(VAR-AM33客户板)
我想让UART3和
Sparkfun FTDI基本分接-3.3V TTL UART到USB适配器(http://sfe.io/p9873
令人费解的部分总结:我也在研究一个基于这个Variscite开发板的定制SoM载体板,我知道当我切割轨迹并连接我的Sparkfun UART/USB时,UART0工作得非常好。因此,在配置UART0的方式与配置UART3的方式上显然存在差异。
软件
我在很多项目中都使用过这个确切的FTDI USB适配器,它总是很好的工作。下面是我试图在开发板上启用UART3的内容:
用于AM335x的基于TI网络的PinMux配置(http://dev.ti.com/pinmux
仅带RXD和TXD的UART3
UART引脚
C15是RXD,无拉力(顺便说一句,与UART0不同)
C18是TXD,下拉(顺便说一下,就像UART0一样)
Yocto内核串行驱动程序选择
在徘徊于默认内核串行8250堆栈的巨大性之后,我最终偶然发现了omap-serial.c驱动程序。我想看看它是否能神奇地解决我的问题,或者至少减少需要筛选的代码(作为一个单独的.c文件)。
所以我将内核(make menuconfig)配置为禁用8250并启用设备驱动程序->字符驱动程序->串行驱动程序中的CONFIG_SERIAL_OMAP。
Yocto内核设备树配置
TI Pinmux生成了这段代码,我将其添加到Yocto环境的内核设备树中:

myuart3_pins_default: myuart3_pins_default {
    pinctrl-single,pins = <
        0x160 ( PIN_INPUT | MUX_MODE1 ) /* (C15) spi0_cs1.uart3_rxd */
        0x164 ( PIN_OUTPUT_PULLDOWN | MUX_MODE1 ) /* (C18) eCAP0_in_PWM0_out.uart3_txd */
    >;
};

我注意到在编辑kernel-source/arch/arm/boot/dts/var-som-am33.dts时,有一个名为spi1_pins_default的SPI设备使用0x164pin,所以我也删除了它的条目(在git diff中没有显示)。SPI1在默认情况下不会被使用,但我只是有点偏执。
以下是我的设备树源的git diff
diff --git a/arch/arm/boot/dts/var-som-am33.dts b/arch/arm/boot/dts/var-som-am33.dts
index 0fdb4e3..05fbd0a 100644
--- a/arch/arm/boot/dts/var-som-am33.dts
+++ b/arch/arm/boot/dts/var-som-am33.dts
@@ -263,6 +263,13 @@
                >;
        };

+       myuart3_pins_default: myuart3_pins_default {
+               pinctrl-single,pins = <
+                       0x160 ( PIN_INPUT | MUX_MODE1 ) /* (C15) spi0_cs1.uart3_rxd */
+                       0x164 ( PIN_OUTPUT_PULLDOWN | MUX_MODE1 ) /* (C18) eCAP0_in_PWM0_out.uart3_txd */
+               >;
+       };
+

@@ -533,11 +522,8 @@
 };

 &uart3 {
-       /*
-       pinctrl-names = "default", "sleep";
-       pinctrl-0 = <&uart3_pins_default>;
-       pinctrl-1 = <&uart3_pins_sleep>;
-       */
+       pinctrl-names = "default";
+       pinctrl-0 = <&myuart3_pins_default>;
        status = "okay";
 };

最后用bitbake重建内核/设备树:
yocto_varsomam33/tisdk/build $  MACHINE=varsomam33 bitbake -C compile linux-ti-variscite

验证设备树设置
构建内核和设备树之后,引导它们(在我的例子中是通过TFTP/nfs内核服务器),并检查我们的设备树设置是否符合我们的预期:
root@varsomam33:~# find /sys/firmware/devicetree/ -name "*myuart*"
/sys/firmware/devicetree/base/ocp/l4_wkup@44c00000/scm@210000/pinmux@800/myuart3_pins_default
root@varsomam33:~# od -x /sys/firmware/devicetree/base/ocp/l4_wkup@44c00000/scm@210000/pinmux@800/myuart3_pins_default/pinctrl-single,pins
0000000     0000    6001    0000    2900    0000    6401    0000    0100
0000020

如果我们endian固定输出值(我的busybox od工具不支持“od-t x1”),我们会看到:
PIN     |  VALUE
--------|-------
0x0160  | 0x0029
0x0164  | 0x0001

它精确地验证了include/dt-bindings/pinctrl/am33xx.h
#define PULL_DISABLE (1 << 3)
#define INPUT_EN     (1 << 5)

#define PIN_OUTPUT_PULLDOWN 0
#define MUX_MODE1   1

硬件
连接:
Carrier board           | Sparkfun USB
------------------------|-------------
J18 pin 9  (UART3_RXD)  | TXO
J18 pin 10 (UART3_TXD)  | RXI
J15 pin 4  (Ground)     | GND

测试
我使用一个非常简单的198行串行终端程序,它是用C语言编写的,可以在这里找到(http://github.com/bradgrissom/miniterm
多年来,我一直在各种嵌入式linux和桌面linux设备上使用它。它不使用第123行所示的流量控制:
newsertio.c_cflag = cooked_baud | CS8 | CLOCAL | CREAD;

接下来,我将使用Sparkfun设备(在本例中为/dev/ttyUSB1)在我的桌面linux机器上和
嵌入式端(/dev/ttyO3)。我在每个终端会话中键入字符。注意,桌面上会收到“a”字符
从嵌入会话中键入时,但从桌面会话中键入时,嵌入端不会收到字符。
嵌入式串行终端
我在嵌入式终端上输入三个“a”字符。
我没有收到从桌面终端键入的任何字符
输出:
root@varsomam33:~# ./miniterm -d/dev/ttyO3
************ REMOTE CONSOLE: CTRL-] TO QUIT ********

台式串行终端
注意,我在桌面上看到了三个“a”字符。
我在这个终端中键入't',但它不会显示在嵌入式终端上。
输出:
# ./miniterm -d/dev/ttyUSB1
************ REMOTE CONSOLE: CTRL-] TO QUIT ********
aaa

检查UART状态
注意,我们在UART3上传输了一些字符,但没有收到任何
root@varsomam33:~# cat /proc/tty/driver/OMAP-SERIAL
serinfo:1.0 driver revision:
0: uart:OMAP UART0 mmio:0x44E09000 irq:155 tx:3080 rx:8 RTS|CTS|DTR|DSR
1: uart:OMAP UART1 mmio:0x48022000 irq:156 tx:0 rx:0 DSR|CD|RI
2: uart:OMAP UART2 mmio:0x48024000 irq:157 tx:0 rx:0 CTS|DSR
3: uart:OMAP UART3 mmio:0x481A6000 irq:158 tx:3 rx:0 CTS|DSR
4: uart:OMAP UART4 mmio:0x481A8000 irq:159 tx:0 rx:0 CTS|DSR
5: uart:OMAP UART5 mmio:0x481AA000 irq:160 tx:0 rx:0 CTS|DSR

Salae逻辑分析仪屏幕截图
UART3 TX在0到3.3V之间看起来不错
enter image description here
UART3 RX仅从3.3V降至2.5V
enter image description here
结束语:
到目前为止我的测试结果。请注意,当我说它不工作时,它显示出上述问题(2.5V到3.3V摆动)。
Board      |  UART   |  Configuration  |  Result
------------------------------------------------
Variscite  |  UART0  |  RS232 DCE      |  WORKS
Variscite  |  UART1  |  RS232 DTE      |  WORKS
Variscite  |  UART3  |  TTL/UART       |  NO WORK  (this is described in this post)
Custom     |  UART0  |  TTL/UART       |  WORKS
Custom     |  UART1  |  RS232 DTE      |  WORKS
Custom     |  UART1  |  TTL/UART       |  NO WORK  (used same procedure described in this post)

我觉得这与调制解调器控制线(流量控制)有关,我的配置设置没有被接受(根据/proc/tty/driver/OMAP-SERIAL
感谢您的帮助!

最佳答案

UART3之所以保持高位,是因为它还连接到RS-485芯片(LTC2852)的引脚1。幸运的是,电路板设计人员知道他们在做什么,并在该线路上附加了一个0欧姆的电阻(R83),因此移除它可以释放UART3的RX线路。
至于定制板上的UART1,问题是UART1连接在SoM上,连接到WiFi/Bluetooth芯片。这并不明显,因为Variscite没有发布SoM示意图。然而,他们确实在载波板示意图中有一个模糊的注释“在SOM上未安装蓝牙时启用UART1”。
在载波板上,UART1连接到SN74AVC4T245总线收发器,该收发器通过GPIO打开/关闭。问题是,当与总线收发器接口时,UART1实际上功能完美。因此,在dev承载板上测试,UART1工作得很好,没有人比他更聪明。只有当您卸下总线收发器时,UART1才不工作。
最后,我的唯一结论是,总线收发器可以处理2.5V-3.3V的逻辑电平,而普通的UART设备则不能。

关于linux - UART3 RX在TI Omap AM335x Sitara Variscite开发板上保持高电平(强上拉),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42660197/

相关文章:

c# - 无法打开端口 Com

android-emulator - 将新编译的 Linux 内核镜像加载到 android 模拟器 (1.5) 时出错

c - c中的 "short int"和 "short"有什么区别?

linux - 在 Debian 11 上安装 Docker Desktop 后 docker-compose 停止工作

linux - bash 脚本将输出分配给变量失败

c++ - windows ReadFile() 在读取 sizeToRead 值之前不会返回

linux - 在串行端口上启用内核低级调试

python - django-jenkins - 属性错误 : 'Coverage' object has no attribute '_harvest_data'

linux - shell脚本剪切和sed帮助

c++ - 串口read()没有接收到数据不返回值