硬件通信接口或协议

以下内容来自AI的回答

在嵌入式系统设计中,硬件通信接口或协议是实现不同设备之间数据交换的关键。这些接口和协议根据传输距离、速度、功耗等因素的不同而有所区别。下面是一些常见的硬件通信接口或协议:

UART

UART (Universal Asynchronous Receiver/Transmitter,通用异步收发器)是一种非常基础的串行通信协议,它允许两个设备之间进行串行、异步、全双工的数据传输。它简单易用,适用于短距离通信。

串口只需要 2根线(TX 和 RX) 就可以实现数据发送和接受,TX用于发送数据,RX用于接收数据(收发不是一根线,所以是全双工通信),通信双方只要 采用相同的帧格式和波特率 ,就能在未共享时钟信号的情况下,可以完成通信过程(收发不同步,所以是异步串行通信)。

电气标准

串口有4种电气标准,分别是:TTL、RS232、RS422、RS485。这4种串口只在电气信号上有差别,在帧格式、传输逻辑、软件操作上基本上都是一样的。

串口的4种电气标准比较:

TTL RS232 RS422 RS485
信号类型 电平信号 电平信号 差分信号 差分信号
电压范围 0~3.3V/5.0V +15V/-15V -0.25V~+6V -7V~+12V
抗干扰性 较强
传输距离 1m 10m 1.2km 1.2km
负载数量 100Kbps 100Kbps 10Mbps 10Mbps
传输模式 1 1 10 32
导线数量 3 3 4 2
  • TTL(Transistor-Transistor Logic)

    TTL电平是指这种逻辑电路中使用的电压标准,用于表示二进制的“0”和“1”。

    逻辑低电平”0” 通常指 接近 0V的电压,一般认为低于 0.8V 为低电平。

    逻辑高电平”1” 通常指相对较高的电压,对于传统的5V TTL逻辑,高电平通常是在 2V~5V 之间;对于3.3V TTL逻辑,高电平则在 2V~3.3V 之间。

  • RS232(Recommended Standard 232)

    RS-232使用 负逻辑,即逻辑“1”为负电压,通常在 -3V~-15V 之间,逻辑“0”为正电压;通常在+3V~+15V 之间)。这种较高的电压范围有助于提高抗噪能力,但同时也限制了其适用于低功耗应用。

  • RS422(Recommended Standard 422)

    RS-422 使用差分信号传输,这意味着每条数据线都有一个对应的反相线。

    差分信号线之间的电压差用来表示逻辑电平,而不是相对于地线的绝对电压。

    发送端:逻辑“1”对应于+2V到+6V 之间的电压差,而逻辑“0”则对应于 -2V到-6V 之间的电压差。

    接收端:逻辑“1”对应于电压差 大于+0.2V,而逻辑“0”则对应于电压差 小于-0.2V

  • RS485(Recommended Standard 485)

    RS485 使用差分信号传输,这意味着每条数据线都有一个对应的反相线。

    差分信号线之间的电压差用来表示逻辑电平。

    发送端:逻辑“1”对应于电压差 +0.2V到+6V 之间,而逻辑“0”则对应于电压差 -0.2V到-6V 之间。

    接收端:逻辑“1”对应于电压差 大于+0.2V,而逻辑“0”则对应于电压差 小于-0.2V

帧结构

image-20241208113119541

我们在使用上位机串口软件(例如:Putty),需要选择串口名称、波特率、数据位、停止位、校验位和流控。

image-20241208113706448

串口控制

为什么开发板通过USB接到电脑后,电脑可以通过串口调试助手与开发板通信?

电脑(Ubuntu 22.04)一般默认安装了不同 “USB to UART Bridge” 芯片厂家的驱动,所以当开发板通过USB接入电脑,系统中的已安装的驱动能够自动识别并正确配置不同芯片厂家的 “USB to UART Bridge” 设备,从而创建像 /dev/ttyUSB0 这样的设备节点,以便用户空间程序可以与这些设备进行通信。

USB to UART芯片:Silicon(芯科) CP2102、FDTI(飞特帝亚) FT232、Prolific(旺玖) PL2303、南京沁恒 CH340。

在 Ubuntu 22.04 系统查看自带驱动:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
$ uname -r
6.8.0-49-generic

$ ls /lib/modules/$(uname -r)/kernel/drivers/usb/serial
aircable.ko f81232.ko iuu_phoenix.ko mxuport.ko quatech2.ko usbserial.ko
ark3116.ko f81534.ko keyspan.ko navman.ko safe_serial.ko usb-serial-simple.ko
belkin_sa.ko ftdi_sio.ko keyspan_pda.ko omninet.ko sierra.ko usb_wwan.ko
ch341.ko garmin_gps.ko kl5kusb105.ko opticon.ko spcp8x5.ko visor.ko
cp210x.ko io_edgeport.ko kobil_sct.ko option.ko ssu100.ko whiteheat.ko
cyberjack.ko io_ti.ko mct_u232.ko oti6858.ko symbolserial.ko wishbone-serial.ko
cypress_m8.ko ipaq.ko metro-usb.ko pl2303.ko ti_usb_3410_5052.ko xr_serial.ko
digi_acceleport.ko ipw.ko mos7720.ko qcaux.ko upd78f0730.ko xsens_mt.ko
empeg.ko ir-usb.ko mos7840.ko qcserial.ko usb_debug.ko

