各类总线以及控制协议对比学习

本文介绍了几种常见的通信接口和总线。SCI是通用异步收发器,用于串行通信;I2C是两线制长总线,半双工;SPI是高速全双工同步总线;CAN总线是双线差分信号,多主站结构;LIN总线基于UART/SCI接口,成本低。还介绍了各接口和总线的特点、速率、应用等信息。

1.SCI(通用异步收发器)

两线制,全双工,内部时钟提供速率,需要UART发送器接收器,两线,一根用于发送,一根用于接收。

SCI是包括UART的,UART是通信协议,SCI是接口;SCI用于串行通信,如RS422,RS485,RS232;

补充:关于RS422,RS485,RS232

RS232:全双工,单站(只能挂一个收发器),波特率20Kbps,电平是负逻辑,-15~-3V是逻辑1,对应的正的表示0,一般来说处理两线外还需要一根地线;

RS422:全双工,四线制,差分信号,抗干扰升级,逻辑0和逻辑1用电平差判断;

RS485:两线,半双工,最多可挂在128个收发器,最大速率10Mbps,差分,逻辑1差分为+2~+6(电压降低避免损坏芯片),距离可达到3000m

资料来源:http://www.elecfans.com/emb/jiekou/20180418663969.html

2.I2C

IIC最大的优势在于通过[开漏输出]和[上拉电阻两个物理特性简化了协议整体的设计和实现]

两线制长总线,半双工,用于连接微控制器和外设,由数据线SDA和SCL构成,正常速度为100kbits,高速IIC总线一般可达400kbps,多为半双工通信,多主机I2C总线系统需要将SDA和SCL两根线上拉电阻拉高。

上拉电阻:(两个连接到总线VCC的上拉电阻)因为开漏输出的特性,所以需要上拉电阻来提供高电平,当输出端输出高阻态时并且没有其它设备拉低总线时,总线被外部上拉电阻拉高,呈现高电平状态;(上拉电阻设涉及到通信速率和功耗的取舍,上拉电阻越大,信号上升时间越长,速率越低,阻值过小,低电平时功耗大,此外,电容也会影响上升时间I2C总线电容400pf限制)

开漏输出:开漏输出为低电平和高阻态两个状态,使得总线只受到输出低电平的影响,从而实现线与(当总线上只要有一个设备输出低电平,整条总线便处于低电平状态,此时总线被称为占用转态)的功能】;

程序设计时需要注意发送结束后要清除SCLK,否则设备就会认为还没有到响应结束,从而影响下一次开始时钟;

空闲状态:SDA和SCL两条信号同时处于高电平时,总线为空闲状态;

开始信号:SCL为高,SDA高到低;

结束信号:SCL为高,SDA低到高;

3.SPI

串行外设设备接口,高速(Mbits级别)可以达到30Mbits,全双工,同步的总线通信,四线制(MISO,MOSI,SCLK,CS-没有多设备的时刻可以不需要),主要应用在EEPROM,FLASH,时钟,AD转换,数字信号处理和信号解码器之间;

4.CAN总线

  • 双线差分信号;(1Mbits<=40m);
  • 多主站结构(协议对点的数量没有限制,正常最多110个);
  • 每个报文的内容通过标识符辨别,网络中唯一;性

显性电平为逻辑0,因为线与的机制,0的时候表示了总线处于非空闲的状态,显性位覆盖隐性位;

NRZ编码方式-保证相同带宽的情况下,NRZ包含的信息量更大;

此图上为高速CAN(500k),下为低速容错CAN(125k);

高速CAN的容错性TJA1040:CAN_L对GND可以短路;

低速容错CANTJA1054:CAN_H和CAN_L可以分别开路短路;

?关于为什么汽车控制器很少有1M的CAN,从成本角度考虑,CAN收发器的成本会上升,此外500K足够使用了;

标准帧11位ID,扩展帧29位ID;

首位是SOF为一个显性位,逻辑0,用于数据同步;

DLC:数据长度码;

ACK:为了确保报文被至少一个节点正确接收,接收成功后置0,原本为1,回读为0后,确认被接收;

