一、总线- -信息传送的公共通路

1、知识

1)单工:指数据传输只支持数据在一个方向上传输,即能从A到B就不能从B到A
全双工(full-duplex)的系统允许二台设备间同时进行双向数据传输。一般的电话、手机就是全双工的系统,因为在讲话时同时也可以听到对方的声音。

2)半双工(half-duplex)的系统允许二台设备之间的双向数据传输,但不能同时进行。因此同一时间只允许一设备传送资料,若另一设备要传送资料,需等原来传送资料的设备传送完成后再处理。

3)波特率表示每秒钟传送的码元符号的个数。在数字通信中常常用时间间隔相同的符号来表示一个二进制数字,这样的时间间隔内的信号称为**(二进制)码元**
4)多主配置方式是指多个master机,单个slave的模式,就需要竞争,分出优先级
5)同步异步 ,

同步是指:发送⽅发出数据后,等接收⽅发回响应以后才发下⼀个数据包的通讯⽅式。
异步是指:发送⽅发出数据后,不等接收⽅发回响应,接着发送下个数据包的通讯⽅式。

举个例子来说,一家餐厅吧来了5个客人,同步的意思就是说,来第一个点菜,点了个鱼,好, 厨师去捉鱼杀鱼,过了半小时鱼好了给第一位客人,开始下位一位客人,就这样一个一个来,按顺序来
相同, 异步呢,异步的意思就是来第一位客人,点什么,点鱼,给它一个牌子,让他去一边等吧,下一位客人接着点菜,点完接着点让厨师做去吧,哪个的菜先好就先端出来,
同步的优点是:同步是按照顺序一个一个来,不会乱掉,更不会出现上面代码没有执行完就执行下面的代码, 缺点:是解析的速度没有异步的快;
异步的优点是:异步是接取一个任务,直接给后台,在接下一个任务,一直一直这样,谁的先读取完先执行谁的, 缺点:没有顺序 ,谁先读取完先执行谁的 ,会出现上面的代码还没出来下面的就已经出来了,会报错;

2、总线(Bus)

分散连接:各部件之间使用单独的连线
bus:公共汽车
远距离传输使用串行比并行更不易出错
总线主设备:对总线有控制权
总线从设备:响应从主设备发来的总线命令

总线(Bus)是计算机各种功能部件之间传送信息的公共通信干线,它是由导线组成的传输线束,外部总线(系统总线) 按照计算机所传输的信息种类,可以划分为数据总线、地址总线和控制总线,分别用来传输数据、数据地址和控制信号。

总线是一种内部结构,它是cpu、内存、输入、输出设备传递信息的公用通道,
主机的各个部件通过总线相连接,外部设备通过相应的接口电路再与总线相连接,从而形成了计算机硬件系统。
在计算机系统中,各个部件之间传送信息的公共通路叫总线,微型计算机是以总线结构来连接各个功能部件的。

3、内部总线- - -cpu中的主干道

内部总线是一种内部结构,是cpu、内存、输入、输出设备传递信息的公用通道。
内部总线,将处理器的所有结构单元内部相连。它的宽度可以是8、16、32、64或128位。
如在CPU内部,寄存器之间和算术逻辑部件ALU与控制部件之间传输数据所用的总线称为片内总线(即芯片内部的总线)

1)并发

CAMAC,用于仪表检测系统
工业标准架构总线(ISA)
扩展ISA(EISA)
Low Pin Count(LPC)
微通道(MCA)
MBus
多总线(Multibus),用于工业生产系统
NuBus,或称IEEE 1196
OPTi本地总线,用于早期Intel 80486主板
外围部件互联总线(PCI)
S-100总线(S-100 bus),或称IEEE 696,用于Altair或类似微处理器
SBus或称IEEE 1496
VESA本地总线(VLB,VL-bus)
VERSAmodule Eurocard bus(VME总线)
STD总线(STD bus),用于八位或十六位微处理器系统
Unibus
Q-Bus
PC/104
PC/104 Plus
PC/104 Express
PCI-104
PCIe-104

2)串行

1-Wire
HyperTransport
I²C
串行PCI(PCIe)
串行外围接口总线(SPI总线)
火线i.Link(IEEE 1394)

3、外部总线- - -计算机系统中的主干道

外部总线指缆线和连接器系统,用来传输I/O路径技术指定的数据和控制信号,另外还包括一个总线终结电阻或电路,这个终结电阻用来减弱电缆上的信号反射干扰。
ExternalBus(外部总线) ,即通常所说的总线(Bus)- - -片外总线,是CPU与内存RAM、ROM和输入/输出设备接口之间进行通讯的通路,也称系统总线.

1)并发

ATA:磁盘/磁带周边附件总线,也称 PATA、IDE、EIDE、ATAPI 等等。  (the original ATA is parallel, but see also the recentserial ATA)
HIPPI(HIgh Performance Parallel Interface):高速平行接口。
IEEE-488:也称 GPIB(General-Purpose Instrumentation Bus)或 HPIB(Hewlett-Packard Instrumentation Bus)。
PC card:前身为知名的PCMCIA,常用于笔记本电脑和其它便携式设备,但自从引入USB以及嵌入式网络后,这个总线就慢慢不再使用了。
SCSI(Small Computer System Interface):小型电脑系统接口,磁盘/磁带周边附件总线。

