SPI 介绍
串行接口 SPI介绍
SPI(Serial Parallel Interface)是微控制器MCU和外围IC(如传感器、ADC、DAC、移位寄存器、SRAM等)之间使用最广泛的接口之一。 本文简要说明SPI接口信息和工作模式,
内容:
引言
术语:
缩略语 | 描述 |
---|---|
SPI | Serial Parallel Interface |
CS | Slave Select |
SCLK | Serial Clock |
MOSI | Master Output, Slave Input |
MISO | Master Input, Slave Output |
第1章 介绍
图 1-1 提供了SPI接口框图。
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是全双工接口,主机和从机可以分别通过MOSI和MISO线路同时发送数据。
在SPI通信期间,数据的发送(串行移出到MOSI总线上)和接收(采样或读入总线(MISO)上的数据)同时进行。 串行时钟沿同步数据的移位和采样。
SPI接口允许用户灵活选择时钟的上升沿或下降沿来采样和/或移位数据。
数据发送和接收遵循高位优先的原则。
数据传输步骤:
- 配置主机和从机的SPI以及其他相关配置;
- 主机使用低电平CS选择选择从机;
- 主机根据配置的波特率向从机发送时钟信号SCLK;
- 主机驱动MOSI向从机发送数据;
- 从机驱动MISO向主机发送数据;
第4章 时钟极性和相位
时钟极性CPOL指定了时钟的空闲电平,有高和低两种。 时钟相位CPHA指定了采样MOSI和MISO的的边沿,有奇数边沿还是偶数边沿两种。 表 3-1 列出了存在的四种时钟模式,根据相关寄存器的配置可选择其一。
表 3-1 通过CPOL和CPHA选择SPI的时钟模式
SPI时钟模式 | SPOL | SPHA | 空闲状态下的时钟极性 | 用于采样MOSI和MISO的时钟边沿 |
---|---|---|---|---|
0 | 0 | 0 | 逻辑低电平 | 数据在奇数时钟边沿采样。 |
1 | 0 | 1 | 逻辑低电平 | 数据在偶数时钟边沿采样。 |
2 | 1 | 0 | 逻辑高电平 | 数据在奇数时钟边沿采样。 |
3 | 1 | 1 | 逻辑高电平 | 数据在偶数时钟边沿采样。 |
图 3-1 列出了SPI时钟模式0,在这种模式下,CPOL为0,CPHA为0。 表明SCLK时钟信号的空闲电平为低电平,存在于MOSI和MISO总线上的数据在时钟奇数边沿被采样。
图 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时钟信号的空闲电平为低电平,存在于MOSI和MISO总线上的数据在时钟偶数边沿被采样。
图 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时钟信号的空闲电平为高电平,存在于MOSI和MISO总线上的数据在时钟奇数边沿被采样。
图 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时钟信号的空闲电平为高电平,存在于MOSI和MISO总线上的数据在时钟偶数边沿被采样。
图 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。 一旦主机使能(拉低)片选信号CS,MOSI/MISO线上的时钟和数据便可用于所选的从机。 如果使能多个片选信号,则MISO线上的数据会被破坏,因为主机无法识别哪个从机正在传输数据。
从 图 5-1 可以看出,随着从机数量的增加,来自主机的片选线的数量也增加。 这会增加主机需要提供的输入和输出数量,并限制可以使用的从机数量。 可以使用其他技术来增加常规模式下的从机数量,例如使用多路复用器产生片选信号CS。
5.2 菊花链模式连接
在菊花链模式下,所有从机的片选信号连接在一起,数据从一个从机传播到下一个从机。 在此配置中,所有从机同时接收同一SPI时钟。来自主机的数据直接送到第一个从机,该从机将数据提供给下一个从机,依此类推。
使用该方法时,由于数据是从一个从机传播到下一个从机,所以传输数据所需的时钟周期数与菊花链中的从机位置成比例。 例如在 图 5-2 所示的8位系统中,为使第3个从机能够获得数据,需要24个时钟脉冲,而常规SPI模式下 图 5-1 只需8个时钟脉冲。
图 5-3 显示了时钟周期和通过菊花链的数据传播。并非所有SPI器件都支持菊花链模式。请参阅产品数据手册以确认菊花链是否可用。
图 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数据"
}
}