EOF:7干扰连续隐性位,表示数据结束,节点在检测到11个连续的隐性位后认为总线空闲;

数据链路层:

  • 回读机制:总线空闲发送,发送过程中回读,判断发送位和回读位是否一致,即检测是否有别的节点发报文;
  • 线与优先级:ID越小优先级越高;
  • 非破坏性仲裁:并行的发送变成了串行的发送,这样的机制存在的一是一是因为在A优先级高先发送后,BCD可能会同时检测发送,此时需要检测排队;
  • 接收多帧报文:过滤器-过滤到不要的ID;屏蔽-设置是否生效(不生效的位置,ID可变,可以检测多帧)
  • NRZ编码,存储量更大,但是边沿变化少,所以引入位填充;

LIN总线:

6位ID;单主节点,多从节点,最多16个节点;(基于UART/SCI接口,节省成本)

20Kbit/s;

进度表:规定帧ID的传输次序;规定帧时隙;

### UART协议与SCI协议的区别及应用场景 #### 1. 协议定义 UART(Universal Asynchronous Receiver/Transmitter)是一种通用异步收发传输器,主要用于实现设备之间的串行通信。它支持全双工通信,并广泛应用于嵌入式系统中,用于与PC或其他外设进行数据交换[^1]。 SCI(Synchronous Communication Interface 或 Serial Communication Interface)通常指同步通信接口或串行通信接口,具体实现可能因芯片制造商而异。在某些微控制器中,SCI被用作UART的另一种称呼,但在更广泛的定义下,SCI可以支持同步或异步通信模式,具体取决于其实现方式[^3]。 #### 2. 同步与异步通信 UART本质上是异步通信协议,这意味着它不需要单独的时钟信号来同步数据传输。相反,发送方和接收方必须预先约定波特率(即每秒传输的位数)。UART通过起始位、停止位和校验位来确保数据的正确传输[^1]。 SCI协议既可以支持同步通信也可以支持异步通信。当SCI以同步模式运行时,需要一个额外的时钟信号来协调数据传输,这使得同步SCI适合于需要高精度时序的应用场景。而在异步模式下,SCI的行为类似于UART[^3]。 #### 3. 数据帧结构 UART的数据帧通常由以下部分组成: - 起始位:标记数据传输的开始。 - 数据位:通常是5到9位,表示实际传输的数据。 - 校验位(可选):用于检测传输错误。 - 停止位:标记数据传输的结束[^1]。 SCI的数据帧结构可能有所不同,具体取决于其配置。在异步模式下,SCI的数据帧与UART类似;但在同步模式下,数据帧可能不包含起始位和停止位,而是依赖于时钟信号来确定数据边界[^3]。 #### 4. 应用场景 UART广泛应用于低速、短距离的串行通信场景,例如: - 微控制器与PC之间的调试通信。 - 嵌入式系统中的传感器数据采集。 - GPS模块与主控单元之间的数据传输[^1]。 SCI的应用场景更加多样化,具体取决于其实现方式。在异步模式下,SCI的应用场景与UART类似。而在同步模式下,SCI更适合于需要高精度时序控制的场景,例如音频数据传输或与其他同步外设的通信[^3]。 ```python # 示例代码:使用Python模拟简单的UART数据帧 def uart_frame(data_bits, parity=None): start_bit = '0' stop_bit = '1' frame = start_bit + data_bits if parity == 'even': parity_bit = str(bin(data_bits.count('1')).count('1') % 2 ^ 1) frame += parity_bit elif parity == 'odd': parity_bit = str(bin(data_bits.count('1')).count('1') % 2) frame += parity_bit frame += stop_bit return frame # 示例:生成一个8位数据帧,偶校验 data = '10101010' frame = uart_frame(data, parity='even') print(frame) # 输出: 0101010101 ``` #### 5. 总结 UART和SCI的主要区别在于SCI可以支持同步通信模式,而UART仅支持异步通信。在异步模式下,两者的功能和数据帧结构非常相似。选择使用哪种协议主要取决于具体应用的需求,例如是否需要时钟信号、通信速度和距离等因素[^3]。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值