1

前言

在工作中,经常接触到各种通信协议,其中总线通信是最底层的,写些总结吧。芯片内部,元器件之间,终端设备之间都需要数据交换,而进行数据交换最简单的方式就是利用“有线”的总线通信。让我们来看看,都有哪些代表性的总线通信方式。


了解下基本概念

  • 单工与双工

只能让A把数据传给B,就叫单工;自然,A和B都能把数据传给对方就叫双工

  • 半双工与全双工

在A把数据传给B的时候,B不能同时给A传数据,这就叫半双工;自然,A和B能时把数据传给对方就叫全双工了哈。

  • 同步与异步

A把数据传送给B时,利用一根或多根总线上的电平变化(时钟信号)来告诉B,数据马上要来了,B你快接,或者A告诉B赶紧把数据传给我!这就是同步总线通信;如果A每次都是直接把数据直接仍给B,B被动接受数据,那就是异步总线通信。

由于B在异步接受数据时,必须判断从哪起算是1个bit数据,自然比同步通信速度慢点;但同步通信也有缺点,你想,在一个同步时钟周期内,A必须等待B把数据接受完,距离如果太长,那速度就慢了,因此只适合通信距离较短的情况。

下面从串行总线开始吧...

单线式串行总线

单总线,用一条串行总线实现主从双工数据交换,比较少见,我碰到的一款电压检测芯片就这种。通常使用主从方式,主设备负责发起读、写时序,或重置总线,对时序要求很严。

双线式串行总线

I2C总线半双工同步总线,PHILIPS公司发明,一条时钟线SCL,来同步通信双方的节奏,一条数据线SDA用来传递数据,同样是主设备负责时钟线SCL电平变化,在SCL驱动下,从设备接受命令或应答。速率最高只能到400Kbit/s。EEPROM存储芯片基本都是用I2C总线通信。

SMBus:Intel公司发明的,与I2C总线类似,时序有点差异,见于一些电池通信中。

CAN总线Boshc公司1986年发明用在汽车上的,基本已经成为了工业现场总线的标准。物理简单,两根线差分传输,半双工异步传输。CAN总线的NB在于除了物理层的电气标准外,Boshc还定义了链路层协议。没有地址编码,总线上所有节点广播接收,自动CRC校验,发送时自动仲裁优先级,所有的链路层协议由接口芯片实现,程序员解放了:),广泛应用于汽车、飞机、工厂等环境恶劣、可靠性要求高的场景!当然缺点也有,就是慢了点,最高1Mbps

三线式串行总线

SPI总线全双工同步总线,Motorola公司发明,一条时钟线SCLK,1条输出数据线SDO,1条输入数据线SDI,分别,同样是主设备负责时钟线SCLK电平变化,虽然可以全双工通信,但一般实际使用时只用半双工,即同时只有一方传输数据。速率比I2C高,可达到几M到几十Mbit/s,很多FLASH存储芯片用SPI接口通信。

异步串行总线

异步串行总线即常说的串口线,这里单独列出来讲。根据电平和信号线的不同,常见的异步串行总线有RS-232、RS-485、RS-422。

RS-232全双工,至少使用二条信号线,一条负责发送数据“TX”,一条负责接受数据“RX”,异步总线,没有时钟同步线,双方统一数据发送传输的比特速率,通常有9600bit/s或者115200bit/s,最大传输速率20kb/s等。

RS-422:与RS-232相比,首先是信号电平不一样,再次,RS-422发送和接受各自有两条线,使用两线差分电平形式传输,抗干扰,因此比232传输距离更远,传输速率可达10Mb/s。

RS-485:在RS-422基础上发展起来的,都采用差分电平传输,但信号电平不一样;除了四线连接方式外,RS485还额外定义了奇葩的两线连接方式,即半双工通信,你发数据出去,自己还会同时收到,如果上层的通信协议定义不好就会让你哥有误判。

更多对比参考这里

现在一般的嵌入式处理器基本都封装好了异步串行总线通信的接口,程序猿基本不用管底层。见过用串口做多节点通信的,各节点分时传输,按字段区分发送源和目的,看起来很美,一旦某节点失效拉低电平,整个总线立马死掉,多节点通信的场景还是考虑CAN吧,不要自己发明轮子!

并行总线

并行总线通常包含三部分:数据总线地址总线控制总线,控制总线用于双方握手,表明数据传输(读或写)方向,基本都是半双工总线。与串行总线不同,并行总线的数据线数目通常就是数据宽度,如8条数据线能同时传输8bit位宽。另外,用于CPU与外设之间的并行总线,通常也称之为CPU总线或者Local Bus总线

优点:速度更快,通信简单
缺点:硬件布线更多,并行总线对时序要求更高,导致传输距离受限,通常只用于板卡间的局部总线。

并行总线有两种主要的形式:Intel BusMotorola Bus,原因就在于这两家半导体大佬的处理器芯片架构不同(如Intel的C51单片机,Motorola的Power PC),进而导致其他小芯片厂家的产品只能跟随其一,或者不怕麻烦多点引脚兼容两种。

明显的区别:Intel Bus使用两根引脚的低电平信号(二者互斥)来指明读写R/W操作,而Motorola Bus则使用一根引脚高低电平来指明读写R/W操作。

同步与异步模式

根据有无同步时钟供发送方和接受方使用,并行总线也分同步异步模式,如SDRAM等需要快速读写的就是使用同步模式,如NAND FLASH等就是使用异步模式。我们通常设计ARM和FPGA之间的Local Bus通信也是异步模式,无需同步时钟信号。

大端和小端

通常采用Intel Bus的芯片通常是使用小端模式,即低字节数据存放在低地址上,而Motorola Bus的芯片刚好相反。


idenny
128 声望8 粉丝