SPI、I2C跟UART三种串行总线协议的区别:

(如果想了解SPI和I2C更多详细内容,可看 SPI总线(一):基本原理篇, SPI总线(二):驱动分析篇,SPI总线(三):驱动实例,i2c总线(基本原理),普通IO模拟i2c总线,简单i2c设备驱动实例系列文章)

SPI接口详细讲解 - 百度文库

嵌入式硬件基础之SPI总线详解_Tian Jincheng's Blog-CSDN博客_spi硬件详解

第一个,区别当然是名字:

SPI(Serial Peripheral Interface:串行外设接口);

I2C(INTER IC BUS)

UART(Universal Asynchronous Receiver Transmitter:通用异步收发器)

第二,区别在电气信号线上:

SPI总线由三条信号线组成:串行时钟(SCLK)、串行数据输出(SDO)、串行数据输入(SDI)。SPI总线可以实现 多个SPI设备互相连接。提供SPI串行时钟的SPI设备为SPI主机或主设备(Master),其他设备为SPI从机或从设备(Slave)。主从设备间可以实现全双工通信,当有多个从设备时,还可以增加一条从设备选择线。

如果用通用IO口模拟SPI总线,必须要有一个输出口(SDO),一个输入口(SDI),另一个口则视实现的设备类型而定,如果要实现主从设备,则需输入输出口,若只实现主设备,则需输出口即可,若只实现从设备,则只需输入口即可。

I2C总线是双向、两线(SCL、SDA)、串行、多主控(multi-master)接口标准,具有总线仲裁机制,非常适合在器件之间进行近距离、非经常性的数据通信。在它的协议体系中,传输数据时都会带上目的设备的设备地址,因此可以实现设备组网。

如果用通用IO口模拟I2C总线,并实现双向传输,则需一个输入输出口(SDA),另外还需一个输出口(SCL)。(注:I2C资料了解得比较少,这里的描述可能很不完备)

UART总线是异步串口,因此一般比前两种同步串口的结构要复杂很多,一般由波特率产生器(产生的波特率等于传输波特率的16倍)、UART接收器、UART发送器组成,硬件上由两根线,一根用于发送,一根用于接收。

显然,如果用通用IO口模拟UART总线,则需一个输入口,一个输出口。

第三,从第二点明显可以看出,SPI和UART可以实现全双工,但I2C不行;

第四,看看牛人们的意见吧!

wudanyu:I2C线更少,我觉得比UART、SPI更为强大,但是技术上也更加麻烦些,因为I2C需要有双向IO的支持,而且使用上拉电阻,我觉得抗干扰能力较弱,一般用于同一板卡上芯片之间的通信,较少用于远距离通信。SPI实现要简单一些,UART需要固定的波特率,就是说两位数据的间隔要相等,而SPI则无所谓,因为它是有时钟的协议。

quickmouse:I2C的速度比SPI慢一点,协议比SPI复杂一点,但是连线也比标准的SPI要少。

1、解剖SPI总线

  SPI 接口一般使用 4 条线通信,MISO 主设备数据输入,从设备数据输出。MOSI 主设备数据输出,从设备数据输入。SCLK 时钟信号,由主设备产生。CS 从设备片选信号,由主设备控制。

  SPI接口在Master控制下产生的从器件使能信号和时钟信号,两个双向移位寄存器按位传输进行数据交换,传输数据高位在前,低位在后(MSB)。在SCK的下降沿上数据改变,上升沿一位数据被存入移位寄存器。

  

