zoukankan      html  css  js  c++  java
  • 常用总线协议基础02___SPI

    SPI是串行外设接口(Serial Peripheral Interface)的缩写,是一种高速的,全双工,同步的通信总线。

    >特点:

    优点:支持全双工操作;操作简单;数据传输速率较高。

    缺点:需要占用主机较多的口线(每个从机都需要一根片选线);只支持单个主机;没有指定的流控制,没有应答机制确认是否接收到数据。

    [SPI最明显的缺点就是引脚数量,使用SPI总线相连的一个master和一个slave需要四根线(MISO/MOSI/SCK/CS),每增加一个slave,就需要在master上增加一个CS引脚。当一个master接多个slaves的时候,疯狂增长的引脚连接是难以忍受的,并且对紧凑的PCB layout是一个挑战。]

    >组成:

    SPI的通信原理很简单,它以主从方式工作,这种模式通常有一个主设备和一个或多个从设备,3条通讯总线和1条片选线。如下:

    MOSI/SDO:Master Output Slave Input,顾名思义,即主设备输出/从设备输入。数据从主机输出到从机,主机发送数据。

    MISO/SDI:Master Iutput Slave Onput,主设备输入/从设备输出,数据由从机输出到主机,主机接收数据。

    SCK:时钟信号线,用于通讯同步。该信号由主机产生,其支持的最高通讯速率为fpclk/2,即所挂载总线速率的一半。如SPI2挂载在APB1总线上,则其最高速率为36MHz / 2 = 18MHz。类似木桶效应,两个设备之间通讯时,通讯速率受限于较低速的设备。

    NSS:片选信号线,用于选择通讯的从设备,也可用CS表示。每个从设备都有一条独立的NSS信号线,主机通过将某个设备的NSS线置低电平来选择与之通讯的从设备。所以SPI通讯以NSS线电平置低为起始信号,以NSS线电平被拉高为停止信号。

    在SPI总线上,某一时刻可以出现多个从设备,但只能存在一个主设备,主设备通过片选线来确定要通信的从设备。这就要求从设备的MISO口具有三态特性,使得该口线在设备未被选通时表现为高阻抗

    >通信

    01.停止信号:

    NSS电平由高变低,则产生起始信号;NSS电平由低变高,则产生停止信号。从机检测到自己的NSS线电平被置低,则开始与主机进行通讯;反之,检测到NSS电平被拉高,则停止通讯。

    02.模式:

    CPOL:即在没有数据传输时,时钟的空闲状态的电平。  

    CPHA:即数据的采样时刻。

    时钟极性CPOL是用来配置SCLK的电平出于哪种状态时是空闲态或者有效态,时钟相位CPHA是用来配置数据采样是在第几个边沿:
    CPOL=0,表示当SCLK=0时处于空闲态,所以有效状态就是SCLK处于高电平时
    CPOL=1,表示当SCLK=1时处于空闲态,所以有效状态就是SCLK处于低电平时
    CPHA=0,表示数据采样是在第1个边沿,数据发送在第2个边沿
    CPHA=1,表示数据采样是在第2个边沿,数据发送在第1个边沿

    由CPOL和CPHA的组合而产生了四种的通讯模式:

    (主机和从机需要工作在相同的模式下才能正常通讯。不同的从设备可能在出厂是就是配置为某种模式,这是不能改变的;但可以对主设备的SPI模式进行配置)

    [注意1] SPI协议里的主设备能够控制时钟,因为SPI通信并不像UART或者IIC通信那样有专门的通信周期,有专门的通信起始信号,有专门的通信结束信号;所以SPI协议能够通过控制时钟信号线,当没有数据交流的时候我们的时钟线要么是保持高电平要么是保持低电平

    [注意2] 全双工模式下,接收和发送是同时进行的,即使是只接收数据,也是需要向从设备发送数据,以触发SCK时钟的运行,这样从设备才能向主机发送数据。例如常常通过读取从设备的ID,以此识别设备,我们就需要向设备发送相应指令以获取设备ID(可以通过阅读设备手册获得具体指令)。

    >内部工作机制:

     SSPSR 是 SPI 设备内部的移位寄存器(Shift Register). 它的主要作用是根据 SPI时钟信号状态, 往 SSPBUF 里移入或者移出数据, 每次移动的数据大小由 Bus-Width 以及 Channel-Width 所决定。

    (好多博客里有这张图,也不知道出自哪里。。。)

    参考博客################################################

    本文非原创,只是个人了解的资料整理:

    1.https://www.cnblogs.com/aaronLinux/archive/2004/01/13/6219146.html

    2.https://zhuanlan.zhihu.com/p/36928823

    3.https://zhuanlan.zhihu.com/p/27376153

    4.https://blog.csdn.net/weiqifa0/article/details/82765892

    5.https://zhuanlan.zhihu.com/p/27462822

    6.https://zhuanlan.zhihu.com/p/27489167

    7.https://blog.csdn.net/jasonchen_gbd/article/details/77431951

  • 相关阅读:
    观察者模式
    工厂模式
    单例模式
    关于状态机
    关于memset的错误使用
    关于STL容器
    关于内存及其相关
    python学习手册:第十一章——赋值表达式及打印
    python学习手册:第九章——元组、文件及其他
    python学习手册:第七章——字符串
  • 原文地址:https://www.cnblogs.com/kraken7/p/13766558.html
Copyright © 2011-2022 走看看