特性比较
特性 | I²C | SPI | UART | RS-232 | RS-485 | Modbud |
---|---|---|---|---|---|---|
线数(常用) | SCL, SDA | MOSI,MISO, SCK, SS/CS | TX, RX, GND | TX, RX, GND | A, B, GND | 取决于底层协议 |
通信模式 | 多主多从 | 主从(单主多从) | 点对点 | 点对点 | 多点(最多32个设备) | 多点(通常基于 RS-485) |
传输距离 | 10~20cm;最长 1 米 | 10~20cm;最长 50 cm | 几米到几十米 | 最长 15 米 | 最长 1200 米 | 取决于底层协议 |
最大速度 | 100Kb/S,最高 5 Mbps | 最高 50 MHz | 最高 1 Mbps | 最高 115.2 kbps | 最高 10 Mbps | 取决于底层协议) |
抗干扰能力 | 中等 | 中等 | 较弱 | 较弱 | 强 | 强(依赖底层协议) |
拓扑结构 | 菊花链或星型 | 星型 | 点对点 | 点对点 | 总线 | 总线 |
电平标准 | 电源电压决定,为 3.3V 或 5V | 电源电压决定,为 3.3V 或 5V | 1:2.4~5V 0:0~0.5V | 1:-15V~-3V 0:+3V~15V | -7V 至 +12V(差分信号) | |
是否同步 | 同步 | 同步 | 异步 | 异步 | 同步 | 取决于底层协议 |
半双工/全双工 | 半双工 | 全双工 | 全双工 | 全双工 | 半双工 | 取决于底层协议 |
位发送顺序 | MSB 优先 | MSB 优先 | 可配置,常见 LSB 优先 | 可配置,常见为 LSB 优先 | 通常为 LSB 优先 | 可配置(常见为 LSB 优先) |
应用场景 | 短距离低速器件间通信 | 高速器件间通信 | 简单的点对点串行通信 | 短距离低速串行通信 | 长距离、高噪音环境通信 | 工业自动化、楼宇自动化等场景 |
其中:
- 其中,硬件层协议:解决0和1的可靠传输,为RS232、RS485、CAN、IIC、SPI;软件层协议:解决传输目的,为Modbus、TCP/IP、CANopen。
- 51单片机一般没有内置SPI模块,所以整个时序需要自己写程序去模拟,简称模拟SPI。STM32单片机一般有内置SPI,就不用自己写程序去模拟时序,直接应用。但是如果用内置SPI有一个细节,特别容易被忽略,就是你读数据的时候,读一个字节之前要先发一个字节任意值数据。(哑数据)发送一个字节的哑数据是为了维持主从设备之间的通信时序同步,确保数据的可靠传输。这个细节容易被忽略,但它在SPI通信中非常重要。
- 常用Modbus RTU模式,Modbus RTU是一种紧凑的,十六进制表示数据的方式,Modbus ASCII是一种采用Ascii码表示数据,并且每个8Bit 字节都作为两个ASCII字符发送的表示方式。RTU格式后续的命令/数据带有循环冗余校验的校验和,而ASCII格式采用纵向冗余校验的校验和。
I2C协议层
信号格式及读写时序
开始信号 | SCL为高,SDA由高到低 |
结束信号 | SCL为高,SDA由低到高 |
应答信号 | SDA拉低(从机) |
空闲 | SCL和SDA均为高(接上拉电阻) |
初始状态 | 同空闲状态 |
数据传输 | SCL为低,SDA数据变化 |
写时序 | 开始信号 | 读时序 | 开始信号 |
发送I2C地址,(D0-D6) 7位数据位,(D7)读或写操作 | 设备地址+读写控制位 | ||
从机应答信号 | 从机应答 | ||
开始信号 | 开始信号 | ||
发送写入的寄存器地址 | 发送读取寄存器地址 | ||
从机ACK应答信号 | 从机应答 | ||
发送数据 | 开始信号 | ||
从机应答信号 | 重新发送设备地址+读写控制位 | ||
停止信号 | 从机应答 | ||
读取数据 | |||
主机发送NO ACK信号 |
SPI协议层
开始信号 | SS拉低 |
结束信号 | SS拉高 |
应答信号 | 无 |
读写时序 | 开始信号 |
24位内存地址+读写控制 | |
接收/发送数据 | |
停止信 |
Modbus通讯协议
协议格式
写时序 | 从站地址(1 byte)+功能码(1 byte、读03H、写06H)起始地址(高)+起始(低) +数据+校验(CRC/LRC 2 bytes) |
从站地址+功能码(06)+起始地址(高)+起始(低)+数据+校验 |
读时序 | 从站地址+功能码(03)+起始地址(高)+起始(低)+数量+数量(低)+校验 |
从站地址+功能码+返回字节数+字节1+…+字节n+校验 |