2、解剖SPI flash

  搞懂了SPI协议之后,下面就让小编来带你轻松操作SPI flash芯片。对flash芯片的操作,一般包括对flash芯片的擦除,编程和读取,各大厂商的SPI flash芯片都大同小异,操作命令基本是没什么变化的,当我们拿到一款芯片,要特别注意芯片的容量,操作分区,下面以旺宏的芯片为例为大家讲解。

  其实,无论是对芯片的擦除,编程还是读取操作,我们大致可以按照以下的套路来:写命令---写地址---写(读)数据。正如以下的时序图一样清晰明了,我们先把片选信号拉低,再发个0x02页编程命令,再发个地址,就可以轻松写数据了。

  依样画葫芦,擦除操作也是一样,甚至更简单,但是我们要注意循环判断状态寄存器的WIP位直至为0为擦除完成,具体循环时间视芯片而定。

  另外,我们要特别注意SPI flash的 OTP区,即(ONE TIME PROGRAMMABLE),也就是说这个区域只能编程一次,编程之后不能再修改及擦除,因此我们操作的时候要特别注意。对OTP区域的读写之前,我们首先要发送进入OTP区域的命令,其他的操作和以上普通flash区域的操作是一样的。

  掌握以上方法,我们就可以轻松操作SPI flash芯片了,当然,对时序这种底层的操作,还需要不断学习和积累

SPI接口介绍(转)

这几天碰到了使用SPI接口的flash,才知道flash还可以是串行的,看来以前真是井底之蛙啊,找了一些SPI接口的资料都不全,后来找到一点英文资料,翻译了一下,加上我的个人理解,凑成一篇了,希望对初学者有点帮助。

SPI接口的全称是"Serial Peripheral Interface",意为串行外围接口,是Motorola首先在其MC68HCXX系列处理器上定义的。SPI接口主要应用在EEPROM,FLASH,实时时钟,AD转换器,还有数字信号处理器和数字信号解码器之间。

SPI接口是在CPU和外围低速器件之间进行同步串行数据传输,在主器件的移位脉冲下,数据按位传输,高位在前,地位在后,为全双工通信,数据传输速度总体来说比I2C总线要快,速度可达到几Mbps。

SPI接口是以主从方式工作的,这种模式通常有一个主器件和一个或多个从器件,其接口包括以下四种信号:

(1)MOSI – 主器件数据输出,从器件数据输入

(2)MISO – 主器件数据输入,从器件数据输出

(3)SCLK – 时钟信号,由主器件产生

(4)/SS  – 从器件使能信号,由主器件控制

在点对点的通信中,SPI接口不需要进行寻址操作,且为全双工通信,显得简单高效。

在多个从器件的系统中,每个从器件需要独立的使能信号,硬件上比I2C系统要稍微复杂一些。

SPI接口在内部硬件实际上是两个简单的移位寄存器,传输的数据为8位,在主器件产生的从器件使能信号和移位脉冲下,按位传输,高位在前,低位在后。如下图所示,在SCLK的下降沿上数据改变,同时一位数据被存入移位寄存器。

SPI接口内部硬件图示:

最后,SPI接口的一个缺点:没有指定的流控制,没有应答机制确认是否接收到数据。

SPI interface

SPI接口介绍
    SPI是由美国摩托罗拉公司推出的一种同步串行传输规范,常作为单片机外设芯片串行扩展接 口。SPI有4个引脚:SS(从器件选择线)、SDO(串行数据输出线)、SDI(串行数据输入线)和SCK(同步串行时钟线)。SPI可以用全双工通信 方式同时发送和接收8(16)位数据,过程如下:主机启动发送过程,送出时钟脉冲信号,主移位寄存器的数据通过SDO移入到从移位寄存器,同时从移位寄存 器中的数据通过SDI移人到主移位寄存器中。8(16)个时钟脉冲过后,时钟停顿,主移位寄存器中的8(16)位数据全部移人到从移位寄存器中,随即又被 自动装入从接收缓冲器中,从机接收缓冲器满标志位(BF)和中断标志位(SSPIF)置“1”。同理,从移位寄存器中的8位数据全部移入到主寄存器中,随 即又被自动装入到主接收缓冲器中.主接收缓冲器满标志位(BF)和中断标志位(SSPIF)置“1”。主CPU检测到主接收缓冲器的满标志位或者中断标志 位置1后,就可以读取接收缓冲器中的数据。同样,从CPU检测到从接收缓冲器满标志位或中断标志位置1后,就可以读取接收缓冲器中的数据,这样就完成了一 次相互通信过程。这里设置dsPIC30F6014为主控制器,ISD4002为从器件,通过SPI口完成通信控制的过程。

SPI总线协议