2)串行

USB Universal Serial Bus, 大量外部设备均采用此总线
Serial Attached SCSIand otherserial SCSIbuses
Serial ATA
Controller Area Network(“CAN总线”)
EIA-485
FireWire
Thunderbolt

二、针对某特定的总线的详细描述

1、CAN总线协议- - -串行- - -外部总线- - -计算机系统中的主干道

1)CAN总线特性


CAN是一种基于广播的通讯方式,为了保证总线上的每一个节点都能正确的接收到报文,报文的发送者要求每一个接收节点在报文发送结束前,也就是ACK SLOT 的时间内,作出应答,即在ACK段上,要求接收节点在报文正确性的基础上及时发送一个“显性”位。发送者在发送的同时会监视总线上的数据,如果与发送的数据不一致,则表示发送失败或自己失去仲裁,立即停止发送或转入接收模式。由于发送者在发送数据的同时会向ACK段连续写入2个隐性位,如果发送者在回读过程中监控到ACK SLOT 位为“显性”位,则说明接收者已正确接收;如果发送者在回读过程中监控到ACK SLOT 位为“隐性”位,则说明没有节点正确接收该报文,则发送者会检测到这个隐性位而知道发送失败,此条报文需要重发。

点击链接进入国际标准官网,点击在线浏览平台(OBP),搜索ISO 11898-

只有标准的信息部分是公开的。要查看完整内容,您需要通过单击“购买”按钮购买标准。1瑞士币=7.3014元人民币

a)
CAN 的全称为 Controller Area Network,也就是控制局域网络,简称为 CAN。 CAN 最早是由德国 BOSCH(博世)开发的,目前已经是国际标准(ISO 11898),是当前应用最广泛的现场总线之一。 BOSCH 主要是做汽车电子的,因此 CAN 一开始主要是为汽车电子准备的,事实也是如此, CAN 协议目前已经是汽车网络的标准协议。当然了, CAN 不仅仅应用于汽车电子,经过几十年的发展, CAN 协议的高性能和高可靠性已经得到了业界的认可,目前除了汽车电子以外也广泛应用于工业自动化、医疗、工业和船舶等领域。以汽车电子为例,汽车上有空调、车门、发动机、大量传感器等,这些部件都是通过 CAN总线连在一起形成一个网络,
网络 (由节点和连线构成的图)。车载网络结构如图 66.1.1.1 所示:

图 66.1.1.1 中各个单元通过 CAN 总线连接在一起,每个单元都是独立的 CAN 节点。同一个 CAN 网络中所有单元的通信速度必须一致,不同的网络之间通信速度可以不同。比如图66.1.1.1 中 125Kbps(千比特每秒) 的 CAN 网络下所有的节点速度都是 125Kbps 的,整个网络由一个网关与其他的网络连接。
CAN 的特点主要有一下几点:
①、多主控制
在总线空闲时,所有单元都可以发送消息(多主控制),而两个以上的单元同时开始发送消息时,根据标识符(Identifier 以下称为 ID)决定优先级。 ID 并不是表示发送的目的地址,而是表示访问总线的消息的优先级。两个以上的单元同时开始发送消息时,对各消息 ID 的每个位进行逐个仲裁比较。仲裁获胜(被判定为优先级最高)的单元可继续发送消息,仲裁失利的单元则立刻停止发送而进行接收工作。CAN总线中,如果总线上不能同时有两条标识符是一样。
②、系统的柔软性,即无地址,只有优先级
与总线相连的单元没有类似于“地址”的信息。因此在总线上增加单元时,连接在总线上的其它单元的软硬件及应用层都不需要改变。
③、通信速度快,距离远
最高 1Mbps(距离小于 40M),最远可达 10KM(速率低于 5Kbps)。
④、具有错误检测、错误通知和错误恢复功能
所有单元都可以检测错误(错误检测功能),检测出错误的单元会立即同时通知其他所有单元(错误通知功能),正在发送消息的单元一旦检测出错误,会强制结束当前的发送。强制结束发送的单元会不断反复地重新发送此消息直到成功发送为止(错误恢复功能)。
⑤、故障封闭功能
CAN 可以判断出错误的类型是总线上暂时的数据错误(如外部噪声等)还是持续的数据错误(如单元内部故障、驱动器故障、断线等)。由此功能,当总线上发生持续数据错误时,可将引起此故障的单元从总线上隔离出去。
⑥、连接节点多
CAN 总线是可同时连接多个单元的总线。可连接的单元总数理论上是没有限制的。但实际上可连接的单元数受总线上的时间延迟及电气负载的限制。降低通信速度,可连接的单元数增加;提高通信速度,则可连接的单元数减少。

