SPI 介绍

Posted by 程建军 on Tuesday, April 23, 2024

SPI 介绍

串行接口 SPI介绍

SPI(Serial Parallel Interface)是微控制器MCU和外围IC(如传感器、ADC、DAC、移位寄存器、SRAM等)之间使用最广泛的接口之一。 本文简要说明SPI接口信息和工作模式,

内容:

引言

术语:

缩略语描述
SPISerial Parallel Interface
CSSlave Select
SCLKSerial Clock
MOSIMaster Output, Slave Input
MISOMaster Input, Slave Output

第1章 介绍

图 1-1 提供了SPI接口框图。

图 1-1

SPI是一种同步、全双工、主从式接口。来自主机或从机的数据在时钟上升沿或下降沿同步。 主机和从机可以同时传输数据。SPI接口可以是3线式或4线式。本文重点介绍常用的4线SPI接口

SPI的数据交换依赖于三个寄存器:

  • 接收数据缓存寄存器。
  • 数据移位寄存器。
  • 发送数据缓存寄存器。

第2章 信号描述

此部分列出了所有端口的名称和描述,包括连接或可能连接到离芯片的输入和输出。

SPI接口只允许有一个主机存在,但可以有多个从机存在。详细介绍见 第5章 多从机SPI

SPI模块共有4个外部引脚:

2.1 MOSI

该引脚用于在SPI模块配置为主机时发送数据,并在配置为从机时接收数据。

2.2 MISO

该引脚用于在SPI模块配置为主机时接收数据,并在配置为从机时发送数据。

2.3 CS

这个引脚用于将选择信号从SPI主机输出到另一个需要进行数据传输的从机。

数据传输只在发出cs信号的主机和接收cs信号的从机之间进行。

2.4 SCLK

这个引脚用于输出时钟。

SPI传输数据在此信号的同步下进行。可能在上升沿同步,也可能在下降沿同步。

第3章 数据传输

要开始SPI通信,主机必须发送时钟信号,并通过使能CS信号选择从机。 片选通常是低电平有效信号。 因此,主机必须在该信号上发送逻辑0以选择从机。

SPI是全双工接口,主机和从机可以分别通过MOSIMISO线路同时发送数据。

在SPI通信期间,数据的发送(串行移出到MOSI总线上)和接收(采样或读入总线(MISO)上的数据)同时进行。 串行时钟沿同步数据的移位和采样。

SPI接口允许用户灵活选择时钟的上升沿或下降沿来采样和/或移位数据。

数据发送和接收遵循高位优先的原则。

数据传输步骤:

  1. 配置主机和从机的SPI以及其他相关配置;
  2. 主机使用低电平CS选择选择从机;
  3. 主机根据配置的波特率向从机发送时钟信号SCLK
  4. 主机驱动MOSI向从机发送数据;
  5. 从机驱动MISO向主机发送数据;

第4章 时钟极性和相位

时钟极性CPOL指定了时钟的空闲电平,有高和低两种。 时钟相位CPHA指定了采样MOSIMISO的的边沿,有奇数边沿还是偶数边沿两种。 表 3-1 列出了存在的四种时钟模式,根据相关寄存器的配置可选择其一。

表 3-1 通过CPOL和CPHA选择SPI的时钟模式

SPI时钟模式SPOLSPHA空闲状态下的时钟极性用于采样MOSIMISO的时钟边沿
000逻辑低电平数据在奇数时钟边沿采样。
101逻辑低电平数据在偶数时钟边沿采样。
210逻辑高电平数据在奇数时钟边沿采样。
311逻辑高电平数据在偶数时钟边沿采样。

图 3-1 列出了SPI时钟模式0,在这种模式下,CPOL为0,CPHA为0。 表明SCLK时钟信号的空闲电平为低电平,存在于MOSIMISO总线上的数据在时钟奇数边沿被采样。

图 3-1

图 3-1 波形代码[点击展开]

{signal: 
[
   {name:'CS', wave: '10.......1'},
   {name:'SCLK', wave: '0.10101010'},
   {name:'MISO', wave: 'x=.=.=.=.x',data:["bit0","bit1","bit2","bit3"]},
   {name:'MOSI', wave: 'x=.=.=.=.x',data:["bit0","bit1","bit2","bit3"]},
 ],
   head:
   {
   tick:0,
   every:1
 },
   foot:
   {
   text:"图 3-1 SPI时钟模式0,CPOL=0,CPHA=0"
   } 
}
    

图 3-2 列出了SPI时钟模式1,在这种模式下,CPOL为0,CPHA为1。 表明SCLK时钟信号的空闲电平为低电平,存在于MOSIMISO总线上的数据在时钟偶数边沿被采样。

图 3-2

图 3-2 波形代码[点击展开]

