SPI通讯介绍 以及读写W25Q64(块,扇区,页的区别)

article/2025/8/22 1:40:10

附工程百度网盘链接

链接:https://pan.baidu.com/s/1nCgNb5OyGpABAL657-gX0A?pwd=6666 
提取码:6666

介绍:摩托罗拉开发的一种通用数据总线,

四根通讯线SCK(串行时钟总线),MOSI(主机输出从机输入),MISO(主机输入从机输出),SS(从机选择)而且是同步全双工,支持总线挂载多个设备

有的名字可能是DI,DO,CS,CLK:DO就是设备输入对应接MOSI,DO对应就是设备输出对应接MISI

SPI传输更快,SPI每多挂载一根设备就多一根线,主机要和哪个设备通讯就把谁的SS线拉低电平

 补充:当从机的SS线没有被拉低的时候那么改从机的MISO为高组态,相当于断开

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

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

 SPI的数据传输模式

CPOL(时钟极性)和CPHA(时钟相位)决定了模式

模式0: CPOL=0(空闲状态时SCL为低电平) COHA=0(SCK第一个边沿移入数据,第二个边沿移出数据),它和模式4的区别在于SCL取反

模式1: CPOL=0(空闲状态时SCL为低电平) COHA=1(SCK第一个第一个边沿移出数据,第二个边沿移入数据)它和模式3的区别在于SCL取反

 W25Q64介绍

地址是24位的  (00 00 00 h- 7F FF FF)共计:80 00 00 (HEX) /1024/1024=8M

BLock(块):8M的空间被切割成128块,每块64kb

 扇区:每块64kb又每切割成16个扇区,每扇区4kb(16*4=64kb)

 页:一扇区是4KB,划分成16份每份256字节这就是页,而且擦除数据也只能按照扇区或者块来擦除

下图的00FF00H-00FFFFH刚好256字节

000000h-0000ff之间也是256字节

 所以我们也可以算出W25Q64总共多少页

8M/256kb=32,768页

倒回去算也可以

16(页)*16(扇区)*128(块)=0x80000 

SPI Command & Control Logic:SPI命令与控制逻辑

Status Register:状态寄存器

Write Control Logic:写控制逻辑

我们发送的24位地址例如 00 00 FF  :高位1个字节对应的就是块地址(Page Address Latch / Counter),                                           低位2个字节表示一页内的字节地址(Byte Address Latch / Counter)

这里解释一下为什么高位1个字节对应的就是页地址 低位2个字节表示一页内的字节地址?

先来看块的地址每个块地址都是高两位在变动而第四位是没有变化的

例如:第0块  000000h-00FFFF;

第1块  010000h-01FFFF;

第31块  01F000h-1FFFFF;

再来看看扇区地址变化的都是低四位

并且连续写入的数据量不能超过256字节

 代码部分软件模拟SPI

首先初始化要用到的GPIO

void MySPI_W_SS(uint8_t BitValue){GPIO_WriteBit(GPIOA, GPIO_Pin_4, (BitAction)BitValue);}void MySPI_W_SCK(uint8_t BitValue){GPIO_WriteBit(GPIOA, GPIO_Pin_5, (BitAction)BitValue);}void MySPI_W_MOSI(uint8_t BitValue){GPIO_WriteBit(GPIOA, GPIO_Pin_7, (BitAction)BitValue);}uint8_t MySPI_W_MISO(void){return GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_6);}void MySpi_Init(void)
{RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_7;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA, &GPIO_InitStructure);GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA, &GPIO_InitStructure);MySPI_W_SS(1);MySPI_W_SCK(0);
}

起始和停止信号

void MySPI_Start(void)
{MySPI_W_SS(0);
}
void MySPI_Stop(void)
{MySPI_W_SS(1);
}

模式0发送

//模式0 
uint8_t MySPI_swapByte(uint8_t ByteSend)
{	uint8_t i,Byte=0x00;for(i=0;i<8;i++){MySPI_W_MOSI(ByteSend & (0x80>>i));MySPI_W_SCK(1);if(MySPI_W_MISO()==1){Byte|=(0x80>>i);}MySPI_W_SCK(0);	}return Byte; 
}

模式3发送