b)
CAN 电气属性
CAN 总线使用两根线来连接各个单元: CAN_H 和 CAN_L, CAN 控制器通过判断这两根线上的电位差来得到总线电平, CAN 总线电平分为显性电平和隐性电平两种。显性电平表示逻辑“0”,此时 CAN_H 电平比 CAN_L 高,分别为 3.5V 和 1.5V,电位差为 2V。隐形电平表示逻辑“1”,此时 CAN_H 和 CAN_L 电压都为 2.5V 左右,电位差为 0V。
CAN 总线就通过显性和隐形电平的变化来将具体的数据发送出去,如图 66.1.2.1 所示:

CAN 总线上没有节点传输数据的时候一直处于隐性状态,也就是说总线空闲状态的时候一直处于隐性。 CAN 网络中的所有单元都通过 CAN_H 和 CAN_L 这两根线连接在一起,
如图66.1.2.2 所示:

途中所有的 CAN 节点单元都采用 CAN_H 和 CAN_L 这两根线连接在一起, CAN_H 接CAN_H、 CAN_L 接 CAN_L, CAN 总线两端要各接一个 120Ω的端接电阻,用于匹配总线阻抗,吸收信号反射及回拨,提高数据通信的抗干扰能力以及可靠性。CAN 总线传输速度可达 1Mbps/S,最新的 CAN-FD 最高速度可达 5Mbps/S,甚至更高,CAN-FD 不在本章讨论范围,感兴趣的可以自行查阅相关资料。 CAN 传输速度和总线距离有关,总线距离越短,传输速度越快。

2)CAN总线协议

通过 CAN 总线传输数据是需要按照一定协议进行的, CAN 协议提供了 5 种帧格式来传输数据:数据帧、遥控帧、错误帧、过载帧和帧间隔。其中数据帧和遥控帧有标准格式和扩展格式两种,标准格式有 11 位标识符(ID),扩展格式有 29 个标识符(ID)。
这 5 中帧的用途见表66.1.3.1:

a)数据帧
数据帧由 7 段组成:
①、帧起始,表示数据帧开始的段。
②、仲裁段,表示该帧优先级的段。
③、控制段,表示数据的字节数及保留位的段。
④、数据段,数据的内容,一帧可发送 0~8 个字节的数据。
⑤、 CRC 段,检查帧的传输错误的段。
⑥、 ACK 段,表示确认正常接收的段。
⑦、帧结束,表示数据帧结束的段。
数据帧结构如图 66.1.3.1 所示:

图 66.1.3.1 给出了数据帧标准格式和扩展格式两种帧结构,图中 D 表示显性电平 0、 R 表示隐性电平 1, D/R 表示显性或隐性,也就是 0 或 1,我们来简单分析一下数据帧的这 7 个段。
①、帧起始
帧起始很简单,标准格式和扩展格式都是由一个位的显性电平 0 来表示帧起始。
②、仲裁段
仲裁段表示帧优先级,仲裁段结构如图 66.1.3.2 所示:

标准格式和扩展格式的仲裁段不同,从图 66.1.3.2 可以看出,标准格式的 ID 为 11 位,发送顺序是从 ID10 到 ID0,最高 7 位 ID10~ID4 不能全为隐性(1),也就是禁止 0X1111111XXXXX这样的 ID。扩展格式的 ID 为 29 位,基本 ID 从 ID28 到 ID18,扩展 ID 由 ID17 到 ID0,基本ID 与标准格式一样,禁止最高 7 位都为隐性。
③、 控制段
控制段由 6 个位构成,表示数据段的字节数,标准格式和扩展格式的控制段略有不同,如图 66.1.3.3 所示:

图 66.1.3.3 中 r1 和 r0 为保留位,保留位必须以显性电平发送。 DLC 为数据长度,高位在前, DLC 段有效值范围为 0~8。
④、数据段
数据段也就是帧的有效数据,标准格式和扩展格式相同,可以包含 0~8 个字节的数据,从最高位(MSB)开始发送,结构如图 66.1.3.4 所示:

注意,图 66.1.3.4 中数据段的 0~64 为 bit,对应到字节就是 0~8 字节。
⑤、 CRC 段
CRC 段保存 CRC 校准值,用于检查帧传输错误,标准格式和扩展格式相同, CRC 段结构如图 66.1.3.5 所示:

从图 66.1.3.5 可以看出, CRC 段由 15 位的 CRC 值与 1 位的 CRC 界定符组成。 CRC 值的计算范围包括:帧起始、仲裁段、控制段、数据段,接收方以同样的算法进行计算,然后用计算得到的 CRC 值与此 CRC 段进行比较,如果不一致的话就会报错。
⑥、 ACK 段
ACK 段用来确认接收是否正常,标准格式和扩展格式相同, ACK 段结构如图 66.1.3.6 所示:

从图 66.1.3.7 可以看出, ACK 段由 ACK 槽(ACK Slot)和 ACK 界定符两部分组成。 发送单元的 ACK,发送 2 个隐性位,而接收到正确消息的单元在 ACK 槽(ACK Slot)发送显性位,通知发送单元正常接收结束,这个过程叫发送 ACK/返回 ACK。发送 ACK 的是所有接收单元中接收到正常消息的单元, 所谓正常消息是指不含填充错误、格式错误、 CRC 错误的消息,这些接收单元既不处于总线关闭态也不处于休眠态的所有接收单元中。
⑦、帧结束
最后就是帧结束段,标准格式和扩展格式相同,帧结束段结构如图 66.1.3.7 所示:

从图 66.1.3.7 可以看出,帧结束段很简单,由 7 位隐性位构成。

b)遥控帧
接收单元向发送单元请求数据的时候就用遥控帧,遥控帧由 6 个段组成:
①、帧起始,表示数据帧开始的段。
②、仲裁段,表示该帧优先级的段。
③、控制段,表示数据的字节数及保留位的段。
④、 CRC 段,检查帧的传输错误的段。
⑤、 ACK 段,表示确认正常接收的段。
⑥、帧结束,表示数据帧结束的段。
遥控帧结构如图 66.1.3.8 所示:

从图 66.1.3.8 可以看出,遥控帧结构基本和数据帧一样,最主要的区别就是遥控帧没有数据段。遥控帧的 RTR 位为隐性的,数据帧的 RTR 位为显性,因此可以通过 RTR 位来区分遥控帧和没有数据的数据帧。遥控帧没有数据,因此 DLC 表示的是所请求的数据帧数据长度,遥控帧的其他段参考数据帧的描述即可。

c) 错误帧
当接收或发送消息出错的时候使用错误帧来通知,错误帧由错误标志和错误界定符两部分
组成,错误帧结构如图 66.1.3.9 所示

错误标志有主动错误标志和被动错误标志两种,主动错误标志是 6 个显性位,被动错误标志是 6 个隐性位,错误界定符由 8 个隐性位组成。

d)过载帧
接收单元尚未完成接收准备的话就会发送过载帧,过载帧由过载标志和过载界定符构成,过载帧结构如图 66.1.3.10 所示:

过载标志由 6 个显性位组成,与主动错误标志相同,过载界定符由 8 个隐性位组成,与错误帧中的错误界定符构成相同。

e) 帧间隔
帧间隔用于分隔数据帧和遥控帧,数据帧和遥控帧可以通过插入帧间隔来将本帧与前面的任何帧隔开,过载帧和错误帧前不能插入帧间隔,帧间隔结构如图 66.1.3.11 所示:

图 66.1.3.11 中间隔由 3 个隐性位构成,总线空闲为隐性电平,长度没有限制,本状态下表示总线空闲,发送单元可以访问总线。延迟发送由 8 个隐性位构成,处于被动错误状态的单元发送一个消息后的帧间隔中才会有延迟发送。

f)CAN 速率
CAN 总线以帧的形式发送数据,但是最终到总线上的就是“0”和“1”这样的二进制数据,这里就涉及到了通信速率,也就是每秒钟发送多少位数据,前面说了 CAN2.0 最高速度为1Mbps/S。对于 CAN 总线,一个位分为 4 段:
①、同步段(SS)
②、传播时间段(PTS)
③、相位缓冲段 1(PBS1)
④、相位缓冲段 2(PBS2)
这些段由 Tq(Time Quantum)组成, Tq 是 CAN 总线的最小时间单位。帧由位构成,一个位由 4 个段构成,每个段又由若干个 Tq 组成,这个就是位时序。 1 位由多少个 Tq 构成、每个段又由多少个 Tq 构成等,可以任意设定位时序。通过设定位时序,多个单元可同时采样,也可任意设定采样点。 各段的作用和 Tq 数如图 66.1.4.1 所示:

1 个位的构成如图 66.1.4.2 所示:

图 66.1.4.2 中的采样点是指读取总线电平,并将读到的电平作为位值的点。位置在 PBS1结束处。根据这个位时序,我们就可以计算 CAN 通信的波特率了。具体计算方法,我们等下再介绍,前面提到的 CAN 协议具有仲裁功能,下面我们来看看是如何实现的。
在总线空闲态,最先开始发送消息的单元获得发送权。当多个单元同时开始发送时,各发送单元从仲裁段的第一位开始进行仲裁。连续输出显性电平最多的单元可继续发送。实现过程,如图 66.1.4.3 所示:

图 66.1.4.3 中,单元 1 和单元 2 同时开始向总线发送数据,开始部分他们的数据格式是一样的,故无法区分优先级,直到 T 时刻,单元 1 输出隐性电平,而单元 2 输出显性电平,此时单元 1 仲裁失利,立刻转入接收状态工作,不再与单元 2 竞争,而单元 2 则顺利获得总线使用权,继续发送自己的数据。这就实现了仲裁,让连续发送显性电平多的单元获得总线使用权。

关于 CAN 协议就讲到这里,关于 CAN 协议更详细的内容请参考《CAN 入门教程》。

3)32对CAN总线协议的硬件实现

在 STM32 互联型产品中,带有 2 个 CAN 控制器,而我们使用的 STM32F103ZET6 属于增强型,不是互联型,只有 1 个 CAN 控制器。双 CAN 的框图如图 31.1.10 所示:

CAN 接收到的有效报文,被存储在 3 级邮箱深度的 FIFO 中。 FIFO 完全由硬件来管理,从而节省了 CPU 的处理负荷,简化了软件并保证了数据的一致性。
更多详情:看STM32F1 开发指南(库函数版)