可以看到 Ubuntu 22.04 系统默认就支持 Silicon cp210x.ko、南京沁恒 ch341.ko、FTDI ftdi_sio.ko、Prolific pl2303.ko

USB to UART Bridge芯片通过串口驱动识别后,可以查看到如下信息:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
$ lsusb
Bus 004 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 003 Device 003: ID 27c6:5125 Shenzhen Goodix Technology Co.,Ltd. Goodix Fingerprint Device
Bus 003 Device 002: ID 0489:e0df Foxconn / Hon Hai
Bus 003 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 002 Device 005: ID 0b95:1790 ASIX Electronics Corp. AX88179 Gigabit Ethernet
Bus 002 Device 004: ID 05e3:0626 Genesys Logic, Inc. USB3.1 Hub
Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 001 Device 005: ID 13d3:56f8 IMC Networks ov9734_azurewave_camera
Bus 001 Device 003: ID 046d:c52f Logitech, Inc. Unifying Receiver
Bus 001 Device 009: ID 10c4:ea60 Silicon Labs CP210x UART Bridge
Bus 001 Device 006: ID 05e3:0610 Genesys Logic, Inc. Hub
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub

查看详细信息:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
$ sudo lsusb -v
Bus 001 Device 009: ID 10c4:ea60 Silicon Labs CP210x UART Bridge
Device Descriptor:
bLength 18
bDescriptorType 1
bcdUSB 2.00
bDeviceClass 0
bDeviceSubClass 0
bDeviceProtocol 0
bMaxPacketSize0 64
idVendor 0x10c4 Silicon Labs
idProduct 0xea60 CP210x UART Bridge
bcdDevice 1.00
iManufacturer 1 Silicon Labs
iProduct 2 CP2102N USB to UART Bridge Controller
iSerial 3 6a7f096aba1aef11a7db0b764909ffd0
bNumConfigurations 1
Configuration Descriptor:
bLength 9
bDescriptorType 2
wTotalLength 0x0020
bNumInterfaces 1
bConfigurationValue 1
iConfiguration 0
bmAttributes 0x80
(Bus Powered)
MaxPower 100mA
Interface Descriptor:
bLength 9
bDescriptorType 4
bInterfaceNumber 0
bAlternateSetting 0
bNumEndpoints 2
bInterfaceClass 255 Vendor Specific Class
bInterfaceSubClass 0
bInterfaceProtocol 0
iInterface 0
Endpoint Descriptor:
bLength 7
bDescriptorType 5
bEndpointAddress 0x02 EP 2 OUT
bmAttributes 2
Transfer Type Bulk
Synch Type None
Usage Type Data
wMaxPacketSize 0x0040 1x 64 bytes
bInterval 0
Endpoint Descriptor:
bLength 7
bDescriptorType 5
bEndpointAddress 0x82 EP 2 IN
bmAttributes 2
Transfer Type Bulk
Synch Type None
Usage Type Data
wMaxPacketSize 0x0040 1x 64 bytes
bInterval 0
Device Status: 0x0000
(Bus Powered)

其中比较关键的字段:

  • idVendor:不要修改

  • idProduct:不要修改

  • iManufacturer:可自定修改

  • iProduct:可自定义修改

注意:使用Silicon Labs提供 Simplicity Studio 软件 修改上述字段

suspend状态

手动将USB设备设置为suspend状态,CP2102N的 SUSPENDb引脚 变为低电平。

操作过程:

1、查找USB设备的 idVendor:idProduct ,执行如下命令:

1
2
3
4
5
6
7
8
9
10
11
12
13
caojun@caojun-NMH-WCX9:~$ lsusb 
Bus 004 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 003 Device 003: ID 27c6:5125 Shenzhen Goodix Technology Co.,Ltd. Goodix Fingerprint Device
Bus 003 Device 002: ID 0489:e0df Foxconn / Hon Hai
Bus 003 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 001 Device 004: ID 13d3:56f8 IMC Networks ov9734_azurewave_camera
Bus 001 Device 027: ID 0b95:1790 ASIX Electronics Corp. AX88179 Gigabit Ethernet
Bus 001 Device 026: ID 05ac:0220 Apple, Inc. Aluminum Keyboard (ANSI)
Bus 001 Device 044: ID 10c4:ea60 Silicon Labs CP210x UART Bridge
Bus 001 Device 023: ID 05e3:0610 Genesys Logic, Inc. Hub
Bus 001 Device 028: ID 046d:c542 Logitech, Inc. Wireless Receiver
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub

其中 10c4:ea60 就是目标信息。

2、查找USB设备目录,执行如下命令:

1
2
3
4
5
6
7
8
9
10
caojun@caojun-NMH-WCX9:~$ for d in /sys/bus/usb/devices/*; do 
if [ -e "$d/idVendor" ] && [ -e "$d/idProduct" ]; then
vendor=$(cat $d/idVendor)
product=$(cat $d/idProduct)
echo -n "$d : "
echo "$vendor:$product"
fi
done | grep '10c4:ea60'
/sys/bus/usb/devices/1-3.2 : 10c4:ea60

其中 /sys/bus/usb/devices/1-3.2 就是目标信息。

3、控制USB

查询USB状态:

1
2
caojun@caojun-NMH-WCX9:~$ cat /sys/bus/usb/devices/1-3.2/power/control 
on

此时,该USB设备永远不会挂起,通过万用表测量 SUSPENDb 引脚电平总是高电平。可以修改设置,执行命令:

1
2
3
4
5
caojun@caojun-NMH-WCX9:~$ sudo sh -c 'echo auto > /sys/bus/usb/devices/1-3.2/power/control' 
caojun@caojun-NMH-WCX9:~$
caojun@caojun-NMH-WCX9:~$ cat /sys/bus/usb/devices/1-3.2/power/control
auto

再次,使用万用表测量 SUSPENDb 引脚电平为低电平。

SPI

SPI (Serial Peripheral Interface,串行外设接口)是一种同步串行通信接口,通常用于微控制器与一个或多个外设之间的短距离通信。它使用主从架构,支持全双工通信。

  1. I2C (Inter-Integrated Circuit)

    • I2C 是一种多主机总线,使用两根线(SDA 数据线和 SCL 时钟线)进行半双工通信。它广泛应用于需要连接多个低速外围设备的场合。
  2. CAN (Controller Area Network)

    • CAN 协议是一种有效支持分布式实时控制的串行通信网络,主要用于汽车和工业自动化领域,具有较强的抗干扰能力。
  3. USB (Universal Serial Bus)

    • USB 是一种通用的串行总线标准,用于建立计算机与其外部设备之间的连接。它支持热插拔和即插即用功能。
  4. Ethernet (以太网)

    • 以太网是一种广泛使用的局域网技术,可以实现高速的数据传输。在嵌入式系统中,以太网接口常用于连接互联网或构建本地网络。
  5. Modbus

    • Modbus 是一种工业标准通信协议,用于控制器与执行器之间的通信。它支持RTU和ASCII两种模式,适用于工业自动化环境。
  6. RS-232, RS-422, RS-485

    • 这些是串行通信的标准,其中RS-232主要用于点对点通信,而RS-422和RS-485则支持多点网络,并且具有更好的电气特性,适合长距离通信。
  7. Bluetooth (蓝牙)

    • 蓝牙是一种无线通信技术,适用于短距离内的设备互联,如移动电话、笔记本电脑和个人数字助理(PDA)等。
  8. Wi-Fi (Wireless Fidelity)

    • Wi-Fi 技术允许电子设备通过无线局域网(WLAN)连接到互联网。它是许多现代嵌入式系统和物联网(IoT)设备中的重要组成部分。
  9. Zigbee

    • Zigbee 是一种基于IEEE 802.15.4标准的低功耗、低数据速率的无线通信技术,特别适合于传感器网络和家庭自动化应用。
  10. Thread

    Thread 是一种低功耗、基于 IPv6 的无线网络协议,旨在为家庭和工业环境中的物联网设备提供可靠、安全的通信。它建立在 IEEE 802.15.4 标准之上,类似于 Zigbee,但提供了更强大的网络管理和安全性功能。

  11. NFC (Near Field Communication)

    • NFC 是一种短距离的高频无线通信技术,使两个电子设备(其中一个通常是移动电话)在彼此靠近时能够交换数据。
  12. I2S (Inter-IC Sound)

    • I2S 是一种专为音频设备间传输声音数据而设计的数字接口。它定义了一种标准格式,用于在集成电路之间高效地传输高质量的音频信号。I2S 接口通常用于连接数字音频处理器、DAC(数模转换器)和ADC(模数转换器)等组件。
  13. SDIO (Secure Digital Input Output)

    • SDIO 是一种扩展了SD卡标准的接口,允许设备通过相同的物理接口与多种类型的外设进行通信,例如Wi-Fi模块、蓝牙模块、GPS接收器等。它为嵌入式系统提供了一个灵活且标准化的方法来增加功能而不必改变硬件设计。
  14. PWM (Pulse Width Modulation)

    • PWM 不是一个通信协议,而是一种信号调制方法,常用于控制电机的速度、LED的亮度等需要模拟输出的应用场景。通过改变脉冲宽度来调整输出信号的平均值,从而实现对负载的有效控制。在嵌入式系统中,PWM 通常由定时器或专门的PWM控制器产生。
  15. RMT(Remote Control Protocol) 主要用于处理脉冲信号,特别是在红外通信中。它可以用来接收和发送经过调制的脉冲信号,比如常见的红外遥控信号。RMT 功能通常集成在某些微控制器或SoC(System on Chip)中,特别是那些针对智能家居、消费电子等领域的芯片。