448 lines
15 KiB
Markdown
448 lines
15 KiB
Markdown
# Protocol Quick Reference
|
||
|
||
> **类别:reference** | **主题:通信协议快速参考** | **信源:** 多平台汇总
|
||
|
||
## Table of Contents
|
||
|
||
- [I2C (Inter-Integrated Circuit)](#i2c-inter-integrated-circuit)
|
||
- [Overview](#overview)
|
||
- [Signal Lines](#signal-lines)
|
||
- [Speed Modes](#speed-modes)
|
||
- [Pull-up Requirements](#pull-up-requirements)
|
||
- [Common I2C Addresses (Collision Detection)](#common-i2c-addresses-collision-detection)
|
||
- [Platform Notes](#platform-notes)
|
||
- [SPI (Serial Peripheral Interface)](#spi-serial-peripheral-interface)
|
||
- [Overview](#overview)
|
||
- [Signal Lines](#signal-lines)
|
||
- [Speed](#speed)
|
||
- [Clock Modes](#clock-modes)
|
||
- [Pull-up Requirements](#pull-up-requirements)
|
||
- [Platform Notes](#platform-notes)
|
||
- [UART (Universal Asynchronous Receiver/Transmitter)](#uart-universal-asynchronous-receivertransmitter)
|
||
- [Overview](#overview)
|
||
- [Signal Lines](#signal-lines)
|
||
- [Common Baud Rates](#common-baud-rates)
|
||
- [Frame Format](#frame-format)
|
||
- [Voltage Levels](#voltage-levels)
|
||
- [Level Shifting](#level-shifting)
|
||
- [Platform Notes](#platform-notes)
|
||
- [PWM (Pulse Width Modulation)](#pwm-pulse-width-modulation)
|
||
- [Overview](#overview)
|
||
- [Key Parameters](#key-parameters)
|
||
- [Frequency by Application](#frequency-by-application)
|
||
- [Servo Control Specifics](#servo-control-specifics)
|
||
- [Platform Notes](#platform-notes)
|
||
- [1-Wire](#1-wire)
|
||
- [Overview](#overview)
|
||
- [Signal Line](#signal-line)
|
||
- [Pull-up Requirement](#pull-up-requirement)
|
||
- [Common 1-Wire Devices](#common-1-wire-devices)
|
||
- [Platform Notes](#platform-notes)
|
||
- [CAN (Controller Area Network)](#can-controller-area-network)
|
||
- [Overview](#overview)
|
||
- [Signal Lines](#signal-lines)
|
||
- [Common Transceivers](#common-transceivers)
|
||
- [Speed and Termination](#speed-and-termination)
|
||
- [Platform Notes](#platform-notes)
|
||
- [ADC (Analog-to-Digital Converter)](#adc-analog-to-digital-converter)
|
||
- [Overview](#overview)
|
||
- [Key Parameters](#key-parameters)
|
||
- [Platform Comparison](#platform-comparison)
|
||
- [ESP32 ADC Attenuation](#esp32-adc-attenuation)
|
||
- [External ADC Options](#external-adc-options)
|
||
- [Input Protection](#input-protection)
|
||
- [Platform Notes](#platform-notes)
|
||
|
||
---
|
||
|
||
## I2C (Inter-Integrated Circuit)
|
||
|
||
### Overview
|
||
|
||
- Two-wire synchronous serial bus
|
||
- Multi-device: multiple slaves on same bus
|
||
- Addressable: 7-bit (128) or 10-bit (1024) addresses
|
||
- Open-drain: requires external pull-up resistors
|
||
- Half-duplex: bidirectional on single data line
|
||
|
||
### Signal Lines
|
||
|
||
- SDA:Direction=Bidirectional, Type=Open-drain, Description=Serial data
|
||
- SCL:Direction=Master→Slave, Type=Open-drain, Description=Serial clock
|
||
|
||
### Speed Modes
|
||
|
||
- Standard:Speed=100 kHz, Notes=Universal compatibility
|
||
- Fast:Speed=400 kHz, Notes=Most common for sensors
|
||
- Fast Plus:Speed=1 MHz, Notes=Requires stronger pull-ups
|
||
- High Speed:Speed=3.4 MHz, Notes=Rarely used in hobby projects
|
||
|
||
### Pull-up Requirements
|
||
|
||
**REQUIRED** on both SDA and SCL lines.
|
||
|
||
- Standard/Fast:Recommended Value=4.7kΩ, Notes=Most common choice
|
||
- Fast Plus:Recommended Value=2.2kΩ, Notes=Stronger pull needed
|
||
- High Speed / Long wires:Recommended Value=1kΩ, Notes=Compensates for capacitance
|
||
|
||
**Calculation Formula:**
|
||
```
|
||
R = (VCC - VOL) / IOL
|
||
R = (3.3V - 0.4V) / 3mA = 967Ω minimum
|
||
```
|
||
|
||
**Consequences of Wrong Value:**
|
||
- **Too high (>10kΩ):** Slow rise times, communication errors, fails at higher speeds
|
||
- **Too low (<1kΩ):** Excessive current draw, devices cannot pull line LOW, bus contention
|
||
|
||
### Common I2C Addresses (Collision Detection)
|
||
|
||
- 0x20-0x27:Device(s)=MCP23017 GPIO expander, PCF8574
|
||
- 0x27, 0x3F:Device(s)=PCF8574 LCD backpack
|
||
- 0x29:Device(s)=VL53L0X ToF distance sensor
|
||
- 0x39:Device(s)=APDS9960 gesture/color sensor
|
||
- 0x3C, 0x3D:Device(s)=SSD1306 OLED display
|
||
- 0x40:Device(s)=INA219 current sensor, PCA9685 PWM
|
||
- 0x48-0x4B:Device(s)=ADS1115/ADS1015 ADC
|
||
- 0x50-0x57:Device(s)=AT24C EEPROM
|
||
- 0x5A:Device(s)=MLX90614 IR thermometer
|
||
- 0x60:Device(s)=Si5351 clock generator
|
||
- 0x68:Device(s)=DS3231 RTC, MPU6050 IMU
|
||
- 0x76, 0x77:Device(s)=BME280/BMP280 sensor
|
||
|
||
**Note:** Many devices have address pins (A0, A1, A2) to resolve conflicts.
|
||
|
||
### Platform Notes
|
||
|
||
**Raspberry Pi:**
|
||
- I2C1 (GPIO2/3) is the primary user-accessible bus
|
||
- I2C0 (GPIO0/1) is **reserved** for HAT EEPROM detection — do not use
|
||
- Enable with `dtparam=i2c_arm=on` in config.txt
|
||
- Pi 4/5 have additional I2C buses via dtoverlay
|
||
|
||
**ESP32:**
|
||
- Any GPIO pair works via GPIO matrix — no fixed pins
|
||
- Convention: GPIO21 (SDA), GPIO22 (SCL)
|
||
- Do NOT use input-only pins (GPIO34-39) — they cannot drive SDA
|
||
|
||
---
|
||
|
||
## SPI (Serial Peripheral Interface)
|
||
|
||
### Overview
|
||
|
||
- Four-wire synchronous serial bus
|
||
- Full-duplex: simultaneous send and receive
|
||
- One chip select (CS) per slave device
|
||
- No addressing: CS line selects device
|
||
- Push-pull drivers: no pull-ups required on data/clock
|
||
|
||
### Signal Lines
|
||
|
||
- MOSI:Direction=Master→Slave, Description=Master Out, Slave In
|
||
- MISO:Direction=Slave→Master, Description=Master In, Slave Out
|
||
- SCLK:Direction=Master→Slave, Description=Serial clock
|
||
- CS/SS:Direction=Master→Slave, Description=Chip Select (active LOW)
|
||
|
||
### Speed
|
||
|
||
- Typical: 1-40 MHz (device dependent)
|
||
- Check slave device datasheet for maximum
|
||
- Longer wires = lower reliable speed
|
||
|
||
### Clock Modes
|
||
|
||
- 0:CPOL=0, CPHA=0, Clock Idle=LOW, Data Sampled On=Rising edge
|
||
- 1:CPOL=0, CPHA=1, Clock Idle=LOW, Data Sampled On=Falling edge
|
||
- 2:CPOL=1, CPHA=0, Clock Idle=HIGH, Data Sampled On=Falling edge
|
||
- 3:CPOL=1, CPHA=1, Clock Idle=HIGH, Data Sampled On=Rising edge
|
||
|
||
**Note:** Mode 0 is most common. Check device datasheet.
|
||
|
||
### Pull-up Requirements
|
||
|
||
- **MOSI, MISO, SCLK:** Generally NOT required (push-pull drivers)
|
||
- **CS lines:** 10kΩ pull-up recommended to prevent floating during boot/reset
|
||
|
||
### Platform Notes
|
||
|
||
**Raspberry Pi:**
|
||
- SPI0 (GPIO7-11) is primary bus — CE0 (GPIO8), CE1 (GPIO7)
|
||
- SPI1 (GPIO16-21) available but **conflicts with PCM/I2S audio**
|
||
- Enable with `dtparam=spi=on` in config.txt
|
||
|
||
**ESP32:**
|
||
- VSPI (SPI3): GPIO23 (MOSI), GPIO19 (MISO), GPIO18 (SCLK), GPIO5 (CS) — **recommended**
|
||
- HSPI (SPI2): GPIO13 (MOSI), GPIO12 (MISO), GPIO14 (SCLK), GPIO15 (CS)
|
||
- **WARNING:** HSPI pins overlap strapping pins! GPIO12 can brick the module if HIGH at boot.
|
||
- Any GPIO can be used via GPIO matrix (except input-only pins for outputs)
|
||
|
||
---
|
||
|
||
## UART (Universal Asynchronous Receiver/Transmitter)
|
||
|
||
### Overview
|
||
|
||
- Two-wire asynchronous serial communication
|
||
- Point-to-point: one transmitter, one receiver per pair
|
||
- No clock line: baud rate must match on both ends
|
||
- Simple: widely supported, easy to debug
|
||
|
||
### Signal Lines
|
||
|
||
- TX:Direction=Output, Description=Transmit data (connect to peer's RX)
|
||
- RX:Direction=Input, Description=Receive data (connect to peer's TX)
|
||
- RTS:Direction=Output, Description=Request to Send (optional flow control)
|
||
- CTS:Direction=Input, Description=Clear to Send (optional flow control)
|
||
|
||
**Critical:** TX connects to RX, RX connects to TX (crossover).
|
||
|
||
### Common Baud Rates
|
||
|
||
- 9600:Use Case=Legacy devices, GPS modules
|
||
- 19200:Use Case=Some sensors
|
||
- 38400:Use Case=Bluetooth modules
|
||
- 57600:Use Case=Faster sensors
|
||
- 115200:Use Case=Most common default
|
||
- 230400:Use Case=High-speed peripherals
|
||
- 460800:Use Case=ESP32 flash programming
|
||
- 921600:Use Case=Fast data transfer
|
||
|
||
### Frame Format
|
||
|
||
Standard: **8N1** (8 data bits, No parity, 1 stop bit)
|
||
|
||
Other formats exist (7E1, 8E1, etc.) but 8N1 covers 95%+ of use cases.
|
||
|
||
### Voltage Levels
|
||
|
||
- TTL 3.3V:Voltage=0V / 3.3V, Common Devices=RPi, ESP32, modern MCUs
|
||
- TTL 5V:Voltage=0V / 5V, Common Devices=Arduino, many modules
|
||
- RS-232:Voltage=±12V, Common Devices=PC serial ports
|
||
|
||
**CRITICAL:** RS-232 levels (±12V) will **DESTROY** 3.3V GPIO instantly. Use MAX232 or similar transceiver.
|
||
|
||
### Level Shifting
|
||
|
||
- 5V TX → 3.3V RX: Use voltage divider (1kΩ + 2kΩ) or level shifter
|
||
- 3.3V TX → 5V RX: Often works directly (check VIH threshold)
|
||
- Always use bidirectional level shifter for RTS/CTS
|
||
|
||
### Platform Notes
|
||
|
||
**Raspberry Pi:**
|
||
- UART0 (GPIO14/15) is primary serial port
|
||
- **Conflicts with Bluetooth** on Pi 3/4/Zero2W — use `dtoverlay=disable-bt` or `dtoverlay=miniuart-bt`
|
||
- Pi 4/5 have additional UARTs via dtoverlay
|
||
|
||
**ESP32:**
|
||
- UART0 (GPIO1/3) is **USB serial debug** — avoid for peripherals
|
||
- UART1 and UART2 are freely available
|
||
- Any GPIO can be assigned via GPIO matrix
|
||
|
||
---
|
||
|
||
## PWM (Pulse Width Modulation)
|
||
|
||
### Overview
|
||
|
||
- Digital approximation of analog voltage
|
||
- Square wave at fixed frequency
|
||
- Duty cycle controls average voltage
|
||
- Used for: LED dimming, motor speed, servo position, audio
|
||
|
||
### Key Parameters
|
||
|
||
- Frequency:Description=Pulses per second, Typical Range=50 Hz - 100 kHz
|
||
- Duty Cycle:Description=HIGH time percentage, Typical Range=0-100%
|
||
- Resolution:Description=Steps of duty control, Typical Range=8-bit (256) to 16-bit (65536)
|
||
|
||
**Average Voltage:** Vavg = VCC × (Duty Cycle / 100)
|
||
|
||
### Frequency by Application
|
||
|
||
- LED dimming:Frequency=500-5000 Hz, Reason=>500Hz avoids visible flicker
|
||
- Servo control:Frequency=50 Hz, Reason=Standard RC servo protocol (20ms period)
|
||
- Motor control:Frequency=1-20 kHz, Reason=Higher = less audible whine
|
||
- Audio generation:Frequency=20-100 kHz, Reason=Above audible range
|
||
- Switching PSU:Frequency=50-500 kHz, Reason=Efficiency vs. noise tradeoff
|
||
|
||
### Servo Control Specifics
|
||
|
||
- Period: 20ms (50 Hz)
|
||
- Pulse width: 1ms (0°) to 2ms (180°)
|
||
- Neutral: 1.5ms (90°)
|
||
- Duty cycle: 5% (1ms) to 10% (2ms) at 50Hz
|
||
|
||
### Platform Notes
|
||
|
||
**Raspberry Pi:**
|
||
- **2 hardware PWM channels** only
|
||
- PWM0: GPIO12 (preferred) or GPIO18 (conflicts with audio)
|
||
- PWM1: GPIO13 (preferred) or GPIO19 (conflicts with audio)
|
||
- Software PWM available on any pin but less precise (jitter)
|
||
- Enable with `dtoverlay=pwm` or `dtoverlay=pwm-2chan`
|
||
|
||
**ESP32:**
|
||
- **LEDC peripheral:** 16 channels of hardware PWM
|
||
- Can output on **any output-capable GPIO**
|
||
- Cannot use input-only pins (GPIO34-39)
|
||
- Configurable resolution (1-16 bit) and frequency
|
||
- Motor Control PWM (MCPWM) for advanced motor control
|
||
|
||
---
|
||
|
||
## 1-Wire
|
||
|
||
### Overview
|
||
|
||
- Single-wire bidirectional bus
|
||
- Parasitic power option (power over data line)
|
||
- Each device has unique 64-bit ROM ID
|
||
- Multiple devices on same bus (addressed by ROM)
|
||
- Open-drain: requires pull-up resistor
|
||
|
||
### Signal Line
|
||
|
||
- DQ:Type=Bidirectional, Open-drain, Description=Data and (optionally) power
|
||
|
||
### Pull-up Requirement
|
||
|
||
**REQUIRED:** 4.7kΩ to VCC (3.3V or 5V depending on devices)
|
||
|
||
- Stronger pull-up (2.2kΩ-1kΩ) for long cables or many devices
|
||
- Parasitic power mode may need stronger pull-up during temperature conversion
|
||
|
||
### Common 1-Wire Devices
|
||
|
||
- DS18B20:Function=Temperature sensor, Notes=Most popular 1-Wire device
|
||
- DS18S20:Function=Temperature sensor, Notes=Older, 9-bit only
|
||
- DS2401:Function=Serial number, Notes=Silicon serial number
|
||
- DS2413:Function=GPIO, Notes=2-channel I/O
|
||
- iButton:Function=Various, Notes=Key fobs, access control
|
||
|
||
### Platform Notes
|
||
|
||
**Raspberry Pi:**
|
||
- Default pin: GPIO4
|
||
- Enable with `dtoverlay=w1-gpio`
|
||
- Change pin with `dtoverlay=w1-gpio,gpiopin=N`
|
||
- Kernel driver handles protocol automatically
|
||
|
||
**ESP32:**
|
||
- Any GPIO can be used via OneWire library
|
||
- GPIO4 is common convention
|
||
- Requires software library (no hardware peripheral)
|
||
|
||
---
|
||
|
||
## CAN (Controller Area Network)
|
||
|
||
### Overview
|
||
|
||
- Differential two-wire bus (noise immune)
|
||
- Multi-master: any node can initiate
|
||
- Message-based: no addresses, messages have IDs
|
||
- Priority: lower message ID = higher priority
|
||
- Error detection: CRC, ACK, bit stuffing
|
||
- Common in: automotive, industrial, robotics
|
||
|
||
### Signal Lines
|
||
|
||
- CAN_H:Description=CAN High (dominant = 3.5V)
|
||
- CAN_L:Description=CAN Low (dominant = 1.5V)
|
||
|
||
**Note:** Requires transceiver chip (GPIO cannot drive CAN directly)
|
||
|
||
### Common Transceivers
|
||
|
||
- MCP2551:Voltage=5V, Notes=Classic, widely available
|
||
- SN65HVD230:Voltage=3.3V, Notes=Good for ESP32/RPi
|
||
- TJA1050:Voltage=5V, Notes=Automotive grade
|
||
|
||
### Speed and Termination
|
||
|
||
- 125 kbps:Max Bus Length=500m, Use Case=Long distance
|
||
- 250 kbps:Max Bus Length=250m, Use Case=General purpose
|
||
- 500 kbps:Max Bus Length=100m, Use Case=Automotive
|
||
- 1 Mbps:Max Bus Length=40m, Use Case=High speed
|
||
|
||
**Termination:** 120Ω resistor at **each end** of bus (two total). Many transceiver modules have onboard termination jumper.
|
||
|
||
### Platform Notes
|
||
|
||
**Raspberry Pi:**
|
||
- No built-in CAN controller
|
||
- Requires external MCP2515 (SPI-to-CAN) + transceiver
|
||
- Enable with `dtoverlay=mcp2515-can0,oscillator=8000000,interrupt=25`
|
||
- Uses SocketCAN interface
|
||
|
||
**ESP32:**
|
||
- Built-in TWAI controller (CAN 2.0B compatible)
|
||
- Only needs external transceiver (e.g., SN65HVD230)
|
||
- Common pins: GPIO4 (TX), GPIO5 (RX) — but any GPIO works
|
||
- ESP-IDF and Arduino libraries available
|
||
|
||
---
|
||
|
||
## ADC (Analog-to-Digital Converter)
|
||
|
||
### Overview
|
||
|
||
- Converts continuous analog voltage to discrete digital value
|
||
- Key parameters: resolution, reference voltage, sample rate
|
||
- Input must not exceed reference voltage
|
||
|
||
### Key Parameters
|
||
|
||
- Resolution:Description=Bits of precision (10-bit = 1024 steps, 12-bit = 4096)
|
||
- Reference:Description=Full-scale input voltage (typically VCC or internal ref)
|
||
- Sample Rate:Description=Conversions per second (SPS)
|
||
- Input Range:Description=Allowable input voltage (0 to Vref typically)
|
||
|
||
### Platform Comparison
|
||
|
||
- Built-in ADC:Raspberry Pi=**No**, ESP32=Yes (2 ADCs)
|
||
- Resolution:Raspberry Pi=N/A, ESP32=12-bit (4096 levels)
|
||
- Channels:Raspberry Pi=N/A, ESP32=ADC1: 8ch, ADC2: 10ch
|
||
- Reference:Raspberry Pi=N/A, ESP32=0-3.3V (with attenuation)
|
||
- Sample Rate:Raspberry Pi=N/A, ESP32=Up to 2 MSPS
|
||
- WiFi Conflict:Raspberry Pi=N/A, ESP32=**ADC2 unusable with WiFi**
|
||
|
||
### ESP32 ADC Attenuation
|
||
|
||
- 0 dB:Input Range=0-1.1V, Notes=Highest accuracy
|
||
- 2.5 dB:Input Range=0-1.5V
|
||
- 6 dB:Input Range=0-2.2V
|
||
- 11 dB:Input Range=0-3.3V, Notes=Full range, lower accuracy
|
||
|
||
### External ADC Options
|
||
|
||
- ADS1115:Interface=I2C, Resolution=16-bit, Channels=4, Notes=Programmable gain, slow (860 SPS)
|
||
- ADS1015:Interface=I2C, Resolution=12-bit, Channels=4, Notes=Faster than ADS1115 (3300 SPS)
|
||
- MCP3008:Interface=SPI, Resolution=10-bit, Channels=8, Notes=Simple, cheap, fast
|
||
- MCP3208:Interface=SPI, Resolution=12-bit, Channels=8, Notes=Higher resolution MCP3008
|
||
- ADS7828:Interface=I2C, Resolution=12-bit, Channels=8, Notes=8-channel I2C option
|
||
|
||
### Input Protection
|
||
|
||
- **Never exceed reference voltage** — will damage ADC or give invalid readings
|
||
- Use voltage divider for higher voltages
|
||
- Add clamp diodes (Schottky to VCC and GND) for unknown inputs
|
||
- Add RC filter (100Ω + 100nF) to reduce noise
|
||
|
||
### Platform Notes
|
||
|
||
**Raspberry Pi:**
|
||
- No built-in ADC — external ADC required for any analog input
|
||
- MCP3008 (SPI) or ADS1115 (I2C) are most common choices
|
||
- Many HATs include ADC chips
|
||
|
||
**ESP32:**
|
||
- ADC1 (GPIO32-39): **Always available**, even with WiFi active
|
||
- ADC2 (GPIO0-27 subset): **Unusable when WiFi or Bluetooth active**
|
||
- Design rule: Use ADC1 pins for analog if project uses WiFi
|
||
- Non-linear at extremes — calibration improves accuracy
|
||
|
||
---
|