2、I2C总线- - -串行- - -内部总线- - -cpu中的主干道

1)I2C总线特性

I2C总线是由NXP(原PHILIPS)公司设计,有十分简洁的物理层定义,其特性如下:
a)只要求两条总线线路:一条串行数据线SDA(Serial data line),一条串行时钟线SCL(Serial clock line)serial 连续的;连载的;
b)每个连接到总线的器件都可以通过唯一的地址和一直存在的简单的主机/从机关系软件设定地址,主机可以作为主机发送器或主机接收器
c)它是一个真正的多主机总线,如果两个或更多主机同时初始化,数据传输可以通过冲突检测和仲裁防止数据被破坏;
d)串行的8 位双向数据传输位速率在标准模式下可达100kbit/s,快速模式下可达400kbit/s,高速模式下可达3.4Mbit/s;
e)连接到相同总线的IC 数量只受到总线的最大电容400pF 限制。

其典型的接口连线如下:
对于主控SOC或MCU,I2C 是支持多从机的,也就是 一个 I2C 控制器下可以挂多个 I2C 从设备 (Device A,(Device B,Device C),这些不同的 I2C从设备有不同的器件地址,这样 I2C 主控制器就可以通过 I2C 设备的器件地址访问指定的 I2C设备了

2)I2C总线协议

a)起始位
顾名思义,也就是 I2C 通信起始标志,通过这个起始位就可以告诉 I2C 从机,“我”要开始进行 I2C 通信了。在 SCL 为 高电平 的时候, SDA 出现 下降沿 就表示为起始位,如图 26.1.1.2 所示:

b)停止位
停止位就是停止 I2C 通信的标志位,和起始位的功能相反。在 SCL 位 高电平 的时候, SDA出现 上升沿 就表示为停止位,如图 26.1.1.3 所示

c)数据传输
I2C 总线在数据传输的时候要保证在 SCL 高电平期间, SDA 上的数据稳定,因此 SDA 上的数据变化只能在 SCL 低电平期间发生 ,如图 26.1.1.4 所示:

d)应答信号
当 I2C 主机发送完 8 位数据以后会将 SDA 设置为输入状态,等待 I2C 从机应答,也就是等到 I2C 从机告诉主机它接收到数据了。应答信号是由从机发出的,主机需要提供应答信号所需的时钟,主机发送完 8 位数据以后紧跟着的一个时钟信号就是给应答信号使用的。 从机通过将 SDA 拉低来表示发出应答信号,表示通信成功,否则表示通信失败 。

AT24C02(可擦除可编程只读存储器)有 三位存储空间( A2 A1 A0) 进一步确定I2C设备的地址。说是进一步确定,是因为对于这类的I2C设备来说
其地址的一部分已经是确定好了的。
例如:数据手册上写道:
Device Address
1K/2K 1 0 1 0 A2 A1 A0 R/W
也就是说对于改I2C设备来说,地址的高8位已经确定了为1010,而低四位则有A2 ----A0来确定, R/W来确定读写方向,读还是写。
例如,我们把A0 --A3全部拉低(出厂一般默认把A0 --A3全部拉低),则该设备的地址为0xA0.
在ARM中,读写方向是用寄存器的单独一位来确定的,有一个7位的域用来保存设备地址。
所以该I2C设备在ARM I2C总线上的地址为0xA0 右移一位 0x50.即1010 0000(B)右移一位,变成101 0000(B)
如果A0–A2 有其他选择的话,则可以根据上述原则求得设备地址。

e)I2C 写时序
主机通过 I2C 总线与从机之间进行通信不外乎两个操作:写和读, I2C 总线单字节写时序如图 26.1.1.5 所示:

借助用声波以空气为总线,进行传播;形象化电信号或光信号在总线上传播。

图 26.1.1.5 就是 I2C 写时序,我们来看一下写时序的具体步骤:
1)、开始信号。
2)、发送 I2C 设备地址,每个 I2C 器件都有一个设备地址,通过发送具体的设备地址来决定访问哪个 I2C 器件。这是一个 8 位的数据,其中高 7 位是设备地址,最后 1 位是读写位,为1 的话表示这是一个读操作,为 0 的话表示这是一个写操作。
3)、 I2C 器件地址后面跟着一个读写位,为 0 表示写操作,为 1 表示读操作。
4)、从机发送的 ACK 应答信号。
5)、重新发送开始信号。
6)、发送要写写入数据的寄存器地址。
7)、从机发送的 ACK 应答信号。
8)、发送要写入寄存器的数据。
9)、从机发送的 ACK 应答信号。
10)、停止信号。
11)注意:不处理应答信号时OLED显示屏,体现了设备对芯片总线的协议的灵活匹配