{signal: 
[
   {name:'CS', wave: '10.......1'},
   {name:'SCLK', wave: '010101010.'},
   {name:'MISO', wave: 'x=.=.=.=.x',data:["bit0","bit1","bit2","bit3"]},
   {name:'MOSI', wave: 'x=.=.=.=.x',data:["bit0","bit1","bit2","bit3"]},
 ],
   head:
   {
   tick:0,
   every:1
 },
   foot:
   {
   text:"图 3-2 SPI时钟模式2,CPOL=0,CPHA=1"
   } 
}
    

图 3-3 列出了SPI时钟模式2,在这种模式下,CPOL为1,CPHA为0。 表明SCLK时钟信号的空闲电平为高电平,存在于MOSIMISO总线上的数据在时钟奇数边沿被采样。

图 3-3

图 3-3 波形代码[点击展开]

{signal: 
[
   {name:'CS', wave: '10.......1'},
   {name:'SCLK', wave: '1101010101'},
   {name:'MISO', wave: 'x=.=.=.=.x',data:["bit0","bit1","bit2","bit3"]},
   {name:'MOSI', wave: 'x=.=.=.=.x',data:["bit0","bit1","bit2","bit3"]},
 ],
   head:
   {
   tick:0,
   every:1
 },
   foot:
   {
   text:"图 3-3 SPI时钟模式3,CPOL=1,CPHA=0"
   } 
}
    

图 3-4 列出了SPI时钟模式3,在这种模式下,CPOL为1,CPHA为1。 表明SCLK时钟信号的空闲电平为高电平,存在于MOSIMISO总线上的数据在时钟偶数边沿被采样。

图 3-4

图 3-4 波形代码[点击展开]

{signal: 
[
   {name:'CS', wave: '10.......1'},
   {name:'SCLK', wave: '1010101011'},
   {name:'MISO', wave: 'x=.=.=.=.x',data:["bit0","bit1","bit2","bit3"]},
   {name:'MOSI', wave: 'x=.=.=.=.x',data:["bit0","bit1","bit2","bit3"]},
 ],
   head:
   {
   tick:0,
   every:1
 },
   foot:
   {
   text:"图 3-4 SPI时钟模式3,CPOL=1,CPHA=1"
   } 
}
    

第5章 多从机SPI

5.1 常规模式连接

在常规模式下,主机需要为每个从机提供单独的片选信号CS。 一旦主机使能(拉低)片选信号CSMOSI/MISO线上的时钟和数据便可用于所选的从机。 如果使能多个片选信号,则MISO线上的数据会被破坏,因为主机无法识别哪个从机正在传输数据。

图 5-1 可以看出,随着从机数量的增加,来自主机的片选线的数量也增加。 这会增加主机需要提供的输入和输出数量,并限制可以使用的从机数量。 可以使用其他技术来增加常规模式下的从机数量,例如使用多路复用器产生片选信号CS

图 5-1

5.2 菊花链模式连接

在菊花链模式下,所有从机的片选信号连接在一起,数据从一个从机传播到下一个从机。 在此配置中,所有从机同时接收同一SPI时钟。来自主机的数据直接送到第一个从机,该从机将数据提供给下一个从机,依此类推。

使用该方法时,由于数据是从一个从机传播到下一个从机,所以传输数据所需的时钟周期数与菊花链中的从机位置成比例。 例如在 图 5-2 所示的8位系统中,为使第3个从机能够获得数据,需要24个时钟脉冲,而常规SPI模式下 图 5-1 只需8个时钟脉冲。

图 5-3 显示了时钟周期和通过菊花链的数据传播。并非所有SPI器件都支持菊花链模式。请参阅产品数据手册以确认菊花链是否可用。

图 5-3

图 5-3 波形代码[点击展开]

{signal: 
[
   {name:'CS', wave:      '10.|.........1'},
   {name:'SCLK', wave:    '101|.01|.01|.1'},
   {name:'M-MOSI', wave:  'x=.|.=.|.=.|.=',data:["bit0-bit7(8     SCLK)","other bits(8     SCLK)","other bits(8     SCLK)"]},
   {name:'S1-MISO', wave: 'x=.|.=.|.=.|.=',data:["bit0-bit7(8     SCLK)","other bits(8     SCLK)","other bits(8     SCLK)"]},
   {name:'S1-MOSI', wave: 'x....=.|.=.|.=',data:["bit0-bit7(8     SCLK)","other bits(8     SCLK)"]},
   {name:'S2-MISO', wave: 'x....=.|.=.|.=',data:["bit0-bit7(8     SCLK)","other bits(8     SCLK)"]},
   {name:'S2-MOSI', wave: 'x........=.|.x',data:["bit0-bit7(8     SCLK)"]},
   {name:'S2-MISO', wave: 'x........=.|.x',data:["bit0-bit7(8     SCLK)"]},
 ],
   foot:
   {
   text:"图 5-3 多从机菊花链方式连接传输8bit数据"
   } 
}