学习目标与要求 1.掌握系统总线的定义和分类。 2.熟悉若干典型总线的结构及其协议。 3.掌握 DMA的作用和功能。 4.掌握 ARM芯片内的总线结构。 3.1系统总线概述 嵌入式系统各个主要部件之间一般采用系统总线连接,因此系统总线是连接两个或者 多个部件进行数据交换的公共通道。被系统连接的部件可以是数据消费者,也可以是数据 生产者。一般而言,系统总线不对数据进行加工,也就是数据在总线上出现和回收时的物理 特性是一致的(目前也有研究在系统总线上插入部分计算功能,读者可以查阅相关文献)。 系统总线是一种描述电子信号传输线路的物理结构形式,是一组信号线的集合,是子系统 或者部件间传输信息的公共通道。 系统总线具有一定的特性,如物理特性、功能特性、电气特性和时间特性等,这些特 性和规范由总线协议来定义。 如果将系统总线按照其实现的功能特性来分,大致可以分为 4类。 (1)数据总线( Data Bus,DB)。顾名思义,数据总线是用来传输数据的总线。如果 在 CPU内部,一般是指 CPU核心与随机访问存储器( Random Access Memory,RAM) 之间传输被处理或是被存储的数据的总线。在 STM32F4系列芯片中,一个典型的数据总 线是 D总线,它将 Cortex-M4芯核和 64KB CCM数据 RAM之间的数据通信通过总线 矩阵连接起来。 (2)地址总线(Address Bus,AB)。地址总线是用来传输被访问部件地址的总线,在物理 上可以通过全局地址(以基地址表示)和局部地址(以偏移地址来表示)共同来 区分。 (3)控制总线( Control Bus,CB)。控制总线是将控制指令 /信号传输到另外部件的总 线。在 STM32F4系列芯片中,一个典型的控制总线是 I总线,将 Cortex-M4芯核和总线 矩阵连接起来,以传递指令。 (4)扩展总线( Expansion Bus,EB)。由用于连接不常使用的部件的扩展信号组成,可 以是上述 3种总线的综合体或者某一种。例如,在 STM32F4系列芯片中, S总线可以归 于此类,它连接 Cortex-M4芯核和总线矩阵,用于访问外设或者静态随机存储器( Static Random Access Memory,SRAM)中的数据,也可以用于传递指令,但此时效率比 I总 线低。 如果按照相对于信息部件的位置,系统总线可以分为内部总线和外部总线;如果按照 数据在总线上的时间和空间组织特性,系统总线又可以分为串行总线和并行总线。 基于以上通用原则,在 STM32F4系列芯片中,对 USB总线的支持是采用如图 3.1和 图 3.2所示的架构。该系列 CPU芯片支持 USB 2.0的全速( 12MB/s)和高速( 480MB/s) 设备,全速时支持主设备和带 PHY的 OTG控制器(满足 OTG 1.0规范);高速时也支持 主设备和 OTG控制器(满足 OTG 1.0规范),但需要通过外置的 PHY器件与通用收发 宏单元接口相连来支持。 STM32F4系列芯片对全速和高速 USB的支持主要是通过 PHY 口来区别的,这也说明部件对通信协议的支持相当灵活,可以根据实际应用来选择。进一 步地,该系列芯片的芯核通过 AHB总线转换实现对 USB总线的支持。 图 3.1 STM32F4系列芯片对 USB全速总线的支持架构 图 3.2 STM32F4系列芯片对 USB高速总线的支持架构 3.2总线结构与协议 3.2.1 CPU总线的结构 总线是 CPU与外设进行数据交换的通道,如图 3.3所示, CPU、内存、 I/O设备都 连接到总线上。在经典的总线系统中,通常 CPU是总线主控,当然,通过 DMA可以实 现其他设备暂时作为总线的主控。在使用总线进行通信时必需的信号包括地址、数据、时 钟和一些控制信号。 图 3.3总线结构 大多数总线协议是基于四周期握手协议构建的,如图 3.4所示,握手是基于两台设备 进行通信:一台设备准备好发送,另一台设备准备好接收。握手时使用一对专用于握手的 线路: enq与 ack,其他线路用于握手期间的数据传输。握手的每步都由 enq或 ack线路 上的电平转换来标识。 图 3.4四周期握手 (1)设备 1的 enq信号升高发出查询信号,告诉设备 2做好接收数据的准备。 (2)当设备 2准备好接收时,设备 2的 ack信号升高发出确认信号。这时,设备 1和 设备 2就可以发送或接收信号。 (3)一旦数据传输完毕,设备 2就降低 ack信号,表示已经接收完数据。 (4)当设备 1看到设备 2的 ack信号变为低电平时,设备 1也将其 enq信号降低,变 为低电平,此次握手结束。 使用握手信号可以完成对数据的读写操作,其时序图如图 3.5所示。 图 3.5总线读写时序图 使用总线握手协议信号可以执行猝发传输( burst transfer),其时序图如图 3.6所示, 在猝发读数据传输中,总线需要额外增加一条线路,称为猝发( burst)信号。在猝发传输 中使用该信号。此外,释放猝发信号以通知设备已经完成数据传输,由于设备需要一些时 间来识别猝发传输结束,因此为了在数据 4之后停止接收数据, CPU在数据 3的末尾就 会释放猝发信号,这些数据来自于从给定地址开始的连续存储空间。 图 3.6总线猝发传输的时序图 3.2.2总线组织及演进 总线在各种计算机体系中都存在,其中最典型的是北桥/南桥芯片组架构下的总线。 北桥/南桥芯片组(桥片)将芯片中各种总线和信息部件组织起来,使得冯·诺依曼计 算机的层次结构更加清晰。在桥片的统领下, CPU内以及和 CPU紧密相关(即可以被集 成到 CPU芯片内部)的总线结构如下。 (1)位于处理器 CPU和北桥之间的是速度最快的处理器总线,L2高缓存储器直接连 到该总线上(与之相应的 L1高速缓存当然在 CPU内部)。 (2)北桥通过动态随机访问存储器( Dynamic Random-Access Memory,DRAM)控 制器连接高速主存。 (3)北桥与南桥之间是 PCI总线,它连接 PCI设备、加速图形端口( Accelerated Graphics Port,AGP)设备等。 (4)南桥上连接 USB等接口和相关设备。 (5)南桥之下是工业标准结构( Industry Standard Architecture,ISA)、扩展工业标 准结构( Extended Industry Standard Architecture,EISA)等传统的慢速 I/O扩展总线。 最初引入北桥/南桥芯片组时 AGP总线标准还没有被提出,当时的图形设备通过 PCI 总线连接到系统中。随着 AGP总线标准的推出,英特尔公司发布了支持 AGP的北桥/南 桥芯片组,即 440系列芯片组。典型的奔腾微机的总线结构如图 3.7所示。 图 3.7典型的奔腾微机的总线结构 总线协议随着技术的发展而演进,也围绕着芯片的应用而发展,部分总线随着技术的 进展从芯片外走入芯片内,完成了总线的芯片嵌入化。 STM32F4系列芯片内部的总线结构(如图 3.8所示)变得扁平,而不是传统的多个层 次,这主要是由于各个总线的技术演进到一定程度,除了功能上的差别,在电气方面已经 完全可以被移到芯片内并予以统一的工艺条件支持。另一方面,总线在速度上都变成高速, 数目也变多,因而,矩阵式的结构是很自然的选择。 3.2.3典型总线及协议 1. ISA总线 最早的计算机总线是 IBM公司于 1981年在 PC/XT计算机中采用的系统总线,面向 的是 8位的 8088处理器,被称为 PC总线或者 PC/XT总线。 1984年,IBM公司推出 了基于 16位 80286英特尔 CPU处理器的 PC/AT计算机,系统总线也相应地扩展为 16 位,并被称为 PC/AT总线。随着 PC的逐步普及,人们就需要开发与 IBM PC兼容的外 围设备,行业内便逐渐确立了以 IBM PC系列总线规范为基础的 ISA总线。图 3.9展示 了支持 5条 16位 ISA总线和 1条 8位 ISA总线的主板,一种典型的 8位 ISA设备如 图 3.10所示。 图 3.8 STM32F4系列芯片的总线结构 图 3.9同时支持 8位和 16位 ISA总线的主板 图 3.10一种 8位 ISA设备 8位 ISA总线最大传输速率仅为 8MB/s,传输速率过低,使用时导致 CPU占用率高、 设备占用硬件中断资源等,这些缺点很快使 ISA总线在飞速发展的计算机技术中成为瓶 颈。因此在 1988年,康柏、惠普等 9个厂商协同把 ISA扩展到 32位,这就是著名的 EISA 总线。 EISA总线的工作频率仍旧仅为 8MHz,但在与 8位/16位的 ISA总线完全兼容的 同时, 32位 EISA总线的访问带宽相比于 16位 ISA总线提高了一倍,达到了 32MB/s。 可惜的是,这一总线速度仍旧较低,而且 EISA总线成本较高(总线的成本主要在于编解 码的复杂性和单位信息量的通信硬件成本),在还没成为广泛使用的标准总线之前,在 20 世纪 90年代初,就逐步被 PCI总线取代了。 在工业和军事领域, ISA总线仍旧在使用,这主要是因为在这些领域有相当多的设备 没有更新到 PCI总线版本上的特殊性以及低速通信的较高可靠性。例如, ADEK工业计 算机公司在 2013年发布的一款支持英特尔 Core i3/i5/i7处理器的主板就仍带有一条 ISA 插槽。另一方面,虽然大多数计算机没有支持物理的 ISA插槽,但在虚拟地址上为 ISA总 线预设了空间。特别地,相当多的嵌入式控制芯片对温度控制和电压的读取也通过 ISA总 线来实现。 2. PCI总线 ISA/EISA总线速度的限制使得硬盘、显卡还有其他的外围设备在当时只能通过慢速 并且位宽低的总线来发送和接收数据,成为提高 CPU效率的瓶颈,因此 PC的性能受到 严重影响。为了解决这个问题, 1992年英特尔公司在发布 486处理器的时候,也同时提出 了 32位的 PCI总线。 PCI总线在刚被提出时工作在 33MHz,传输带宽为 133MB/s(33MHz@32位),比 ISA 总线有了极大的改善,基本上满足了当时处理器与显卡、声卡、网卡、硬盘控制器等高速 外围设备的通信需要。一种带有 3条 32位 5V PCI扩展槽的主板如图 3.11所示。Adaptec 公司的 32位小计算机系统接口( Small Computer System Interface,SCSI)适配器 PCI 卡如图 3.12所示。 图 3.11一种带 32位 5V PCI扩展槽的主板 PCI 1.0总线采用 5V供电,PCI 2.0版本以后的总线主要采用 3.3V供电,PCI 2.1总 线可以支持 66MHz工作频率。在 PCI 2.2版本总线中还引入了 Mini PCI以支持笔记本。 除了第一个版本,后续版本的 PCI总线协议都由 PCI SIG(Special Interest Group,SIG) 负责,版本系列包括 PCI 1.0(1992年发布)、PCI 2.0(1993年发布)、PCI 2.1(1995年 发布)、PCI 2.2(1998年发布)、PCI 2.3(2002年发布)、PCI 3.0(2004年发布)。 图 3.12 Adaptec公司的 32位 SCSI适配器 PCI卡 为了在服务器领域支持更高的传输速率,多家厂商联合于 1999年制定了 PCI-X。PCIX 1.0开始时就是 64位、133MHz版本的 PCI,以保持对 PCI总线的兼容,后来的 PCI-X 2.0、3.0提高了频率,经历过 266MHz、533MHz,甚至 1GHz,遇到的问题是频率增高后 通信信号串扰严重,同时共享式总线造成资源争用,导致实际通信效率远远达不到理论值。 PCI-X协议的一个突出特点是采用了寄存器到寄存器的信号传输方式,这非常有利于提高 工作频率。实际上,寄存器到寄存器的信号传输方式在芯片内部是常见的手段。另一方面, 在 PCI-X协议中有了总线事务分割的概念,即目标设备不能立即完成请求时,发送独立 的响应给请求设备,这是一种中断式的处理机制,减少了总线事务占用通信时间和带宽。 PCI-X协议的另外一个创举是引入消息触发中断( Message Signaled Interrupts,MSI)机 制,这一机制是中断处理机制中的主动通知类型。为了实现 MSI机制,PCI-X扩展了 PCI 的配置空间,并且在设备枚举过程中为每个 PCI设备分配 MSI的中断向量号存储地址以 及向量号。 PCI和 PCI-X总线统称为并行 PCI总线,以区别于后续的 PCI-Express(PCIe)。与 ISA总线的发展类似, 2005年后, PCI和 PCI-X总线基本过时了,过去由它们支持的设 备或者器件逐步转移到由 USB总线或者 PCI-Express总线支持。 3. AGP总线 PCI总线刚提出时只有 133MB/s的带宽,对于传输数据速度需求越来越大的 3D显卡 却力不从心,成为了制约显示子系统和整机性能的瓶颈。因此, PCI总线的补充——AGP 总线就应运而生了。 英特尔公司于 1997年 8月正式推出了 AGP总线。该总线是显卡专用的局部总线,基 于 PCI 2.1版总线规范并进行扩充修改而成,工作频率为 66MHz,以主存作为帧缓冲器, 实现了高速缓冲,1X模式下带宽为 266MB/s,是当时 PCI总线的带宽的两倍。后来依次 又推出了 AGP 2X、AGP 4X、AGP 8X,传输速度达到了 2.1GB/s。AGP总线还采用了 一种双激励的传输技术,能在一个时钟的上、下沿双向传输数据,进一步提高了传输速度。 双沿传输数据技术目前在存储器等领域得到了广泛应用。 正因为专门为显卡而设计,考虑到支持大功耗的需要, AGP还提供了一种扩展版本即 AGP Pro。其与 AGP主要的不同在于电气方面的支持 ——将插槽增长,增加了额外的引 脚来供电,从而可以支持工作站或者服务器对显卡的功耗需要。 表 3.1给出了 AGP总线部分技术指标和版本的对应情况以及与 PCI 2.1协议的部分 技术指标对比。 表 3.1 AGP协议版本和部分技术指标以及与 PCI 2.1协议的对比 协议版本工作电压工作时钟速度每个时钟传输数据个数速率 MB/s PCI 2.1 3.3V/5V 33/66MHz – 1 133/266 AGP 1.0 3.3V 66MHz 1X 1 266 AGP 1.0 3.3V 66MHz 2X 2 533 AGP 2.0 1.5V 66MHz 4X 4 1066 AGP 3.0 0.8V 66MHz 8X 8 2133 AGP 3.5 0.8V 66MHz 8X 8 2133 图 3.13给出了 AGP卡和槽的对应外形。和 PCI总线类似, AGP总线也逃脱不了 技术更新的规律,到 2010年,已经少有主板和芯片支持 AGP总线了, AGP逐步让位于 PCIe总线。 图 3.13 AGP卡和对应槽外形 4. PCI-Express总线 英特尔公司在 2001年春季的英特尔开发者论坛( Intel Developer Forum,IDF)上, 正式公布了旨在取代 PCI总线的第三代 I/O技术,最后被正式命名为 PCI-Express。2002 年 7月 23日,PCI-SIG正式公布了 PCIe 1.0规范,2007年正式推出 PCIe 2.0规范。特别 地,PCIe规范中引入了“道”(Lane)的概念。“道”由两个分别用于发送和接收数据的差 分信号对组成,同时双向传输字节包数据。不同的 PCIe连接支持不同数目的道,道的数目 以“ X”为前缀来描述, X16是通用的最大道数。另一方面, PCIe总线是串行总线,因为 PCIe总线每道在每个方向上只有一对差分信号线,也不需要外部时钟信号,所以它可以达 到很高的速率,类似的技术在 Serial ATA、USB、SAS(Serial Attached SCSI)、IEEE 1394 FireWire、RapidIO、DVI、HDMI、DisplayPort等总线中都得到了应用。如图 3.14所示 为通过 PCIe总线通信的结构示意。 图 3.14 PCIe通信示意(其中通信称为连接) 一般而言,较短的 PCIe卡可以插入较长的 PCIe插槽中使用。PCIe接口相比于其他 接口,能够支持热插拔是一个技术飞跃。 PCIe卡支持的 3种电压分别为 +3.3V、+3.3Vaux 及 +12V。用于取代 AGP接口的 PCIe 2.0总线道数为 X16,能够提供 5GB/s的带宽, 即便考虑编码上的损耗仍能够提供 4GB/s左右的实际有效带宽,远远超过 AGP 8X的 2.1GB/s的带宽。相对于 PCI总线来讲, PCIe总线能够提供极高的带宽来满足计算机和 嵌入式系统的需求。 2018年 PCIe总线标准版本是 PCIe 4.0。与 PCIe 2.0相比,PCIe 4.0的信号传输率从 2.0版本的 5GB/s提高到 16GB/s,编码方案也从原来的 8b/10b改为更高效的 128b/130b, 可以确保几乎 100%的传输效率,相比此前 2.0版本采用 8b/10b编码方案时提升了 25%, 从而促成了传输带宽的翻番,其他规格基本不变,每周期依然传输 2位数据,支持多道 并行传输,从而 X16双向带宽可达 32GB/s。PCIe协议版本和相应的部分技术指标如 表 3.2所示。 表 3.2 PCIe协议版本和相应的部分技术指标 协议版本年份编码传输率 吞吐率 X1 X2 X4 X8 X16 1.0 2003年 8b/10b 2.5GB/s 250MB/s 0.50GB/s 1.0GB/s 2.0GB/s 4.0GB/s 2.0 2007年 8b/10b 5.0GB/s 500MB/s 1.0GB/s 2.0GB/s 4.0GB/s 8.0GB/s 3.0 2010年 128b/130b 8.0GB/s 984.6MB/s 1.97GB/s 3.94GB/s 7.88GB/s 15.8GB/s 4.0 2018年 128b/130b 16.0GB/s 1969MB/s 3.94GB/s 7.88GB/s 15.75GB/s 31.5GB/s 5. CAN总线 CAN(Controller Area Network)总线是以研发和生产汽车电子产品著称的德国 Robert Bosch GmbH公司于 1983年开始开发的,开发出来后成为国际标准 ISO 11898和 ISO 11519,是国际上应用最广泛的现场总线之一。 CAN总线协议已经成为汽车计算机控制系 统和嵌入式工业控制局域网的标准总线协议。 CAN总线定义了物理层、数据链路层,并且拥有种类丰富、简繁不一的上层协议。与 I2C、SPI等有时钟信号的同步通信方式不同, CAN总线通信是一种异步通信,利用一对 差分信号线可以减少设备通信时所需线束中连接线的数量。人们通过多个 CAN总线组织 的 LAN,可以进行大量数据的高速通信,从而获得高性能和高可靠性,因此 CAN总线被 广泛应用于工业自动化、船舶、医疗设备、工业设备等方面。由于 CAN总线的重要性和 在嵌入式设备中的广泛应用,以及人们传统上对嵌入式应用的认识,区别于前面介绍的总 线,这里稍微详细地介绍一下它。 CAN总线通信采用了不需要主计算机或者嵌入式系统干预的基于消息的通信协议,其 主要特点如下所述。 1)CAN总线物理结构与特性 CAN总线协议是一款采用多主控器的串行总线标准, CAN总线设备一般称为节点。 CAN总线信号由 CAN_H和 CAN_L双绞线构成,各个节点通过这对双绞线实现信号的 串行差分数据传输。 CAN总线物理层的形式主要分为闭环总线及开环总线网络两种。 CAN闭环总线网络 是一种遵循 ISO 11898标准的高速、短距离网络,它的总线最大长度为 40m,通信速度最 高为 1Mb/s,典型组织结构如图 3.15所示。为了避免信号的反射和干扰, CAN总线协议 要求在 CAN_H和 CAN_L之间接上名义值为 120Ω的终端匹配电阻。 CAN开环总线网络是遵循 ISO 11519-2标准的低速、远距离网络,它的最大传输距离 为 1km,最高通信速率为 125kb/s,两根信号线是独立的、不形成闭环,系统要求每根总 线上各串联有一个 2.2kΩ的电阻,其典型组织结构如图 3.16所示。 2)CAN收发器 CAN设备是通过 CAN收发器来连接的, CAN收发器负责 TTL逻辑电平和差分信 号电平之间的转换,即 CAN控制芯片输出 TTL逻辑电平到 CAN收发器,然后 CAN 收发器通过内部转换将 TTL逻辑电平转换为差分信号输出到 CAN总线上。依据协议, 任何 CAN总线上的节点都可以决定是否接收总线上的数据。作为实现上述功能的芯片载 体,CAN收发器芯片的一种可能的引脚定义如表 3.3所示,典型输入 /输出信号如图 3.17 所示。 图 3.15闭环 CAN总线典型组织结构 图 3.16开环 CAN总线典型组织结构 表 3.3 CAN收发器芯片的一种可能的引脚定义 引脚序号名称信号描述 1 TXD发送数据输入 2 GND地 3 Vcc电源电压输入 4 RXD接收数据输入 5 Vio参考电压输出 6 CANL低电平 CAN_L信号线 7 CANH高电平 CAN_H信号线 8 S高速或静音模式选择开关 图 3.17 CAN收发器芯片典型输入/输出信号 3)信号定义 CAN总线上的信号有两种不同的信号状态,分别是显性的( Dominant)逻辑 0和隐 性的( Recessive)逻辑 1。ISO 11898标准定义了当 CAN_H和 CAN_L电平很接近甚至 相等的时候,总线信号表现为隐性逻辑 1,而两线电平差较大时则表现为显性逻辑 0。从量 化角度来说,定义如下: (1)当信号电压差 CAN_H-CAN_L<0.5V时为隐性的,逻辑信号表现为逻辑 1——高 电平。 (2)当信号电压差 CAN_H-CAN_L>0.9V时为显性的,逻辑信号表现为逻辑 0——低 电平。 协议同时规定信号在每次传输完后不需要返回到显性逻辑 0,而是应用不归零( Non- Return to Zero, NRZ)码位填充技术来确定信号值,具体的位填充规则为:发送器只要检 测到位流里有 5个连续相同值的位,便自动在位流里插入补充位。 CAN总线信号采用“线与”规则进行总线仲裁和定义,总线上只要有一个节点将总线 拉到低电平(逻辑 0)的显性状态,总线就为低电平(逻辑 0)即显性状态,而不管总线上 有多少节点处于传输隐性状态(高电平或是逻辑 1);只有所有节点都为高电平(隐性逻辑 1),总线才为高电平(逻辑 1)。这也是为什么逻辑 0是显性、逻辑 1是隐性的原因,这一 特点是和很多总线稍微不同的地方。 4)通信速率与通信距离 和大多数信号传输一样, CAN总线的通信速率和通信距离强烈相关, CAN总线的不 同标准可以支持的速率及典型特点如表 3.4所示,相应的 CAN总线上任意两个节点的最 大通信距离与位速率关系如表 3.5所示。这里的最大通信距离是指同一条总线上两个节点 之间 CAN总线通信可靠传输的距离,从表 3.5中可以看到,速率越低通信距离就越远,在 位速率为 5kb/s时达到最大的传输距离 10km。一般的工程中通常采用 500kb/s的通信速 率,在这个速率下通信非常可靠。如果想要更远距离的通信(例如大于 10km),可以考虑 表 3.4 CAN总线标准及其支持的最高速率及典型特点 类型标准最高速率特点 高速 CAN ISO 11898 1Mb/s最通用的 CAN总线类型 低速 CAN ISO 11519-2 125kb/s容错,在一条总线短路的时候仍然能工作 单线 CAN SAE J2411 50kb/s高速模式可达 100kb/s,主要用在汽车上 用多个 CAN控制器连接或是增加支持其他通信协议(如 RS-485或是 TCP/IP)的接口 芯片进行扩展。 表 3.5 CAN总线上任意两个节点的最大通信距离与位速率关系 位速率/(kb/s) 1000 500 250 125 100 50 20 10 5 最大距离/m 40 130 270 530 620 1300 3300 6700 10 000 5)CAN总线数据传输 CAN总线是一个广播类型的总线,在总线上的所有节点都可以监听总线上传输的数 据。CAN总线节点硬件芯片在监听到总线数据后,在本地不关注与本节点无关的数据,解 码和保留与自己有关的信息。CAN的帧数据可以分为 6段。 (1)头尾段包含帧起始和帧结束,用于界定一个数据帧。标准帧和扩展帧都包含这两 个段。帧起始为单个显性位。总线空闲时,发送节点发送帧起始,其他接收节点同步于该 帧起始位。帧结束为 7个连续的隐性位。 (2)仲裁段格式如图 3.18所示。从发送角度来说,在 CAN总线空闲期间,总线上任 何 CAN设备节点都可以发送报文,如果有两个或两个以上的节点开始发送报文,那么就 会存在总线访问冲突的可能,CAN总线使用标识符 ID的逐位仲裁方法以解决这个竞争问 题。在仲裁期间,每个发送器将自己发送的电平与被监控的总线电平进行比较,如果电平 相同(实际上是近似,据前述信号定义),则这个单元可以继续发送报文。如果发送的是一 个“隐性”电平而监视到的是一个“显性”电平,那么这个节点就会失去仲裁权,退出发 送状态。如果总线上出现不匹配的位并且不处在仲裁期间则产生错误事件。上述仲裁方式 的基础主要在于仲裁段的信息。CAN总线协议规定,报文的帧 ID号码越小,优先级越高; 对于 ID相同的情况,由于数据帧的远程传输请求位 RTR为显性电平,远程帧为隐性电 平,所以在帧格式和帧 ID相同的情况下,数据帧优先于远程帧;由于标准帧的扩展标识 符位 IDE为显性电平,扩展帧的扩展标识符位 IDE为隐性电平,对于前 11位 ID相同的 标准帧和扩展帧,标准帧优先级比扩展帧高。假如节点 A、B和 C都发送相同格式相同类 型的帧(例如标准格式数据帧),总线竞争过程如图 3.19所示。 图 3.18仲裁段的格式 图 3.19一种节点间的总线竞争过程 (3)控制段共 6位,标准帧中控制段包括扩展帧标志位 IDE、保留位 r0、数据长度代 码 DLC;扩展帧中控制段除了包括上述三者,还包括保留位 r1。具体组织格式如图 3.20 所示。 图 3.20控制段的组织格式 (4)数据段一般为 0 ~ 8字节,传输时最高有效位( Most Significant Bit,MSB)先 传输,相较于其他总线的短帧结构此方式使得通信实时性非常高,抗干扰能力也强,非常 适合汽车和工控嵌入式应用场合。 (5)CRC校验段由帧起始段、仲裁段、控制段和数据段计算得到的 15位 CRC值和 1位隐性电平定界符构成。 (6)当一个接收节点接收帧起始到 CRC段之间的内容没有发生错误时,将在 ACK段 发送一个显性电平,发送节点检查消息是否存在应答位,如果没有就重发消息。 ACK段具 体组织如图 3.21所示。 图 3.21 ACK段的组织 6)帧类型 在通信中,CAN总线报文有 4种帧格式。 (1)数据帧:数据帧将数据从发送器传输到接收器,根据仲裁段 ID码长度的不同,分 为标准帧(CAN 2.0 A)和扩展帧(CAN 2.0 B)。 (2)远程帧:总线节点发出远程帧,请求发送具有同一标识符的数据帧。远程帧相对于 数据帧而言没有数据段,但是远程帧的 RTR位被置为 1(隐性电平),表示是远程帧,也 有标准格式和扩展格式两种类型。 (3)错误帧:虽然 CAN总线可靠性很高,但还是有可能发生错误,任何节点单元检测 到总线错误就发出错误帧。当总线上有一个错误帧时,总线上所有节点都将检测到一个错 误,所以若有任何一个节点检测到错误,则总线上的其他节点都会发出错误帧。 (4)过载帧:过载帧用在相邻数据帧或远程帧之间以提供附加的延时,即过载帧是 CAN 接收节点用来向 CAN总线发送节点告知自身接收能力的帧,标志着某个接收节点来不及 处理数据了,希望其他节点减缓发送数据帧或者远程帧。 6.以太网(Ethernet)总线 1)以太网概述 1980年 Xerox公司和英特尔、 DEC公司一起开发了基带局域网规范,后续发展成为 当今局域网采用的最通用的通信协议标准。 以太网协议由于历史和应用原因,一般以物理形式应用在芯片外。通过以太网实现的 通信一般以接口的形式出现,通过铜缆或者光纤来连接,其中铜缆可以是同轴线或者差分 线。以太网总线协议由 IEEE 802.3定义,采用带冲突检测的载波监听多路访问( Carrier Sense Multiple Access/Collision Detection,CSMA/CD)技术。除了通常的规范, IEEE 802.3af定义了将未使用的接口线用于直流供电,也即有源以太网( Power Over Ethernet, POE)接口,此外还有 IEEE 802.3ah版本。 IEEE 802.3描述了物理层的连线、电信号和介质访问控制( Media Access Control, MAC)子层的实现方法,历经了十兆、百兆、千兆和万兆以太网的发展。初始的以太网只 有 10Mb/s的带宽。在 IEEE 802.3标准中,为不同介质制定了不同的物理层标准,标准名 称中前面的数字表示带宽,最后一个数字表示单段网线长度(基准单位 100m),Base表示 基带。 【例 3-1】典型的以太网例子。 (1)10Base-5使用直径为 0.4英寸、阻抗为 50Ω的粗同轴线缆,最大网段长度 500m, 采用基带传输方法,拓扑结构为总线型,以太网卡为 AUI接口。 (2)10Base-2使用直径为 0.2英寸、阻抗为 50Ω的细同轴线缆,最大网段长度 185m, 采用基带传输方法,拓扑结构为总线型,以太网卡为 BNC接口。 (3)10Base-T使用非屏蔽双绞线线缆,最大网段长度 100m,拓扑结构为星形,接口 为 RJ-45。 (4)1Base-5使用双绞线线缆,最大网段长度 500m,传输速度 1Mb/s。 (5)10Broad-36使用同轴线缆( RG-59/U CATV),网络跨度为 3600m,网段最大长 度为 1800m,是一种宽带传输方式。 (6)10Base-F使用光纤传输介质,传输速率为 10Mb/s。 1995年 3月,IEEE协会宣布了 IEEE 802.3u 100Base-T快速以太网标准,开始了 100Mb/s以太网时代,它有 3个子类。 (1)100Base-TX:使用 5类数据无屏蔽双绞线或者屏蔽双绞线。两对双绞线中的一对 用于发送数据,另一对用于接收数据。使用 4B/5B编码方案,信号频率为 125MHz,符合 EIA586的 5类布线标准和 IBM的 SPT 1类布线标准,使用 RJ-45连接器,最大网段长 度为 100m,支持全双工数据传输。 (2)100Base-FX:使用单模或者多模光纤、4B/5B编码方式,信号频率同样为 125MHz, 使用 MIC/FDDI连接器、ST连接器或者 SC连接器,最大网段长度是 150m、412m、2000m 或者 10km,该长度和使用的光纤类型和工作模式相关;支持全双工数据传输,适合有电气 干扰、较大距离或高保密环境条件通信。 (3)100Base-T4:可使用 3、4、5类无屏蔽双绞线或者屏蔽双绞线的快速以太网, 4 对双绞线中的 3对在 33MHz频率上传输数据,每对均工作于半双工模式;第四对用于 CSMA/CD。采用 8B/6T编码方式,信号频率为 25MHz,符合 EIA586结构化布线标准, 使用 RJ-45连接器,最大网段长度为 100m。 后续千兆以太网填补了上述标准的不足,传输距离更短,主要类型如下: (1)1000Base-CX Copper STP 25m。 (2)1000Base-T Copper Cat 5 UTP 100m。 (3)1000Base-SX Multi-mode Fiber 500m。 (4)1000Base-LX Single-mode Fiber 3000m。 千兆以太网有两个标准,分别是 IEEE 802.3z和 IEEE 802.3ab,前者制定了光纤和短 程铜线连接方案,后者制定了 5类双绞线上较长距离连接方案。 万兆以太网的标准是 IEEE 802.3ae,它扩展了 IEEE 802.3协议和 MAC规范,可以支 持 10Gbps的传输速率。上述标准基本都和其他标准一样,也可以调整以支持低速率传输。 (1)10GBase-SR和 10GBase-SW主要支持短波( 850nm)多模光纤,传输距离为 2 ~ 300m,后者用于连接 SONET设备。 (2)10GBase-LR和 10GBase-LW用于支持长波( 1310nm)单模光纤,传输距离为 2m~10km。 (3)10GBase-ER和 10GBase-EW支持超长波( 1550nm)单模光纤,传输距离为 2m~ 40km。 (4)10GBase-LX4采用波分复用技术,在单对光缆上以 4倍波长发送信号,支持 1310nm 单模(传输距离为 2m~10km)或者多模光纤(传输距离为 2 ~ 300m)。 2)工作原理 以太网标准适用曼彻斯特编码和解码,访问控制采用的是 CSMA/CD技术,是一种广 播型的总线标准,工作过程包含侦听、发送、检测、冲突处理 4个处理阶段。 (1)侦听:通过专门的检测单元,在节点准备发送前先侦听总线上是否有数据正在传 输。若“忙”则进入后述的“退避”处理程序,反复进行侦听工作。若“闲”,则采用一定 算法原则(例如“ X-坚持”算法)决定如何发送数据。 X-坚持的 CSMA算法为:当在侦听 中发现线路空闲时,不一定马上发送数据。 1 .非坚持的 CSMA:线路忙,等待一段时间,再侦听;不忙时,立即发送;减少了冲 突,信道利用率降低。 2 . 1坚持的 CSMA:线路忙,继续侦听;不忙时,立即发送;提高信道利用率,增大 了冲突。 3 . p坚持的 CSMA:线路忙,继续侦听;不忙时,根据 p概率进行发送,另外以 1 . p 概率继续侦听(p是一个指定概率值);能够有效平衡通信效率,但复杂。 (2)发送:当确定要发送后,通过发送单元,向总线发送数据。 (3)检测:数据发送后,也可能发生数据冲突。因此,要对数据边发送、边检测,以判 断是否冲突。 (4)冲突处理:当确认发生冲突后,进入冲突处理程序。两种冲突情况如下所述。 1 .若在侦听中发现线路忙,则等待一个延时后再次侦听,若仍然忙,则继续延迟等待, 一直到可以发送为止。每次延时的时间不一致,由退避算法确定延时时长。 2 .若发送过程中发现数据碰撞,则先发送阻塞信息,强化冲突,再进行侦听工作,以 待下次重新发送(方法同侦听阶段)。 两种冲突情况都会涉及一个共同的算法 ——退避算法。当出现线路冲突时,如果冲突 的各节点都采用同样的退避间隔时间,则很容易产生第二次、第三次的碰撞。因此,要求 各个节点的退避间隔时间具有差异性,这时退避算法就派上用场。以下介绍一种典型的退 避算法 ——截断的二进制指数退避算法。当一个节点发现线路忙时,要等待延时时间 M, 然后再进行侦听工作。其中 M取 0~(2k . 1)的一个随机数乘以 512比特传输时间(例 如,对于 10Mb/s传输速率,则为 51.2μs),其中 k为冲突(碰撞)的次数, M的最大值为 1023,即当 k = 10时获得。随后 M始终是 0~1023的一个随机值与 51.2μs的乘积,当 k增加到 16时,就发出错误信息。 在发送数据后发现冲突时,立即发送特殊阻塞信息(连续几字节的全 1,一般为 32~ 48位),以强化冲突信号,使线路上的节点可以尽早探测到冲突的信号,从而减少造成新 冲突的可能性。 冲突检测时间一般设定为 2α,其中 α表示网络中两个最远节点的传输线路延迟时 间。这一设定表示检测时间必须保证满足最远节点发出数据产生冲突后被对方感知的最短 时间。若在 2α时间里没有感知到冲突,则表明发出的数据没有产生冲突,也即只要保证 检测 2α时间,没有必要整个发送过程都进行检测。 将以太网总线放到用应用层、传输层、网络层、数据链路层和物理层 5层定义的以太 网协议栈中来看,它和数据链路层、物理层强相关,可以作为芯片接口,也可以依据需要完 全封装到芯片内。以太网总线无论是以接口的形式出现还是封装到芯片内,都需要遵循一 定的以太网帧格式,这一格式多达 5种,包括 Ethernet V1(1980年发布)、Ethernet V2 (ARPA于 1982年发布)、RAW 802.3(Novell公司于 1983年发布)、IEEE 802.3/802.2 SNAP(1985年发布)和 IEEE 802.3/802.2 LLC(1985年发布)。多种格式是由历史原因造 成的,实际使用时应依据具体情况进行区别,例如,大多数 TCP/IP应用都采用 Ethernet V2帧格式,其中 1997年 IEEE 802.3改回了对这一格式的兼容;而交换机之间的桥协议 数据单元( BPDU)数据包则采用 IEEE 802.3/LLC帧;VLAN Trunk协议如 802.1Q和 Cisco CDP等则采用 IEEE 802.3 SNAP帧。 当今最常使用的 Ethernet V2以太网帧由 RFC 894定义,封装格式主要包括前导码 (7字节 0x55,一串 1、0间隔,用于信号同步)、帧起始定界符 SFD(1字节 0xD5)、目 的 MAC地址( 6B)、源 MAC地址( 6B)、类型 /长度( 2B,其中 0~1500保留为长度域 值,1536~65 535保留为类型域值 0x0600~0xFFFF)、数据( 46~1500B)、CRC帧校验 序列(4B,使用 CRC计算从目的 MAC地址到数据域这部分内容而得到的校验和)。 3.2.4 STM32F4系列芯片对总线的支持 STM32F4系列芯片是针对嵌入式应用开发的高效 SoC,因此对总线的支持包括两个 方面:一是由于集成了 Cortex-M4芯核,所以支持了 ARM系列总线;二是面向嵌入式应 用支持了丰富的总线,以外部接口的形式体现,例如, I2C、SPI、CAN、Ethernet等。综 合起来看,STM32F4系列芯片在对总线协议的支持上,既有通用性,也有特殊性,读者可 以参考芯片接口部分进行交叉学习。 3.3 DMA 从前面的阐述可知,总线是数据交流和控制信号传输的载体。如果涉及大量数据的搬 运,就迫切需要提高通信效率,但数据搬运又不能长时间占用总线,因此需要寻求其他的 方式来进行,如此,直接存储器存取(Direct Memory Access,DMA)就应运而生。