SPI通信(使用SPI读写W25Q64)

2024-05-16 01:28
文章标签 使用 通信 读写 spi w25q64

本文主要是介绍SPI通信(使用SPI读写W25Q64),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

SPI通信协议

SPI(Serial Peripheral Interface)是由Motorola公司开发的一种通用数据总线
四根通信线:
        SCLK:串行时钟线,用来提供时钟信号的。
        MOSI:主机输出,从机输入
        MISO:从机输出,主机输入
        SS:从机选择
同步,全双工
支持总线挂载多设备(一主多从
使用SPI通信的设备,如下图所示

硬件电路

1、  所有SPI设备的SCK、MOSI、MISO分别连在一起
•2、 主机另外引出多条SS控制线,分别接到各从机的SS引脚
        主机的SS线都是输出,从机的SS线都是输入。SS线是低电平有效的,主机想跟谁通信,就把对应的SS输出线置为低电平就可以了。(比如,主机初始化之后,所以的SS都输出高电平,这样就是不跟从机通信。当主机需要和从机1进行通信,主机就把SS1输出低电平就可以了。从机1就知道主机再找我,然后主机在数据引脚进行的传输,就只有从机会响应。当主机和从机1通信完成后,就会把SS1置为高电平,这样从机1就知道,主机结束了和我通信。)
        同一时间,主机只能置1个SS为低电平,只能选中一个从机。如果同时选择多个从机,就会导致数据冲突。
3、 输出引脚配置为推挽输出输入引脚配置为浮空或上拉输入
        推挽输出:高低电平均有很强的驱动能力,这将使得SPI引脚信号的下降沿,非常迅速;上升沿,也非常迅速。

移位示意图

移位寄存器:有一个时钟输入端。因为SPI一般都是高位先行的,所以,每来一个时钟,移位寄存器都会向左进行移位。

移位寄存器时钟源是由主机提供的,这里叫波特率发生器。它产生的时钟驱动主机的移位寄存器进行移位。同时,这个时钟也通过SCK引脚进行输出,接到从机的移位寄存器。

移位寄存器接法:主机移位寄存器左边移出去的数据,通过MOSI引脚,输入到从机移位寄存器的有右边。从机左边移出去的数据,通过MISO引脚,输入到主机移位寄存器的右边。

SPI时序基本单元

起始条件

起始条件:SS从高电平切换到低电平

SS是低电平有效,SS从高变到低,是不是就代表选中了某个从机,这就是通信的开始。

终止条件

终止条件:SS从低电平切换到高电平

交换一个字节

1、四种模式

2、模式1

CPOL(时钟极性)=0:空闲状态时,SCK为低电平
CPHA(时钟相位)=0:SCK第一个边沿移入数据第二个边沿移出数据

SCK在第一个边沿就要移入数据,但数据总得先移出,才能移入。所以在模式1的配置下,SCK第一个边沿之前,就要提前开始移出数据了,或者把它称作在第0个边沿移出,在第一个边沿移入。首先,SS下降沿开始通信,现在SCK还没有变化,但是SCK一旦开始变化,就要开始移入数据了。所以此时趁SCK还没变化,SS下降沿时,就要立刻触发移位输出。所以这里的MOSI和MISO的输出是对齐到SS的下降沿,SS下降沿触发了输出,SCK上升沿,就可以采样输入数据了,这样B7就传输完毕。依次循环,SCK下降沿,主机和从机移出数据;SCK上升沿,移入数据。最终在第8个上升沿时,B0位移入完成,整个字节交换完成。

3、模式2

CPOL=0:空闲状态时,SCK为低电平
CPHA=1:SCK第一个边沿移出数据第二个边沿移入数据

SCK第一个边沿,就是上升沿主机和从机同时移出数据,主机通过MOSI移出最高位,此时MOSI的电平就表示了主机要发送数据的B7。从机通过MISO移出最高位,此时MISO表示从机要发送数据的B7。然后时钟运行,产生下降沿,此时主机和从机同时移入数据,也就是进行数据采样。这里主机移出的B7,进入从机移位寄存器的最低位。从机移出的B7,进入主机移位寄存器的最低位。这样,一个时钟脉冲产生完毕,一个数据位传输完毕。依次循环8次,完成一个字节的传输。如果主机只想交换一个字节,那这时就可以置SS为高电平,结束通信。如果主机还想继续交换字节,主机就不必把SS置回高电平。

4、模式3

CPOL=1:空闲状态时,SCK为高电平
CPHA=0:SCK第一个边沿移入数据,第二个边沿移出数据

5、模式4

CPOL=1:空闲状态时,SCK为高电平
CPHA=1:SCK第一个边沿移出数据,第二个边沿移入数据

W25Q64简介

FLASH:是一种掉电不丢失的存储 

        芯片内部flash:64K+512K的512K -- 存放个代码的地方

        芯片外部flash:独立于芯片外部

W25Q64:是flash的一种 -- 有厂家信息

W25Qxx系列是一种低成本、小型化、使用简单的非易失性存储器,
常应用于数据存储、字库存储、固件程序存储等场景
存储介质:Nor Flash(闪存)
时钟频率:80MHz / 160MHz (Dual SPI) / 320MHz (Quad SPI)
存储容量(24位地址):
        W25Q40: 4Mbit / 512KByte                                          
        W25Q80: 8Mbit / 1MByte              
        W25Q16: 16Mbit / 2MByte
        W25Q32: 32Mbit / 4MByte
        W25Q64: 64Mbit / 8MByte
        W25Q128: 128Mbit / 16MByte
        W25Q256: 256Mbit / 32MByte                                
        

硬件电路

W25Q64容量大小

1Byte = 8 BIT

W25Q64  容量大小:  64M BIT    ==  8M字节

W25Q64框图

1、快

首先,这一整个矩形空间里,是所有的存储器。存储器以字节为单位,每个字节都有唯一的地址。W25Q64的地址宽度是24位,3个字节。左下角,第一个字节它的地址是000000h,h代表16进制。之后的空间,地址一次自增,直到最后一个字节,地址是7FFFFFh。

 64KB为一个基本单元,把它划分成若干的快Block,从前往后,依次是快0、快1、等等等。一直分到最后一块,总共8MB,以64KB为一块进行划分,最后分得的块数,就是8MB/64KB=128,所以这里可以分得128快。

2、扇区

在一块里,我们在以4KB为一个单元,进行切分。64KB/4KB=16份。所以在每一块里,都可以分为扇区0,一直到扇区15。每个扇区内的地址范围是XX X0 00------XX XF FF。就是对每一块,在细分为16个扇区的分配方式。

3、页

页是在扇区里,再进行划分。页的大小是256个字节,一个扇区是4KB,以256个字节进行划分,4*1024/256=16页。所以,一个扇区里,可以分为16页。

在这里,每一行就是一页。在一页中,地址变化范围是XX XX 00-----XX XX FF。一页内的地址变化,仅限于地址的最低一个字节。

4、SPI控制逻辑

SPI控制逻辑:芯片内部进行地址锁存、数据读写等操作,都可以由控制逻辑来自动完成。主控芯片通过SPI协议,把指令和数据发给控制逻辑,控制逻辑就会自动去操作内部电路。

状态寄存器:比如芯片是否处于忙碌状态、是否写使能、是否写保护,都可以在这个状态寄存器里体现。

写控制逻辑:和外部的WP引脚相连。显然,这个是配合WP引脚实现硬件写保护的。

高电压生成器:这个是配合Flash进行编程的

页和字节地址锁存/计数器:是用来指定地址的。通过SPI,总共发过来3个字节的地址,因为1页是256字节,所以1页内的字节地址,就取决于最低位的1个字节,而高位的2个字节,就对应的是页地址。

FLASH操作注意事项

写入操作时:
写入操作前, 必须先进行写使能
每个数据位只能由1改写为0,不能由0改写为1
写入数据前必须先擦除 擦除后,所有数据位变为1
擦除必须按最小擦除单元进行
连续写入多字节时,最多写入一页的数据 超过页尾位置的数据,会回到页首覆盖写入
写入操作结束后,芯片进入忙状态,不响应新的读写操作
读取操作时:
直接调用读取时序,无需使能,无需额外操作,没有页的限制,读取操作结束后不会进入忙状态,但不能在忙状态时读取

W25Q64状态寄存器

忙是只读的状态寄存器(S0)被设置为1状态时,表示设备正在执行程序(可能是在擦除芯片)或写状态寄存器指令。这个时候设备将忽略传来的指令,除了读状态寄存器和擦除暂停指令,写指令或写状态指令无效, 当S0为0状态时指示设备已经执行完毕,可以进行下一步操作。

W25Q64指令集

这篇关于SPI通信(使用SPI读写W25Q64)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/993483

相关文章

使用Python构建一个Hexo博客发布工具

《使用Python构建一个Hexo博客发布工具》虽然Hexo的命令行工具非常强大,但对于日常的博客撰写和发布过程,我总觉得缺少一个直观的图形界面来简化操作,下面我们就来看看如何使用Python构建一个... 目录引言Hexo博客系统简介设计需求技术选择代码实现主框架界面设计核心功能实现1. 发布文章2. 加

shell编程之函数与数组的使用详解

《shell编程之函数与数组的使用详解》:本文主要介绍shell编程之函数与数组的使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录shell函数函数的用法俩个数求和系统资源监控并报警函数函数变量的作用范围函数的参数递归函数shell数组获取数组的长度读取某下的

使用Python开发一个带EPUB转换功能的Markdown编辑器

《使用Python开发一个带EPUB转换功能的Markdown编辑器》Markdown因其简单易用和强大的格式支持,成为了写作者、开发者及内容创作者的首选格式,本文将通过Python开发一个Markd... 目录应用概览代码结构与核心组件1. 初始化与布局 (__init__)2. 工具栏 (setup_t

Python虚拟环境终极(含PyCharm的使用教程)

《Python虚拟环境终极(含PyCharm的使用教程)》:本文主要介绍Python虚拟环境终极(含PyCharm的使用教程),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,... 目录一、为什么需要虚拟环境?二、虚拟环境创建方式对比三、命令行创建虚拟环境(venv)3.1 基础命令3

Python Transformer 库安装配置及使用方法

《PythonTransformer库安装配置及使用方法》HuggingFaceTransformers是自然语言处理(NLP)领域最流行的开源库之一,支持基于Transformer架构的预训练模... 目录python 中的 Transformer 库及使用方法一、库的概述二、安装与配置三、基础使用:Pi

关于pandas的read_csv方法使用解读

《关于pandas的read_csv方法使用解读》:本文主要介绍关于pandas的read_csv方法使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录pandas的read_csv方法解读read_csv中的参数基本参数通用解析参数空值处理相关参数时间处理相关

使用Node.js制作图片上传服务的详细教程

《使用Node.js制作图片上传服务的详细教程》在现代Web应用开发中,图片上传是一项常见且重要的功能,借助Node.js强大的生态系统,我们可以轻松搭建高效的图片上传服务,本文将深入探讨如何使用No... 目录准备工作搭建 Express 服务器配置 multer 进行图片上传处理图片上传请求完整代码示例

SpringBoot条件注解核心作用与使用场景详解

《SpringBoot条件注解核心作用与使用场景详解》SpringBoot的条件注解为开发者提供了强大的动态配置能力,理解其原理和适用场景是构建灵活、可扩展应用的关键,本文将系统梳理所有常用的条件注... 目录引言一、条件注解的核心机制二、SpringBoot内置条件注解详解1、@ConditionalOn

Python中使用正则表达式精准匹配IP地址的案例

《Python中使用正则表达式精准匹配IP地址的案例》Python的正则表达式(re模块)是完成这个任务的利器,但你知道怎么写才能准确匹配各种合法的IP地址吗,今天我们就来详细探讨这个问题,感兴趣的朋... 目录为什么需要IP正则表达式?IP地址的基本结构基础正则表达式写法精确匹配0-255的数字验证IP地

使用Python实现全能手机虚拟键盘的示例代码

《使用Python实现全能手机虚拟键盘的示例代码》在数字化办公时代,你是否遇到过这样的场景:会议室投影电脑突然键盘失灵、躺在沙发上想远程控制书房电脑、或者需要给长辈远程协助操作?今天我要分享的Pyth... 目录一、项目概述:不止于键盘的远程控制方案1.1 创新价值1.2 技术栈全景二、需求实现步骤一、需求