SPI是一个环形总线结构,由ss(cs)、sck、sdi、sdo构成,其时序其实很简单,主要是在sck的控制下,两个双向移位寄存器进行数据交换。
       假设下面的8位寄存器装的是待发送的数据10101010,上升沿发送、下降沿接收、高位先发送。
       那么第一个上升沿来的时候 数据将会是sdo=1;寄存器=0101010x。下降沿到来的时候,sdi上的电平将所存到寄存器中去,那么这时寄存器=0101010sdi,这样在 8个时钟脉冲以后,两个寄存器的内容互相交换一次。这样就完成里一个spi时序。
       例子:
       假设主机和从机初始化就绪:并且主机的sbuff=0xaa,从机的sbuff=0x55,下面将分步对spi的8个时钟周期的数据情况演示一遍:假设上升沿发送数据

脉冲 主机sbuff 从机sbuff sdi sdo
0 10101010 01010101 0 0
1上 0101010x 1010101x 0 1
1下 01010100 10101011 0 1
2上 1010100x 0101011x 1 0
2下 10101001 01010110 1 0
3上 0101001x 1010110x 0 1
3下 01010010 10101101 0 1
4上 1010010x 0101101x 1 0
4下 10100101 01011010 1 0
5上 0100101x 1011010x 0 1
5下 01001010 10110101 0 1
6上 1001010x 0110101x 1 0
6下 10010101 01101010 1 0
7上 0010101x 1101010x 0 1
7下 00101010 11010101 0 1
8上 0101010x 1010101x 1 0
8下 01010101 10101010 1 0

这 样就完成了两个寄存器8位的交换,上面的上表示上升沿、下表示下降沿,sdi、sdo相对于主机而言的。其中ss引脚作为主机的时候,从机可以把它拉底被 动选为从机,作为从机的是时候,可以作为片选脚用。根据以上分析,一个完整的传送周期是16位,即两个字节,因为,首先主机要发送命令过去,然后从机根据 主机的名准备数据,主机在下一个8位时钟周期才把数据读回来

