- SPI(Serial Peripheral Interface)是由Motorola公司开发的一种通用数据总线
- 四根通信线:SCK(Serial Clock)、MOSI (Master Output Slave input )、 MISO(Master Input Slave OUtput)、SS (Slave Select)
- 同步、全双工
- 支持总线挂载多设备(一主多从)
由于是弱上拉,输入,由低电平到高电平的时间比较长。所以严格的限制I2C的通讯速度
SPI 一般都可以达到Mhz速度级别。
W25Q64
硬件电路
- 所有的SPI设备SCK,MOSI,MISO分别连在一起
- 主机另外引出多条SS控制线,分别接到各从机的SS引脚
- 输出引脚配置为推挽输出,输入引脚配置为浮或上拉输入
注意:SS是低电平有效
移位寄存器
从机和主机的时钟,都是来自主机的时钟
在波特率发生器,所有移位寄存器向左移动一位,移出去的位放到引脚上。
在波特率发生器,引脚上的位,采样输入到移位寄存器的最低位。
SPI时序基本单元
- 起始条件:SS从高电平切换成低电平
- 终止条件:SS从低电平切换成高电平
起始条件 终止条件
SPI时序基本单元
- 交换一个字节(模式0)
- CPOL=0: 空闲状态,SCK低电平
- CPHA=0:SCK第一个边沿移入数据,第二个边沿移出数据
4. 交换一个字节(模式1)
5. CPOL=0: 空闲状态,SCK低电平
6. CPHA=1:SCK第一个边沿移出数据,第二个边沿移入数据
7. 交换一个字节(模式2)
8. CPOL=1: 空闲状态时,SCK高电平
9. CPHA=0:SCK第一个边沿移入数据,第二个边沿移出数据
10. 交换一个字节(模式3)
11. CPOL=1: 空闲状态时,SCK高电平
12. CPHA=0:SCK第一个边沿移出数据,第二个边沿移入数据
SPI时序
发送指令
向SS指定的设备,发送指令(0x06)
- 指定地址写
- 向SS指定的设备,发送写指令(0x02)
随后在指定地址(Address[23:0])下,写入指定数据(Data)
- 指定地址读
2.向SS指定的设备,发送读指令(0x03)
随后在指定地址(Address[23:0])下 ,读取从机数据(Data)
W25Q64简介
W25Qxx系列是一种低成本、小型化、使用简单的非易失性寄存器, 常应用于数据存储、字库存储、固件程序存储等场景。
存储介质:Nor Flash
时钟频率:80MHz/160MHz(Dual SPI)/320MHz(Qual SPI)
存储容量(24位地址)
W25Q40 : 4Mbit / 512KByte
W25Q80 : 8Mbit / 1MByte
W25Q16 : 16Mbit / 2MByte
W25Q32 : 32Mbit / 4MByte
W25Q64 : 64Mbit / 8MByte
W25Q128 : 128Mbit / 16MByte
W25Q256 : 256Mbit / 32MByte
注意
如果需要快速访问和执行代码,尤其是嵌入式系统和启动加载程序,选择Nor Flash更为适合。
如果需要存储大量数据,且对写入速度要求较高,如多媒体文件、数据记录等,选择NAND Flash更为合适。
硬件电路
W25Q64 框图
W25Q64 是8MB 。将8M分为块(block),有将块(block)分为扇区。页是最小的单位
Flash操作注意事项
注意 Flash 掉电不丢失,同时还要保证容量足够大,成本足够低,所以flash存储器在操作的便捷式做出让步。
写入操作时:
- 写入操作前,必须先进行写使能(防止误操作)
- 每个数据位只能由1改写成0,不能由0改写为1(#### 注意)
- 写入数据前必须先擦除,擦除后,所有数据位变为1
- 擦除必须按最小擦除单元进行。(##### 按块擦除,按扇区擦除)
- 连续写入多字节时,最多写入一页(page)的数据,超过页尾位置的数据,会回到页首覆盖写入。
- 写入操作结束后,芯片进入忙状态,不相应新的读写操作读取
- (想知道什么时候结束忙状态,我们可以使用读取状态寄存器的指令)
读取操作
直接调用读取时序,无需使能,无需额外操作,没有页的限制
读取操作结束后不会进入忙状态,但不能在忙状态时读取。
软件SPI 交换数据代码
通过掩码读取数据
uint8_t MySPI_SwapByte(uint8_t ByteSend)
{
uint8_t i,ByteReceive =0x00;
for(i=0;i<8;i++)
{
MySPI_W_MOSI(ByteSend&(0x80>>i));//通过掩码依次挑出每一位进行操作
MySPI_W_SCK(1);
if(MySPI_R_MISO()==1)
{
ByteReceive |= (0x080>>i);
}
MySPI_W_SCK(0);
}
return ByteReceive;
}
模拟以为寄存器的方式读取数据
uint8_t MySPI_SwapByte(uint8_t ByteSend)
{
uint8_t i,ByteReceive =0x00;
for(i=0;i<8;i++)
{
MySPI_W_MOSI(ByteSend&0x80);//通过掩码依次挑出每一位进行操作
ByteSend <<= 1;
MySPI_W_SCK(1);
if(MySPI_R_MISO()==1)
{
ByteSend|=0x01;
}
MySPI_W_SCK(0);
}
return ByteSend;
}
SPI外设简介
######## 注意 usart是低位先行,而I2C和SPI是高位先行
- STM32内部集成了硬件SPI收发电路,可以有硬件自动执行时钟生成、数据收发等够能,减轻CPU的负担
- 可配置8位\16位数据帧、高位先行/低位先行
- 时钟频率: F pclk / (2,4,8,16,64,128,256)
- 支持多主机模型/主或从模型
- 可精简为半双工/单工通讯
- 支持DMA
- 兼容I2S 协议
STM32F103C8T6 硬件SPI资源 : SPI1,SPI2
APB2的外设,PCLK=72MHz
APB1的外设,PCLK=36MHz
SPI框图
硬件SPI
######SPI外设简介
- stm32内部集成了硬件SPI收发电路,可以由硬件自动执行生成、数据收发等功能,减轻CPU负担
- 可配置8位/16位数据帧,高位先行\低位先行
- 时钟频率: fpclk/(2,4,8,16,64,128,256)
注意: APB2 的时钟是72MHz, APB1的时钟是36MHz - 支持多主机模型、主或从操作
- 可精简为半双工/单工通讯
- 支持DMA
- 兼容I2S协议
STM32F103C8T6 硬件SPI 资源 SPI1,SPI2
SPI 框图
GPT对硬件SPI的回复
STM32 微控制器的硬件 SPI(Serial Peripheral Interface,串行外设接口)是一个同步串行通信协议,通常用于微控制器与外设之间的高速数据交换。硬件 SPI 接口包括主设备(Master)和从设备(Slave),由以下几个引脚组成:
- MOSI(Master Out Slave In):主设备输出,从设备输入。
- MISO(Master In Slave Out):主设备输入,从设备输出。
- SCK(Serial Clock):串行时钟信号,由主设备生成。
- NSS(Slave Select):从设备选择信号,由主设备控制,用于选择特定的从设备进行通信。
图中展示了 STM32 微控制器的 SPI 硬件结构图,具体描述如下:
主要模块和功能
-
接收缓冲区(RX Buffer)和发送缓冲区(TX Buffer):
- 数据通过 MOSI 线传输到接收缓冲区,通过 MISO 线从发送缓冲区传输。
- 数据的写入和读取操作通过这些缓冲区进行。
-
移位寄存器(Shift Register):
- 在发送数据时,移位寄存器将数据逐位传输到 MOSI 线上。
- 在接收数据时,移位寄存器从 MISO 线逐位接收数据。
-
波特率发生器(Baud Rate Generator):
- 控制 SPI 通信的时钟速率,通过 BR[2:0] 位设置。
- 波特率发生器确保数据传输的同步性。
-
控制寄存器(SPI_CR1 和 SPI_CR2):
- SPI_CR1:配置 SPI 的工作模式、数据帧格式、主从模式、时钟极性(CPOL)、时钟相位(CPHA)等。
- BR[2:0]:设置波特率分频系数。
- MSTR:选择主设备或从设备模式。
- CPOL:选择时钟极性。
- CPHA:选择时钟相位。
- SPE:SPI 使能位。
- SPI_CR2:控制数据传输和中断使能。
- TXEIE、RXNEIE:发送缓冲区空和接收缓冲区非空中断使能。
- SSOE:从设备选择输出使能。
- SPI_CR1:配置 SPI 的工作模式、数据帧格式、主从模式、时钟极性(CPOL)、时钟相位(CPHA)等。
-
状态寄存器(SPI_SR):
- 显示 SPI 模块的当前状态,包括:
- BSY:忙标志,表示 SPI 正在进行通信。
- OVR:溢出标志,表示接收缓冲区溢出。
- MODF:模式故障标志。
- CRCERR:CRC 错误标志。
- TXE:发送缓冲区空标志。
- RXNE:接收缓冲区非空标志。
- 显示 SPI 模块的当前状态,包括:
-
主控制电路(Main Control Circuit):
- 控制 SPI 模块的整体操作和数据流动。
工作流程
-
初始化:
- 配置 SPI_CR1 和 SPI_CR2 寄存器,根据应用需求设置波特率、时钟极性和相位、数据帧格式等。
- 使能 SPI 模块(设置 SPE 位)。
-
数据传输:
- 主设备选择从设备(NSS 线拉低)。
- 通过 MOSI 线发送数据,移位寄存器逐位传输数据。
- 从设备通过 MISO 线发送响应数据,主设备接收并存储在接收缓冲区。
-
状态监控:
- 通过读取 SPI_SR 寄存器监控 SPI 模块的状态,如发送缓冲区是否空闲、接收缓冲区是否有数据等。
-
中断处理:
- 根据需要使能中断(如 TXEIE、RXNEIE),处理发送缓冲区空中断和接收缓冲区非空中断。
应用
硬件 SPI 接口广泛应用于各种嵌入式系统中,如:
- 传感器数据采集
- 存储器读写(如 SD 卡、Flash 存储器)
- 显示屏驱动
- 通信模块接口(如无线通信模块)
STM32 的硬件 SPI 模块通过高效的硬件设计和灵活的配置选项,能够满足多种应用场景下的高速数据传输需求。
简化配置SPI框图
主模式全双工连续传输
非连续传输
软件/硬件波形对比