SPI通讯

  1. SPI(Serial Peripheral Interface)是由Motorola公司开发的一种通用数据总线
  2. 四根通信线:SCK(Serial Clock)、MOSI (Master Output Slave input )、 MISO(Master Input Slave OUtput)、SS (Slave Select)
  3. 同步、全双工
  4. 支持总线挂载多设备(一主多从)

由于是弱上拉,输入,由低电平到高电平的时间比较长。所以严格的限制I2C的通讯速度

SPI 一般都可以达到Mhz速度级别。

W25Q64

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

硬件电路
  1. 所有的SPI设备SCK,MOSI,MISO分别连在一起
  2. 主机另外引出多条SS控制线,分别接到各从机的SS引脚
  3. 输出引脚配置为推挽输出,输入引脚配置为浮或上拉输入
    在这里插入图片描述
注意:SS是低电平有效
移位寄存器

在这里插入图片描述
从机和主机的时钟,都是来自主机的时钟
在波特率发生器,所有移位寄存器向左移动一位,移出去的位放到引脚上。
在波特率发生器,引脚上的位,采样输入到移位寄存器的最低位。

SPI时序基本单元
  1. 起始条件:SS从高电平切换成低电平
  2. 终止条件:SS从低电平切换成高电平
    在这里插入图片描述
    起始条件 终止条件
SPI时序基本单元
  1. 交换一个字节(模式0)
  2. CPOL=0: 空闲状态,SCK低电平
  3. 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)