SPI 总线是Motorola公司推出的三线同步接口,同步串行3线方式进行通信:一条时钟线SCK,一条数据输入线MOSI,一条数据输出线MISO;用于 CPU与各种外围器件进行全双工、同步串行通讯。SPI主要特点有:可以同时发出和接收串行数据;可以当作主机或从机工作;提供频率可编程时钟;发送结束 中断标志;写冲突保护;总线竞争保护等。图3示出SPI总线工作的四种方式,其中使用的最为广泛的是SPI0和SPI3方式(实线表示,  SPI总线四种工作方式

SPI总线接口及时序
   
SPI 模块为了和外设进行数据交换,根据外设工作要求,其输出串行同步时钟极性和相位可以进行配置,时钟极性(CPOL)对传输协议没有重大的影响。如果 CPOL=0,串行同步时钟的空闲状态为低电平;如果CPOL=1,串行同步时钟的空闲状态为高电平。时钟相位(CPHA)能够配置用于选择两种不同的传 输协议之一进行数据传输。如果CPHA=0,在串行同步时钟的第一个跳变沿(上升或下降)数据被采样;如果CPHA=1,在串行同步时钟的第二个跳变沿 (上升或下降)数据被采样。SPI主模块和与之通信的外设音时钟相位和极性应该一致。SPI总线接口时序如图所示。

SPI功能模块的设计

根据功能定义及SPI的工作原理,将整个IP Core分为8个子模块:uC接口模块、时钟分频模块、发送数据FIFO模块、接收数据FIFO模块、状态机模块、发送数据逻辑模块、接收数据逻辑模块以及中断形式模块。

深入分析SPI的四种传输协议可以发现,根据一种协议,只要对串行同步时钟进行转换,就能得到其余的三种协议。为了简化设计规定,如果要连续传输多个数据,在两个数据传输之间插入一个串行时钟的空闲等待,这样状态机只需两种状态(空闲和工作)就能正确工作。

SPI接口:板内常见SPI接口详细介绍 - 知乎

1-接口概述

SPI = Serial Peripheral Interface,是串行外围设备接口,是一种高速,全双工,同步的通信总线。常规只占用四根线,节约了芯片管脚,PCB的布局省空间。现在越来越多的芯片集成了这种通信协议,常见的有EEPROM、FLASH、AD转换器等。

Ø 优点:

支持全双工,push-pull的驱动性能相比open-drain信号完整性更好;

支持高速(100MHz以上);

协议支持字长不限于8bits,可根据应用特点灵活选择消息字长;

硬件连接简单;

Ø 缺点:

相比IIC多两根线;

没有寻址机制,只能靠片选选择不同设备;

没有从设备接受ACK,主设备对于发送成功与否不得而知;

典型应用只支持单主控;

相比RS232 RS485和CAN总线,SPI传输距离短;

2-硬件结构

SPI总线定义两个及以上设备间的数据通信,提供时钟的设备为主设备Master,接收时钟的设备为从设备Slave;

Ø 信号定义如下:

SCK : Serial Clock 串行时钟

MOSI : Master Output, Slave Input 主发从收信号

MISO : Master Input, Slave Output 主收从发信号

SS/CS : Slave Select 片选信号

Ø 电路连接如下:

单个主设备和单个从设备

单个主设备和多个从设备,通过多个片选信号或者菊花链方式实现

3-寄存器类型

Motorola定义的SPI寄存器包括:

SPI Control Register 1 (SPICR1) 控制寄存器1

SPI Control Register 2 (SPICR2) 控制寄存器2

SPI Baud Rate Register (SPIBR) 波特率寄存器

SPI Status Register (SPISR) 状态寄存器 (只读 其余均可读可写)

SPI Data Register (SPIDR) 数据寄存器

通过往寄存器中写入不同的值,设置SPI模块的不同属性。

4- 传输模式

通过设置控制寄存器SPICR1中的CPOL和CPHA位,将SPI可以分成四种传输模式。

CPOL,即Clock Polarity,决定时钟空闲时的电平为高或低。对于SPI数据传输格式没有显著影响。

1 = 时钟低电平时有效,空闲时为高

0 = 时钟高电平时有效,空闲时为低

CPHA,即Clock Phase,定义SPI数据传输的两种基本模式。

1 = 数据采样发生在时钟(SCK)偶数(2,4,6,...,16)边沿(包括上下边沿)

0 = 数据采样发生在时钟(SCK)奇数(1,3,5,...,15)边沿(包括上下边沿)

四种模式如下图所示:

先看第一列两张图(CPHA = 0),采样发生在第一个时钟跳变沿,即数据采样发生在SCK奇数边沿;再看第二列(CPHA =1),采样发生在第二个时钟跳变沿,即数据采样发生在SCK偶数边沿。

第一行两张图,第二行两张图(CPOL = 1),SCK空闲状态为高电平。

主从设备进行SPI通讯时,要确保它们的传输模式设置相同。

其中mode0和mode3最为常见,SPI接口的flash中均会有标注。

5-读写操作

Ø 标准SPI读写为例

片选---读指令---地址---数据读出

片选---写指令---地址---数据写入

Ø Dual I/O Fast Read Sequence Diagram 双路IO

Ø Quad I/O Fast Read Sequence Diagram 四路IO

参考

三种串行总线协议的区别(SPI、I2C和UART)相关推荐

  1. SPI、I2C、UART三种串行总线协议的区别和SPI接口介绍(转)

    SPI.I2C.UART三种串行总线协议的区别 第一个区别当然是名字: SPI(Serial Peripheral Interface:串行外设接口); I2C(INTER IC BUS) UART( ...

  2. SPI、I2C、UART(即串口)三种串行总线详解

    以下内容均来源于网络资源的学习与整理,如有侵权请告知删除. 参考博客 几个串口协议学习整理 UART IIC SPI_mainn的博客-CSDN博客 SPI.I2C.UART三种串行总线的原理.区别及 ...

  3. SPI、I2C、UART三种串行总线的原理、区别及应用

    SPI协议解析,链接如下 https://blog.csdn.net/weiqifa0/article/details/82765892 I2C协议解析,链接如下 https://blog.csdn. ...

  4. SPI、I2C、UART 三种串行总线对比介绍

    转载自https://blog.csdn.net/oqqHuTu12345678/article/details/65445338 参考博客 https://blog.csdn.net/xiaodin ...

  5. 422器件与lvds接收器的区别_SPI、I2C、UART三种串行总线的原理、区别

    SPI.I2C.串口.我相信如果你是从事的是嵌入式开发,一定会用到这三种通信协议,串口的话因为和波特率有关,所以一般的CPU或者MCU只会配有两个或者三个串口,而数据的传输,的话SPI和I2C用得会比 ...

  6. SPI、UART、I2C三种串行总线简介

    是一种 高速.全双工.同步.串行通信总线,3~4线接口,以主从模式工作,收发独立,可以实现多个SPI设备互相连接. 提供SPI串行时钟的SPI设备为SPI主机或主设备(Master),其他设备为SPI ...

  7. 串口UART串行总线协议

    串口UART 串行端口是异步的(不传输时钟相关数据),两个设备在使用串口通信时,必须先约定一个数据传输速率,并且这两个设备各自的时钟频率必须与这个速率保持相近,某一方的时钟频率相差很大都会导致数据传输 ...

  8. 4位快速加法器和4位串行加法器相比_使用混合信号示波器调试串行总线系统

    本应用指南面向的读者是数字系统设计师,他们在研发过程中会用到模拟和数字元器件,包括采用串行总线的微控制器和 DSP 系统.本文讨论调试串行总线设计所面临的挑战和新的解决方案,这些串行总线包括控制器局域 ...

  9. 高速串行总线设计基础(五)揭秘SERDES高速面纱之多相数据提取电路与线路编码方案

    文章目录 前言 多相数据提取电路 线路编码方案 8B/10B编解码 运行差异(Running Disparity) 控制字符 Comma 检测 加扰技术 参考文献 前言 SERDES可以工作在多吉比特 ...

最新文章

  1. 取消tableView上面多出来20个像素
  2. TeeChart用法(网络收集)默认分类 2010-03-05 21:46:05 阅读788 评论0 字号:大中小 .
  3. shell脚本由基础变量及特殊变量($@、$*、$#等)到实战。
  4. python大鱼吃小鱼_python 游戏编程 大鱼吃小鱼
  5. ireport参数传递json_Json传递数据两种方式(json大全)
  6. 两数相除赋值整数变量(T-SQL)
  7. CSDN 蒋涛对话英特尔中国区董事长王锐:我愿是当代的一个开发者
  8. 25. Element nextSibling 属性
  9. lambda 函数或者匿名函数(C++11)
  10. 盒仔机器人_DFROBOT SEN0240 肌电传感器 OYMotion 产品资料 使用教程
  11. volte短信流程-注册
  12. python图片标记_用python找出那些被“标记”的照片
  13. 原生开发跟混合开发两者有什么区别
  14. 【2022网易雷火】游戏研发笔试-AC代码及题目分享
  15. java poi excel导出2003版改成2007版本的时候报错
  16. 聊聊Hibernate和Mybatis的区别
  17. 什么是BOSS业务?
  18. 看了他们的遭遇,我居然不想裸辞了
  19. vue之vue的生命周期、swiper、自定义组件的封装、自定义指令、过滤器、单文件组件及vue-cli
  20. 2022苹果AppStore应用商店上传与APP上传流程必看(基础篇)​

热门文章

  1. springboot集成redis报错找不到bean
  2. java初始化加载类_Java 类的加载和初始化
  3. Miscellaneous
  4. 逝流年沧桑伤感日志_安静得,脑袋总在回忆从前
  5. PVE 定时关机 定时开机
  6. freeswitch实战八(动态生成拨号计划)
  7. 清理桌面状态下鼠标右键“打开好桌道壁纸”选项
  8. CleanMyMac X4.10.6mac上非常强大的系统清理工具
  9. 声网高纯:领域和方向要聚焦,用最专业的方法做最专业的事丨人物专访
  10. 蓝牙助手的介绍以及使用