前言
在工作中,经常接触到各种通信协议,其中总线通信是最
底层
的,写些总结吧。芯片内部,元器件之间,终端设备之间都需要数据交换,而进行数据交换最简单的方式就是利用“有线”
的总线通信。让我们来看看,都有哪些代表性的总线通信方式。
了解下基本概念
单工与双工
只能让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 Bus
和Motorola 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
的芯片刚好相反。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。