/*** @brief  I2C发送一个字节* @param  Byte 要发送的一个字节* @retval 无*/
void OLED_I2C_SendByte(uint8_t Byte)
{uint8_t i;for (i = 0; i < 8; i++){OLED_W_SDA(Byte & (0x80 >> i));//清零7位,传输位保留。&:位与指令,0x80=1000 0000(B) OLED_W_SCL(1);OLED_W_SCL(0); //SDA 上的数据变化只能在 SCL 低电平期间发生}OLED_W_SCL(1);  //额外的一个时钟,不处理应答信号OLED_W_SCL(0);
}/*** @brief  OLED写命令* @param  Command 要写入的命令* @retval 无*/
void OLED_WriteCommand(uint8_t Command)
{OLED_I2C_Start();              //主机发送起始信号。OLED_I2C_SendByte(0x78);        //主机发送要读取的 I2C 从设备地址0x78。OLED_I2C_SendByte(0x00);           //发送要写写入数据的寄存器地址0x00。0x00的最高两位Co位和D/C#都位0, Co:连续位 D/C#:数据/命令选择位。 D/C#=1时为数据字节,接下来发来的数据被存储在GDDRAM中;D/C#=0时为命令字节,接下来发来的数据写在相应的命令寄存器中OLED_I2C_SendByte(Command);    //发送要写入寄存器的数据。OLED_I2C_Stop();               //主机发送停止信号。
}

f)I2C 读时序
I2C 总线单字节读时序如图 26.1.1.6 所示

I2C 单字节读时序比写时序要复杂一点,读时序分为 4 大步,第一步是发送设备地址,第二步是发送要读取的寄存器地址,第三步重新发送设备地址,最后一步就是 I2C 从器件输出要读取的寄存器值,我们具体来看一下这几步。
1)、主机发送起始信号。
2)、主机发送要读取的 I2C 从设备地址。
3)、读写控制位,因为是向 I2C 从设备发送数据,因此是写信号。
4)、从机发送的 ACK 应答信号。
5)、重新发送 START 信号。
6)、主机发送要读取的寄存器地址。
7)、从机发送的 ACK 应答信号。
8)、重新发送 START 信号。
9)、重新发送要读取的 I2C 从设备地址。
10)、读写控制位,这里是读信号,表示接下来是从 I2C 从设备里面读取数据。
11)、从机发送的 ACK 应答信号。
12)、从 I2C 器件里面读取到的数据。
13)、主机发出 NO ACK 信号,表示读取完成,不需要从机再发送 ACK 信号了。
14)、主机发出 STOP 信号,停止 I2C 通信。

g)I2C 多字节读写时序
有时候我们需要读写多个字节,多字节读写时序和单字节的基本一致,只是在读写数据的时候可以连续发送多个自己的数据,其他的控制时序都是和单字节一样的。

3)32对I2C总线协议的硬件实现

三、针对某特定的总线的简述

1、SPI

串行外设接口(SPI)允许芯片与外部设备以全双工、同步、串行方式通信。
整体的传输大概可以分为以下几个过程:

  • 主机先将NSS信号拉低,这样保证开始接收数据;
  • 当接收端检测到时钟的边沿信号时,它将立即读取数据线上的信号,这样就得到了一位数据(1bit);
  • 主机发送到从机时:主机产生相应的时钟信号,然后数据一位一位地将从MOSI信号线上进行发送到从机;
  • 主机接收从机数据:如果从机需要将数据发送回主机,则主机将继续生成预定数量的时钟信号,并且从机会将数据通过MISO信号线发送;
    有一个有意思的滚动特征:基于移位寄存器。可用在特定场合减少代码量。



    下图显示了单个主机和单个从机之间的典型SPI连接。

SPI协议详解(图文并茂+超详细)

2、USB

USB功能描述
1)端点
每个USB设备都有一个唯一的设备地址,设备地址是设备连接上主机时由主机分配的,主机主要依靠这个设备地址对USB设备进行访问。但是在设备内部地址会被分的更细,设备会分出一些端点来,每个端点在设备都会有唯一的端点号,这个端点号是设计设备时给定的。如端点0,端点1等。一个设备最多可以包含16个端点,每个端点的地址为0-15。(网上也有说几十个的,有待考究)
其中每个端点地址对应一个方向。例如端点3-IN,端点3-OUT,这两个含义完全不同。但是需要注意其中的一个特殊端点–端点0,每个USB设备必须要有一个端点0,其作用为对设备枚举和对设备进行一些基本的控制功能,端点0也被称为控制端点。并且它与其他的端点还有一个不同之处在于端点0的数据传输方向是双向的,即端点0既可以给主机发送数据,也可以接收主机发送过来的数据,而其它端点均为单向。
虽然有16个端点,但通常我们只用到3个,如下:
1)、EP0:做传输配置和控制信息;
2)、EP1:做数据输入IN_EP;
3)、EP2:做数据输出OUT_EP。
2)四条线
一条USB的传输线分别由地线、电源线、D+、D-四条线构成,D+和D-是差分输入线,它使用的是3.3V的电压(注意哦,与CMOS的5V电平不同),而电源线和地线可向设备提供5V电压,最大电流为500MA(可以在编程中设置的,至于硬件的实现机制,就不要管它了)。
3)其他
USB模块为PC主机和微控制器所实现的功能之间提供了符合USB规范的通信连接。 PC主机和微控制器之间的数据传输是通过共享一专用的数据缓冲区来完成的,该数据缓冲区能被USB外设直接访问。这块专用数据缓冲区的大小由所使用的端点数目和每个端点最大的数据分组大小所决定,每个端点最大可使用512字节缓冲区,最多可用于16个单向或8个双向端点。 USB模块同PC主机通信,根据USB规范实现令牌分组的检测,数据发送/接收的处理,和握手分组的处理。整个传输的格式由硬件完成,其中包括CRC的生成和校验。
每个端点都有一个缓冲区描述块,描述该端点使用的缓冲区地址、大小和需要传输的字节数。当USB模块识别出一个有效的功能/端点的令牌分组时, (如果需要传输数据并且端点已配置)随之发生相关的数据传输。 USB模块通过一个内部的16位寄存器实现端口与专用缓冲区的数据交换。在所有的数据传输完成后,如果需要,则根据传输的方向,发送或接收适当的握手分组。在数据传输结束时, USB模块将触发与端点相关的中断,通过读状态寄存器和/或者利用不同的中断处理程序,微控制器可以确定:
● 哪个端点需要得到服务
● 产生如位填充、格式、 CRC、协议、缺失ACK、缓冲区溢出/缓冲区未满等错误时,正在进行的是哪种类型的传输。USB模块对同步传输和高吞吐量的批量传输提供了特殊的双缓冲区机制,在微控制器使用一个缓冲区的时候,该机制保证了USB外设总是可以使用另一个缓冲区。在任何不需要使用USB模块的时候,通过写控制寄存器总可以使USB模块置于低功耗模(SUSPEND模式)。在这种模式下,不产生任何静态电流消耗,同时USB时钟也会减慢或停止。通过对USB线上数据传输的检测,可以在低功耗模式下唤醒USB模块。也可以将一特定的中断输入源直接连接到唤醒引脚上,以使系统能立即恢复正常的时钟系统,并支持直接启动或停止
时钟系统。