//模式03
uint8_t MySPI_swapByte3(uint8_t ByteSend)
{	uint8_t i,Byte=0x00;for(i=0;i<8;i++){MySPI_W_MOSI(ByteSend & (0x80>>i));MySPI_W_SCK(0);if(MySPI_W_MISO()==1){Byte|=(0x80>>i);}MySPI_W_SCK(1);	}return Byte; 
}

 这里解释一下为什么要用模式0和模式3?因为手册这样写的 

读取厂商ID

void W25Q64_ReadID(uint8_t *MID,uint16_t *DID)
{MySPI_Start();MySPI_swapByte3(0X9F);*MID=MySPI_swapByte3(0xff);*DID=MySPI_swapByte3(0xff);*DID <<= 8;*DID|=MySPI_swapByte3(0xff);MySPI_Stop();
}

擦除扇区

//扇区擦除
void W25Q64_SectorErase(uint32_t Address)
{W25Q64_WriteEnable();MySPI_Start();MySPI_swapByte3(W25Q64_SECTOR_ERASE_4KB);MySPI_swapByte3(Address >> 16);MySPI_swapByte3(Address >> 8);MySPI_swapByte3(Address);MySPI_Stop();W25Q64_WaitBusy();
}

页写入

什么叫页,什么叫块,什么叫扇区上边已经解释很清楚了

000000H-0000FF这就是一页,一页刚好256个字节,由于不能跨页写入所以才有了手册里面说的连续写入不能超过256个字节,

什么叫不能跨页写入?例如:我从0000FF这个地址开始往W25Q64里面放4个字节的数据,这样是不行的,放不进去的。只能重新指定页地址也就是起始地址改成第二页的起始地址重新放这样才能放进去

//页写入
void W25Q64_PageProgram(uint32_t Address, uint8_t *DataArray, uint16_t Count)
{uint16_t i;
W25Q64_WriteEnable();
MySPI_Start();
MySPI_swapByte3(W25Q64_PAGE_PROGRAM);
MySPI_swapByte3(Address>>16);
MySPI_swapByte3(Address>>8);	
MySPI_swapByte3(Address);	for ( i = 0; i < Count; i ++){MySPI_swapByte3(DataArray[i]);}MySPI_Stop();	W25Q64_WaitBusy();
}

读数据

//读取数据
void W25Q64_ReadData(uint32_t Address, uint8_t *DataArray, uint32_t Count)
{
uint32_t i;MySPI_Start();MySPI_swapByte3(W25Q64_READ_DATA);MySPI_swapByte3(Address >> 16);MySPI_swapByte3(Address >> 8);MySPI_swapByte3(Address);for (i = 0; i < Count; i ++){DataArray[i] = MySPI_swapByte3(W25Q64_DUMMY_BYTE);}MySPI_Stop();
}

接下来这个是一个实验的函数

往指定块的指定扇区里面的指定页存数据

//页写入
/*   
Block:块地址 0-127
Sector:扇区地址 0-15
Page:页地址 0-15
DataArray:要写入内容 
Count:写入的数量0-15
*/
void W25Q64_AnyProgram(uint8_t Block, uint8_t Sector, uint16_t Page,uint8_t *DataArray, uint16_t Count)
{uint8_t i;//指定块的起始地址(64kb)uint32_t BlockAddressStart=0x000000;//扇区的起始地址uint16_t SectorAddress=0x000000;for(i=0;i<Block;i++){BlockAddressStart+=0x10000;}for(i=0;i<Sector;i++){SectorAddress=BlockAddressStart+0x1000;}//页uint16_t PageAddress=SectorAddress;for(i=0;i<Page;i++){PageAddress=SectorAddress+0x1000;}	W25Q64_SectorErase(PageAddress);W25Q64_PageProgram(PageAddress,DataArray,Count);
}

调用示例

	W25Q64_AnyProgram(0,1,1,ArrayWrite, 3);
//往第0块中的第1扇区里面的第1页,存入ArrayWrite数组里面的数据,存3个W25Q64_ReadData(0x2000, ArrayRead, 4);

实际效果显示没什么问题

 这里说一下为什么读取的时候地址是0X2000,

因为第0块中的第1扇区地址起始是0X001000     而扇区里面的第1页地址是0x002000

 硬件SPI后边更新


http://chatgpt.dhexx.cn/article/YtkVghWr.shtml

相关文章

W25Q64调试