在这里插入图片描述

  1. 指定地址写
  2. 向SS指定的设备,发送写指令(0x02)
    随后在指定地址(Address[23:0])下,写入指定数据(Data)
    在这里插入图片描述
  3. 指定地址读
    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. 写入操作前,必须先进行写使能(防止误操作)
  2. 每个数据位只能由1改写成0,不能由0改写为1(#### 注意)
  3. 写入数据前必须先擦除,擦除后,所有数据位变为1
  4. 擦除必须按最小擦除单元进行。(##### 按块擦除,按扇区擦除)
  5. 连续写入多字节时,最多写入一页(page)的数据,超过页尾位置的数据,会回到页首覆盖写入。
  6. 写入操作结束后,芯片进入忙状态,不相应新的读写操作读取
  7. (想知道什么时候结束忙状态,我们可以使用读取状态寄存器的指令)
读取操作

直接调用读取时序,无需使能,无需额外操作,没有页的限制
读取操作结束后不会进入忙状态,但不能在忙状态时读取。

软件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是高位先行

  1. STM32内部集成了硬件SPI收发电路,可以有硬件自动执行时钟生成、数据收发等够能,减轻CPU的负担
  2. 可配置8位\16位数据帧、高位先行/低位先行
  3. 时钟频率: F pclk / (2,4,8,16,64,128,256)
  4. 支持多主机模型/主或从模型
  5. 可精简为半双工/单工通讯
  6. 支持DMA
  7. 兼容I2S 协议

STM32F103C8T6 硬件SPI资源 : SPI1,SPI2
在这里插入图片描述
APB2的外设,PCLK=72MHz
APB1的外设,PCLK=36MHz

SPI框图

在这里插入图片描述

硬件SPI

######SPI外设简介

  1. stm32内部集成了硬件SPI收发电路,可以由硬件自动执行生成、数据收发等功能,减轻CPU负担
  2. 可配置8位/16位数据帧,高位先行\低位先行
  3. 时钟频率: fpclk/(2,4,8,16,64,128,256)
    注意: APB2 的时钟是72MHz, APB1的时钟是36MHz
  4. 支持多主机模型、主或从操作
  5. 可精简为半双工/单工通讯
  6. 支持DMA
  7. 兼容I2S协议
    STM32F103C8T6 硬件SPI 资源 SPI1,SPI2
SPI 框图

在这里插入图片描述
在这里插入图片描述

GPT对硬件SPI的回复

STM32 微控制器的硬件 SPI(Serial Peripheral Interface,串行外设接口)是一个同步串行通信协议,通常用于微控制器与外设之间的高速数据交换。硬件 SPI 接口包括主设备(Master)和从设备(Slave),由以下几个引脚组成:

  1. MOSI(Master Out Slave In):主设备输出,从设备输入。
  2. MISO(Master In Slave Out):主设备输入,从设备输出。
  3. SCK(Serial Clock):串行时钟信号,由主设备生成。
  4. NSS(Slave Select):从设备选择信号,由主设备控制,用于选择特定的从设备进行通信。

图中展示了 STM32 微控制器的 SPI 硬件结构图,具体描述如下:

主要模块和功能

  1. 接收缓冲区(RX Buffer)和发送缓冲区(TX Buffer)

    • 数据通过 MOSI 线传输到接收缓冲区,通过 MISO 线从发送缓冲区传输。
    • 数据的写入和读取操作通过这些缓冲区进行。
  2. 移位寄存器(Shift Register)

    • 在发送数据时,移位寄存器将数据逐位传输到 MOSI 线上。
    • 在接收数据时,移位寄存器从 MISO 线逐位接收数据。
  3. 波特率发生器(Baud Rate Generator)

    • 控制 SPI 通信的时钟速率,通过 BR[2:0] 位设置。
    • 波特率发生器确保数据传输的同步性。
  4. 控制寄存器(SPI_CR1 和 SPI_CR2)

    • SPI_CR1:配置 SPI 的工作模式、数据帧格式、主从模式、时钟极性(CPOL)、时钟相位(CPHA)等。
      • BR[2:0]:设置波特率分频系数。
      • MSTR:选择主设备或从设备模式。
      • CPOL:选择时钟极性。
      • CPHA:选择时钟相位。
      • SPE:SPI 使能位。
    • SPI_CR2:控制数据传输和中断使能。
      • TXEIE、RXNEIE:发送缓冲区空和接收缓冲区非空中断使能。
      • SSOE:从设备选择输出使能。
  5. 状态寄存器(SPI_SR)

    • 显示 SPI 模块的当前状态,包括:
      • BSY:忙标志,表示 SPI 正在进行通信。
      • OVR:溢出标志,表示接收缓冲区溢出。
      • MODF:模式故障标志。
      • CRCERR:CRC 错误标志。
      • TXE:发送缓冲区空标志。
      • RXNE:接收缓冲区非空标志。
  6. 主控制电路(Main Control Circuit)

    • 控制 SPI 模块的整体操作和数据流动。

工作流程

  1. 初始化

    • 配置 SPI_CR1 和 SPI_CR2 寄存器,根据应用需求设置波特率、时钟极性和相位、数据帧格式等。
    • 使能 SPI 模块(设置 SPE 位)。
  2. 数据传输

    • 主设备选择从设备(NSS 线拉低)。
    • 通过 MOSI 线发送数据,移位寄存器逐位传输数据。
    • 从设备通过 MISO 线发送响应数据,主设备接收并存储在接收缓冲区。
  3. 状态监控

    • 通过读取 SPI_SR 寄存器监控 SPI 模块的状态,如发送缓冲区是否空闲、接收缓冲区是否有数据等。
  4. 中断处理

    • 根据需要使能中断(如 TXEIE、RXNEIE),处理发送缓冲区空中断和接收缓冲区非空中断。

应用

硬件 SPI 接口广泛应用于各种嵌入式系统中,如:

  • 传感器数据采集
  • 存储器读写(如 SD 卡、Flash 存储器)
  • 显示屏驱动
  • 通信模块接口(如无线通信模块)

STM32 的硬件 SPI 模块通过高效的硬件设计和灵活的配置选项,能够满足多种应用场景下的高速数据传输需求。

简化配置SPI框图

在这里插入图片描述

主模式全双工连续传输

在这里插入图片描述

非连续传输

在这里插入图片描述

软件/硬件波形对比

在这里插入图片描述
在这里插入图片描述

  • 16
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Vivado是赛灵思公司(Xilinx)提供的一款集成电路开发套件,用于FPGA设计和嵌入式系统开发。SPI(Serial Peripheral Interface)是一种串行外设接口通信协议,用于在微控制器或其他数字集成电路之间传输数据。 在Vivado中进行SPI通讯,我们需要先设计相应的电路,并配置引脚和通信参数。首先,在Vivado设计工程中创建一个新的项目,并添加所需的硬件模块。然后,我们可以使用Vivado开发环境的IP Catalog来选择合适的SPI IP核。 接下来,我们需要对IP核进行配置,包括指定时钟频率、数据位宽、模式(主/从模式)、传输速率等。设置完成后,可以生成IP核,并将其添加到设计中。在设计中,我们还需要添加其他所需的模块,如处理器等。 完成硬件设计后,我们可以进行FPGA逻辑设计,包括将SPI模块与其他逻辑模块进行连接,并编写相应的逻辑代码。这些代码描述了SPI通讯的协议和控制流程,以确保正确的数据传输。 最后,我们需要将设计综合为比特流文件,并下载到FPGA设备中进行验证和测试。通过连接外部设备(如传感器、存储器等)到FPGA的SPI接口,我们可以进行数据传输和通讯测试。 总而言之,在Vivado中进行SPI通讯需要进行硬件设计、IP核配置、逻辑设计和测试验证等步骤。通过正确的配置和编写相应的代码,我们可以实现可靠的SPI通讯,并与其他数字集成电路或外部设备进行数据交互。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值