USB通信协议详解看时注意:所有USB设备都会响应主机向设备默认控制管道(Control Pipe)上发送的请求(requests)。 这些请求是使用控制传输(control transfers)进行的。请求和请求的参数通过Setup packet发送给设备

3、USART

发送端的UART将来自控制设备(如CPU)的并行数据转换为串行数据,以串行方式将其发送到接收端的UART,然后由接收端的UART将串行数据转换为并行数据以用于接收设备的正常处理。

这里只需要两条线RX/TX即可在两个UART之间传输数据。
串行数据格式,即 协议层

传输过程

  • 发送端UART从数据总线转换并行数据
  • 发送端UART将起始位,奇偶校验位和停止位添加到数据包中
  • 整个数据包从发送端UART串行发送到接收端UART;接收端UART按照 预先配置好的波特率对数据线进行采样
  • 接收端UART解析接收的数据,丢弃数据包中的起始位,奇偶校验位和停止位
  • 接收UART将串行数据转换回并行数据,并将其传输到接收端的数据总线

UART协议快速扫盲(图文并茂+超详细)

四、UART、SPI 、I2C通信方式对比图

对比项 UART SPI I2C
信号线数目 3根,RX、TX、GND 4根,SDO、SDI、SCLK、SS 2根,SDA、SCLK
设备从属关系 两MCU上的UART都可以人为选择是接收端还是发送端 存在主从设备。SPI用片选信号选择从机 存在主从设备。IIC用地址选择从机。
通信方式 全双工通信 全双工通信 半双工通信
通信速率 速度慢 比I2C总线要快,速度可达到几Mbps I2C的速度比SPI慢
应用领域 1、UART常用于控制计算机与串行设备的芯片2、就是我们经常所说的串口,基本都用于调试。 主要应用在EEPROM,FLASH,实时时钟,AD转换器,还有数字信号处理器和数字信号解码器之间 I2C一般是用在同一个板子上的2个IC之间的通信 ,它可以替代标准的并行总线,连接各种集成电路和功能模块。
传输距离 I2C需要有双向IO的支持,而且使用上拉电阻,抗干扰能力较弱,一般用于同一板卡上芯片之间的通信,较少用于远距离通信
通信特征 异步(没有),一帧可以传5/6/7/8位 同步,SPI允许数据一位一位的传送,甚至允许暂停。从最高位开始传。 同步,电平信号,一次连续8bit。从最高位开始传
协议复杂度 结构比较复杂 SPI实现要比UART简单,UART需要固定的波特率,就是说两位数据的间隔要相等,而SPI则无所谓,因为它是有时钟的协议。 协议比SPI复杂,但是连线比标准的SPI要少
对比 只能与一个设备相连 在点对点的通信中,SPI接口不需要进行寻址操作,且为全双工通信,显得简单高效。在多个从器件的系统中,每个从器件需要独立的使能信号,硬件上比I2C系统要稍微复杂一些。
特色 不存在主从设备(相对SPI 、I2C的特色) 滚动特征 主机可以读写从设备的各个寄存器

五、UART、RS232、RS485的区别

UART、RS232、RS485在串口通信中,主要区别是电平的不同
UART协议快速扫盲(图文并茂+超详细)

