zoukankan      html  css  js  c++  java
  • SPI(Serial Peripheral Interface)协议

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

    全双工:host能与外围从设备之间的发送线和接收线各自独立,能同时进行发送数据和接收数据

    源同步传输

    文章内容

    1. SPI介绍
    2. SPI协议通信时序详解
    3. SPI数据传输方式
    4. SPI总线优缺点 

    1、SPI介绍

    应用场景

    SPI协议主要用于短距离的通信系统中,特别是嵌入式系统:

    存储器RAM,EEPROM,Flash等

    数模转换器A/D, D/A转换器等

    驱动接口LED显示驱动器,I/O接口芯片,UART接收器等。

    主从模式控制:

    SPI以主从方式进行工作,这种模式通常包含一个master和一个或多个slave,需要至少4根线(在单向传输时3根也可以),分别为:

    1. SDO/MOSI(master output slave input):主设备数据输出,从设备数据输入;
    2. SDI/MISO(master input slave output):主设备数据输入,从设备数据输出;
    3. SCLK:时钟信号,由主设备产生
    4. CS/SS:片选信号,主设备控制并用于选择与其通信的从设备。

     

    多Slave的SPI协议

    SPI协议可以操作在一个master对应一个或者多个slave的条件下,此时有多个CS/SS片选信号,但是一个时间只能有一个片选信号有效。

    slave的输出端口MISO都是三态驱动;高电平,低电平和不选中时输出为高阻态

    数据交换(data exchanges)

    SPI设备之间的数据传输称为数据交换不是数据传输。这是因为SPI设备不能在进行数据通信的过程中仅充当transmitter和recieiver的角色,而是在每个时钟周期内,主从SPI设备都会发送1bit大小的数据,相当于主从设备进行了1bit的数据交换。

    在数据的传输过程中,每次接收到的数据必须在下一次数据传输之前被采样,如果之前接收的数据没有被采样,那么这些已经收到的数据可能被丢弃,导致 SPI 模块最终失效,因此,在程序中,一般都会在 SPI 传输完数据之后,去读取 SPI 设备里面的数据,即使这些数据是在我们程序中是没有用的。

    2、SPI协议通信时序详解

    时钟极性CPOL(表示状态):

    时钟极性CPOL用于表示SPI空闲状态是SCLK电平状态;

    CPOL=0表示当SCLK=1时处于有效状态,SCLK=0处于空闲状态;

    CPOL=1表示当SCLK=0时处于有效状态,SCLK=1处于空闲状态;

    时钟相位CPHA(表示收发数据):

    时钟相位CPHA则用于表示数据采样发生在第几个边沿。

    CPHA=0,表示在第1个边沿进行数据采样,第2个边沿进行数据发送;

    CPHA=1,表示在第2个边沿进行数据采样,第1个边沿进行数据发送;

    通信模式:

    SPI通信具有四种不同的模式,不同的从设备可能在出厂时就配置为某种模式,不可改变;但由于通信双方需要工作在同一模式下,由master的CPOL(时钟极性)和CPHA(时钟相位)决定

    SPI通信模式与CPOL和CPHA的关系如下:

    Mode0:CPOL=0,CPHA=0;

    Mode1:CPOL=0,CPHA=1;

    Mode2:CPOL=1,CPHA=0;

    Mode3:CPOL=1,CPHA=1;

    数据采样和数据传输?

    数据采样指SPI主从设备的采样Buffer中的数据,数据传输指主/从设备将采样到的数据传输给从/主设备?

    还是说

    数据采样是slave传输数据给master,数据传输指master传输数据给slave?

    3、SPI数据传输方式

    SSPSR为SPI内部的移位寄存器(Shift Register),根据SPI时钟信号状态,向SSPBUF移入或移除数据,每次移动的数据大小由Bus-Width和Channel-Width决定。

    Bus_Width是指定地址总线到Master之间数据传输的单位。例如,要往Master里的SSPBUF写入16Byte的数据:要先给Master的配置寄存器设置Bus_Width为Byte,然后往Master的Tx_Data移位寄存器的地址总线的入口写入数据,每次写入1Byte的数据,当写完1个Byte后,Tx_Data以为寄存器会自动的把地址总线传来的1Byte数据移入SSPBUF中,传16个Byte需要重复进行16次。

    Channel_Width则是指定Master与Slave之间数据传输的单位。Master内部的移位寄存器会依据Channel_Width自动的把数据从Master_SSPBUF里通过Master_SDO传输到Slave_SDI中,Slave_SSPSR再将数据移入Slave_SSPBUF中。

    通常情况下,Bus_Width≥Channel_Width,以保证不会因为Master和Slave之间数据交换的频率比地址总线与Master之间的数据交换频率要快而导致Master_SSPBUF存放的数据无效。

    SSPBUF

    在每个时钟周期内,Master和Slave之间交换的数据都是SPI内部移位寄存器从SSPBUF中拷贝的。可以通过往SSPBUF对应的寄存器(Tx_Data/Rx_Data register)里读写数据,间接控制SPI设备内部的SSPBUF

    例如:在发送数据之前,向Master的Tx-Data寄存器中写入将要发送的数据,这些数据会被Master-SSPSR移位寄存器根据Bus_Width自动移入Master-SSPBUF中,然后被Master-SSPSR根据Channel-Width从SSPBUF移出,通过输出管脚传给Slave。而Slave-SSPSR则将SDI接收到的数据移入到SSPBUF中。与此同时,Slave也进行相同的操作。

    值得注意的是,在单次数据传输传输完成后,用户程序可以通过Master的Rx-Data寄存器读取Master设备交换后的数据。

    4、SPI总线优缺点

    优点

    • 协议简单利于硬件设计和实现,如不需要向I2C协议中每个从器件都需要一个地址;只需要四根线;
    • 全双工协议,允许在同一时间内收发数据;
    • 三态输出的驱动能力强,相对于I2C的开漏输出,抗干扰能力强,传输稳定;
    • 相对于I2C协议,时钟速率快,没有最大限制;
    • 输入输出的大小没有限制,允许传输多个字节;

    缺点

    • 片选信号线会随着slave的增加而增加;
    • 传输过程中没有确认信号,不能确定从器件是否收到;在SPI Flash中有read statu这个命令确定slave的状态是狗处于busy;
    • 没有校验机制;

    5、SPI代码

  • 相关阅读:
    VSCode中按ESLint规则格式化Javascript代码
    VSCode设置资源管理器字体大小
    Windows下利用安装压缩包安装MySQL
    Windows部署Apache 2.4.46及PHP 8.0.3
    npm设置国内镜像
    IDEA运行Tomcat输出信息乱码
    深入理解jvm虚拟机读书笔记-Java内存区域与内存溢出异常
    Navicat Premium
    mysql安装
    ElasticSearch 基础
  • 原文地址:https://www.cnblogs.com/lizhiqing/p/12694464.html
Copyright © 2011-2022 走看看