简介 W25Q系列的器件在灵活性和性能方面远远超过普通的串行闪存器件。W25Q64将8M字节的容量分为128个块&#xff0c;每个块大小为64K字节&#xff0c;每个块又分为16个扇区&#xff0c;每个扇区4K个字节。 引脚介绍 串行数据输入、输出和 IOs&#xff08;DI、DO 和 IO0、IO1、…

软件SPI读写W25Q64硬件SPI读写W25Q64

目录 软件SPI读写W25Q64 MySPI W25Q64 主函数 硬件SPI读写W25Q64 软件SPI读写W25Q64 程序整体框架&#xff1a; SPI模块包含通信引脚封装&#xff0c;初始化&#xff0c;SPI三个基本时序单元&#xff08;起始&#xff0c;终止&#xff0c;交换一个字节&#xff09; W2…

W25Q64Flash芯片STM32操作

1、W25Q64Flash芯片介绍 通讯方式&#xff1a;SPI通讯 大小&#xff1a;8M&#xff08;Byte&#xff09; &#xff08;128块&#xff08;Block&#xff09;&#xff0c;每块64K字节&#xff0c;每块16个扇区&#xff08;Sector&#xff09;&#xff0c;每个扇区4K字节&…

STM32学习笔记(十一)丨SPI通信(W25Q64芯片简介,使用SPI读写W25Q64存储器芯片)

本篇文章包含的内容 一、SPI的通信协议及其原理1.1 SPI简介1.2 SPI通信的硬件连接1.3 SPI的时序基本单元1.3.1 起始条件和终止条件1.3.2 交换字节&#xff08;模式0&#xff0c;先移入&#xff0c;再移出&#xff09;1.3.3 交换字节&#xff08;模式1&#xff0c;先移出&#x…

看单片机原理图-外部FLASHW25Q64

系列文章目录 看单片机原理图-最小系统 看单片机原理图-最小系统电源电路 看单片机原理图-输入输出电路LED指示、按键输入 看单片机原理图-红外遥控、EEPROM 看单片机原理图-FLASH 文章目录 系列文章目录前言一、FLASH 前言 硬件&#xff1a;百问网100ASK_STM32F103_MINI开发…

W25Q64 Flash芯片原理与应用方案(含W25Q64中文数据手册)

W25Q64是华邦公司推出的大容量SPI FLASH产品&#xff0c;其容量为64Mb&#xff08;8MB&#xff09;&#xff0c;应用较为广泛。 W25Q系列的器件在灵活性和性能方面远远超过普通的串行闪存器件。W25Q64将8M字节的容量分为128个块&#xff0c;每个块大小为64K字节&#xff0c;每个…

cortex_m3_stm32嵌入式学习笔记(二十一):SPI实验(通信总线)

SPI 是英语 Serial Peripheral interface 的缩写&#xff0c;顾名思义就是串行外围设备接口。是 Motorola首先在其 MC68HCXX 系列处理器上定义的。 SPI 接口主要应用在 EEPROM&#xff0c; FLASH&#xff0c;实时时钟&#xff0c; AD 转换器&#xff0c;还有数字信号处理器和数…

STM-32:SPI通信协议/W25Q64简介—软件SPI读写W25Q64

目录 一、SPI简介1.1电路模式1.2通信原理1.3SPI时序基本单元1.3.1起始和终止1.3.2交换字节 二、W25Q642.1W25Q64简介2.2W25Q64硬件电路2.3W25Q64框图2.4Flash操作注意事项 三、软件SPI读写W25Q643.1接线图3.2程序代码 一、SPI简介 SPI是串行外设接口&#xff08;Serial Periph…

STM32CubeMx之硬件SPI驱动W25Q64

STM32CubeMx之硬件SPI驱动W25Q64 1.SPI简介 SPI是串行外设接口&#xff08;Serial Peripheral Interface&#xff09;的缩写&#xff0c;是一种高速的&#xff0c;全双工&#xff0c;同步的通信总线&#xff0c;并且在芯片的管脚上只占用四根线&#xff0c;节约了芯片的管脚&a…

SPI读写串行FLASH(W25Q64)

文章目录 1、SPI协议1、硬件连接2、通讯时序3、不同的通信模式 2、W25Q64介绍3、SPI读写驱动编写4、源码 1、SPI协议 SPI 协议是由摩托罗拉公司提出的通讯协议(Serial Peripheral Interface)&#xff0c;即串行外围设备接口&#xff0c;是一种高速全双工的通信总线。它被广泛地…