通讯协议集合- - -类比道路交通- - -一般肯定有数据电信号线和收发控制电信号线相关推荐

  1. 几种通讯协议的比较RMI Httpinvoker = Hessian Burlap web service

    一.综述 本文比较了RMI,Hessian,Burlap,Httpinvoker,web service等5种通讯协议的在不同的数据结构和不同数据量时的传输性能.RMI是java语言本身提供的通讯协议 ...

  2. 【应用】OPC 通讯协议

    OPC 通讯协议 OPC 通讯协议基础 OPC 简介 OPC 与 OPC UA OPC 逻辑对象模型 OPC 通信方式 Java 实现 OPC 的方式 Java 实现 OPC-client OPC-D ...

  3. jsp+sql智能道路交通信息管理系统的设计与实现(论文+系统+开题报告+答辩PPT+外文翻译)

    毕业设计(论文) 附 件 目 录 任务书1 文献综述4 开题报告9 译文14 译文原文 附件A 毕业设计(论文) 任 务 书 设计(论文)题目 智能道路交通信息管理系统 学 院 计算机学院 专 业 计 ...

  4. 如何看懂串口通讯协议_一文看懂PLC的通讯方式——AB系统(一)

    写在前面 一直以来,PLC跟其他设备的通讯方式都是自动化工程师入门学习的难点和要点.说它难,因为这里面牵扯到了数据通讯的一些知识,大多数从事PLC工作的人员都是从电气.电子.自动化.机电等相关专业出身 ...

  5. Soap、Http、TCP/IP 三个基本的通讯协议有什么区别?

    TCP TCP是面向连接的通信协议,通过三次握手建立连接,通讯完成时要拆除连接,由于TCP是面向连接的所以只能用于端到端的通讯. TCP提供的是一种可靠的数据流服务,采用"带重传的肯定确认& ...

  6. 《上海市道路交通管理条例(修订草案)》揭开面纱,禁停黄线被固化

    备受上海市民关注的<上海市道路交通管理条例(修订草案)>揭开面纱. 截至2015年底,申城机动车实际保有量达430多万辆,各类非机动车总量突破1600万辆,注册机动车驾驶员650多万名,公 ...

  7. 串口服务器通讯协议,串口服务器的硬件组成以及它的通讯模式

    串口服务器是用于通过网络连接两个或多个串行端口设备的网络设备.它使您摆脱物理电缆长度的限制,无论它们在世界上的任何地方,都可以通过以太网连接串口设备.通过使用串行连接方法,设备可以像在没有任何中间设备 ...

  8. 驾照科目一——2、中华人民共和国道路交通安全法实施条例

    中华人民共和国道路交通安全法实施条例 (2004年4月30日中华人民共和国国务院令第405号公布 根据2017年10月7日<国务院关于修改部分行政法规的决定>修订) 第一章 总 则 第一条 ...

  9. 【物联网通信协议】与【物联网通讯协议】

    理清 "通信"与"通讯" 通讯: 传统意义上的"通讯"主要指电话.电报.电传.通讯的"讯"指消息(Message),媒体 ...

  10. mpi tcp连接报错_MPI通讯协议5 - 常见的工业通讯协议有哪些

    MPI通讯协议5 MPI协议,其英文全名为MulTI-point-Interface.在PLC之间可组态为主/主协议或主/从协议.如何操作依赖于设备类型:如果控制站都是s7-300/400系列PLC, ...

最新文章

  1. php文件夹列表,php获取文件夹下面的文件列表和文件夹列表
  2. 最新公开的华为认证通关秘籍来了
  3. 中国汽车电器运营现状与十四五发展规划报告2022-2028年版
  4. arduino编译失败_Arduino编译时失败
  5. font-size用VW来写的方法
  6. 温网告别了两位美女:伊万和莎娃
  7. Simulink之三相桥式半控整流电路
  8. java 属性默认_【急】求教如何设置javabean中某几个属性的默认值
  9. hdu-1068POJ1466 Girls and Boys---最大独立集
  10. 编程验证足球预测算法的准确概率
  11. 计算机桌面图标变小了,电脑桌面图标变小了怎么办
  12. jquery datatables api (转)
  13. 计算机专业学生实习目的,计算机专业学生的实习目的
  14. 简历javaweb项目描述怎么写_java web软件工程师个人简历
  15. HexCompare比较任意Bin/Hex/Srec/s19/elf文件
  16. AutoCAD2018_输出与打印
  17. 寻找春天nbsp;九宫格日记-2011.04.17
  18. 旧手机改造成web服务器并实现内网穿透
  19. 计算机游戏锁怎么打开,键盘锁住了怎么解锁_解锁键盘步骤操作一览
  20. 信息安全-终端安全-Windows安全配置

热门文章

  1. 一颗电阻失效引发的设计思考
  2. 数据结构-第二章(1)-线性结构
  3. Ubuntu下EEUPDATE工具的使用方法
  4. matlab人口增长模型拟合,matlab曲线拟合人口增长模型及其数量预测
  5. 【计算机网络原理】各层的数据传输
  6. 使用adb工具修改android分辨率
  7. java 报表模版 打印_Java报表工具技巧--Style Report报表套打模板设计
  8. flash打造佛光效果实例教程
  9. 基于 Markdown 的中文文档排版规范
  10. php smarty 配置,php Smarty详细配置