zoukankan      html  css  js  c++  java
  • SPI协议详解

    SPI(Serial Peripheral Interface)总线是一种高速、串行、全双工通信总线,由Motorola公司设计并推广。

    优点是支持全双工通信,传输速率快,SCLK时钟频率最高可以达到50MHz左右。

    缺点是没有流控制机制,不像I2C有应答机制,也不像UART有数据帧校验机制。

    总线引脚

    SPI总线以主从方式工作,支持多主多从、单主多从、单主单从模式,拥有四个信号线:

    MISO – Master Input Slave Output,主设备数据输入,从设备数据输出;
    MOSI – Master Output Slave Input,主设备数据输出,从设备数据输入;
    SCLK – Serial Clock,时钟信号,由主设备产生;

               需要注意的是,SCLK只有才数据传输的过程中产生时钟周期,不进行数据传输时保持高电平或者低电平;
    CS – Chip Select,从设备使能信号,由主设备控制。

    其中CS信号线主要用于片选,实际通信使用MISO/MOSI/SCLK三根信号线。

    单主单从模式如下:

    单主多从模式如下:(每个SPI设备由一根独立的CS片选信号进行片选)

    总线时序

    根据CPOL(时钟极性)和CPHA(时钟相位)的组合区分,SPI总线时序有四种模式。SPI通信的双方必须同时工作在其中一种模式下,往往是主控制器匹配SPI设备的工作模式。

    Mode0:CPOL=0,CPHA=0
    Mode1:CPOL=0,CPHA=1
    Mode2:CPOL=1,CPHA=0
    Mode3:CPOL=1,CPHA=1

    其中SPI 0和SPI 3两种模式最常用。

    CPOL用来控制SCLK信号的Active状态是高电平还是低电平。

    0 - SCLK高电平为Active状态

    1 - SCLK低电平为Active状态

    CPHA用来控制MOSI和MISO在第几个SCLK边沿进行数据采样。

    0 - 第一个SCLK边沿采样,第二个边沿发送

    1 - 第一个SCLK边沿发送,第二个边沿采样

    总结:

    SPI总线协议本身并不复杂,这就意味着复杂性在SPI设备驱动的软件编码上,具体体现在:

    1)SPI总线协议没有数据校验机制,因此,必须根据SPI设备支持的SCLK时钟频率范围设置SPI时钟频率;

    2)SPI控制器的发送是直接将数据写入一个移位寄存器中,该移位寄存器跟随SCLK时钟发送数据;SPI控制器的接收与发送同步进行,也就是说发送数据的同时,也在接收数据,而接收数据是写入一个缓存寄存器中,如果缓存寄存器的值不及时读取的话,后续接收的数据会直接丢弃而不是覆盖到该缓存寄存器中,因此,每一次写数据之后,一定要读取数据,即使读取的数据无意义。

    3)SPI设备往往不会主动发送数据,而是被动应答;而SPI总线只有在主机发送数据的时候才会产生SCLK时钟周期信号,因此,往往读数据时,需要主机往SPI总线上发送任意数据;

    4)SPI设备往往需要特定的时序进行操作,而不能像RAM一样随机读写,比如MMC/SDCard;

  • 相关阅读:
    史上最复杂业务场景_逼出阿里高可用三大法宝
    六一儿童节PHP宝宝又被围剿了,迅速围观!
    程序员常用远程工具有哪些?
    Kotlin真的会取代JAVA吗?
    云通信—连接产品与用户的桥梁
    小团队能做大系统:Cloud_Native云原生架构实践
    打造立体化监控体系的最佳实践——分布式调用跟踪和监控时间
    “机器学习”三重门_“中庸之道”趋若人(深度学习入门系列之四)
    ehcache缓存
    hibernate延迟加载
  • 原文地址:https://www.cnblogs.com/justin-y-lin/p/12348998.html
Copyright © 2011-2022 走看看