STM32入门开发: 介绍SPI总线、读写W25Q64(FLASH)(硬件+模拟时序)

一、环境介绍 编程软件: keil5 操作系统: win10 MCU型号: STM32F103ZET6 STM32编程方式: 寄存器开发 (方便程序移植到其他单片机) SPI总线: STM32本身支持SPI硬件时序&#xff0c;本文示例代码里同时采用模拟时序和硬件时序两种方式读写W25Q64。 模拟时序更加方便移植到…

树莓派系统介绍

树莓派是一个微型计算机&#xff0c;和普通的电脑没有什么区别&#xff0c;只是体积更小&#xff0c;只有卡片大小&#xff0c;存储能力和计算能力会差一点&#xff0c;主要用于学习&#xff0c;实验所用。 是电脑就要安装操作系统&#xff0c;树莓派官方推荐了两种系统&#…

树莓派 zero linux,树莓派 zero基本调试

回家之前就从网上购买了一堆设备&#xff0c;回去也不能闲着&#xff0c;可以利用家里相对齐全的准备安装调试。结果人还没回来&#xff0c;东西先到了。 购买的核心装备是树莓派zero w&#xff0c;虽然已经知道它比家族大哥树莓派小不少&#xff0c;但拿到手里还是惊奇它的小巧…

树莓派c语言访问mariadb,树莓派之MariaDB

8种机械键盘轴体对比 本人程序员&#xff0c;要买一个写代码的键盘&#xff0c;请问红轴和茶轴怎么选&#xff1f; 安装MariaDB MariaDB是MySQL的一个分支 直接命令行敲入&#xff1a;1sudo apt-get install mariadb-server 即可完成安装。 一开始安装完成后不知道是需要初始化…

python树莓派_树莓派python

广告关闭 腾讯云11.11云上盛惠 &#xff0c;精选热门产品助力上云&#xff0c;云服务器首年88元起&#xff0c;买的越多返的越多&#xff0c;最高返5000元&#xff01; 最初拿到树莓派的时候测试过,没成功,后来发现一张华丽丽的说明图,顿时醒悟了.. 记录下来,主要学习自 :htt…

树莓派硬件介绍及配件选择

目录 树莓派Datasheet下载地址&#xff1a; Raspberry 4B 外观图&#xff1a; 技术规格书&#xff1a; 性能介绍&#xff1a; 树莓派配件选用 电源的选用&#xff1a; 树莓派外壳选用&#xff1a; 内存卡/U盘选用 树莓派Datasheet下载地址&#xff1a; Raspberry Pi …

树莓派Pico开发版

Pico开发版有16个PWM通道非常适合用于舵机及电机的控制[1]。 单板机(4B)、微控制器(Pico)&#xff0c;树莓派支持Micro Python和C编程[3]。Thony是Python的开发环境。 [1]【评测】树莓派Pico开发板详细评测&#xff0c;到底值不值&#xff1f; [2] Pico树莓派中文站。 [3]一…

1-树莓派及配件购买推荐

树莓派4b主板及配件购买推荐。 作者&#xff1a;白宸羽 套餐 购买链接&#xff1a;https://item.taobao.com/item.htm?spma1z10.5-c-s.w4002-22269478747.11.277c1a24rkExbq&id597680312428 TF卡建议选择16g&#xff0c;套餐建议选择“摄像头套餐” HDMI用于连接显示屏&a…

python树莓派编程_python树莓派编程

广告关闭 腾讯云11.11云上盛惠 ,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高返5000元! 例如,你可以用树莓派搭建你自己的家用云存储服务器。? 树莓派用python来进行编程。 树莓派项目的一个核心思想是python编程语言的使用。 python允许树莓派的拥…

树莓派如何第一次启动-树莓派从购买到启动一步一步完全版!

背景 闲来无事&#xff0c;在咸鱼上买了一个树莓派3B。买来配件都十分齐全&#xff0c;于是就想着启动来测试一下。下面是树莓派第一次启动的全过程&#xff0c;包含安装系统。 1 准备工作 1.1所需硬件 笔记本电脑、树莓派3B、16GTF卡、读卡器、电源和电源线共四种。 无需准…