stm32用spi开发W25Q128(Flash闪存芯片)

news/2024/11/16 8:29:45/文章来源:https://www.cnblogs.com/shishusheng/p/18306040

前提提要spi概念

目录
  • stm32用spi开发W25Q128(Flash闪存芯片)
    • W25Q128(Flash闪存芯片)介绍
      • 内存分布
      • 引脚说明
      • 指令介绍
        • (1) 写使能指令 0x06
        • (2) 读状态寄存器 0x35
        • (3) 写失能指令 0x04
        • (4) 擦除扇区指令 0x20
        • (5) 读取厂商和设备ID 0x90
    • 代码

stm32用spi开发W25Q128(Flash闪存芯片)

W25Q128(Flash闪存芯片)介绍

串行Flash芯片,型号是W25Q128,容量是128Mbit,该存储IC采用SPI接口进行通信。

* 可编程块>扇区>可编程页
* 1个扇区 == 16个可编程页== 4KB
* 1个可编程块 == 16个扇区==64KB
* 该存储IC由65536个可编程页组成,每个可编程页的大小是256字节,所以存储IC的容量是16MB
* 一次最多可以编程256字节

内存分布

1个可编程块是由16个可编程扇区组成
该存储IC一共有256个可编程块,一个可编程块是64KB

image

引脚说明

image

image

指令介绍

(1) 写使能指令 0x06

折叠重要但又不重要的图片

image

(2) 读状态寄存器 0x35

折叠重要但又不重要的图片

image

(3) 写失能指令 0x04

折叠重要但又不重要的图片

image

(4) 擦除扇区指令 0x20

折叠重要但又不重要的图片

image
image

(5) 读取厂商和设备ID 0x90

折叠重要但又不重要的图片

image

代码

点击查看代码

void W25Q128_Config(void)
{SPI_InitTypeDef  SPI_InitStructure;GPIO_InitTypeDef GPIO_InitStructure;//打开SPI1的时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE);//打开GPIOB端口的时钟RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB,ENABLE);//选择IO口的复用功能GPIO_PinAFConfig(GPIOB, GPIO_PinSource3, GPIO_AF_SPI1);		//SCKGPIO_PinAFConfig(GPIOB, GPIO_PinSource4, GPIO_AF_SPI1);		//MISOGPIO_PinAFConfig(GPIOB, GPIO_PinSource5, GPIO_AF_SPI1);     	//MOSIGPIO_InitStructure.GPIO_Mode 	= GPIO_Mode_AF;					//复用模式GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_DOWN;GPIO_InitStructure.GPIO_Pin 	= GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5;GPIO_Init(GPIOB, &GPIO_InitStructure);//配置CS片选引脚  输出模式  GPIO_InitStructure.GPIO_Pin 	= GPIO_Pin_14;GPIO_InitStructure.GPIO_Mode 	= GPIO_Mode_OUT;GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_PuPd 	= GPIO_PuPd_NOPULL;GPIO_Init(GPIOB, &GPIO_InitStructure);//片选引脚,空闲状态为高电平W25Q128_CS(1);//配置SPI1  W25Q128存储IC支持模式0和模式3SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;	//全双工SPI_InitStructure.SPI_Mode = SPI_Mode_Master;							//主模式SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;						//8bit数据位SPI_InitStructure.SPI_CPOL = SPI_CPOL_High;							//时钟极性  1SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;							//时钟相位  1    11 --模式3SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;								//软件控制CS片选	SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_4;	SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;					//高位先出SPI_Init(SPI1, &SPI_InitStructure);//使能SPI1SPI_Cmd(SPI1, ENABLE);}//发送一个字节,并且会得到一个字节
uint8_t W25Q128_SendByte(uint8_t byte)
{/*!< Loop while DR register in not emplty */while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET);/*!< Send byte through the SPI1 peripheral */SPI_I2S_SendData(SPI1, byte);/*!< Wait to receive a byte */while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) == RESET);/*!< Return the byte read from the SPI bus */return SPI_I2S_ReceiveData(SPI1);
}//读取设备ID   0x17
uint8_t W25Q128_ReadDeviceID(void)
{uint8_t device_id = 0;//1.把片选引脚拉低W25Q128_CS(0);//2.MCU发送指令  0x90W25Q128_SendByte(0x90);//3.MCU发送地址W25Q128_SendByte(0x00);W25Q128_SendByte(0x00);W25Q128_SendByte(0x00);//4.MCU提供脉冲,得到厂商ID W25Q128_SendByte(0xFF);//5.MCU提供脉冲,得到设备IDdevice_id = W25Q128_SendByte(0xFF);//6.把片选引脚拉高W25Q128_CS(1);return device_id;
}int main()
{uint8_t buf[128] = {0};//1.硬件的初始化USART1_Config(9600);W25Q128_Config();//2.读取W25Q128的设备IDsprintf((char *)buf,"Device ID = %#X\r\n",W25Q128_ReadDeviceID());USART1_SendString((char *)buf);while(1){}
}

重要:模拟spi可以看上篇文章,主要是将端口初始化修改还有传输数据修改即可

** #define W25Q128_CS(n) (n) ? GPIO_SetBits(GPIOB,GPIO_Pin_14) : GPIO_ResetBits(GPIOB,GPIO_Pin_14) **


参考李明轩老师笔记

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/744887.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

需求流程

产品愿景目标用户:学校内专业、学院的羽毛球运动员、教练以及教师,用于管理羽毛球比赛积分和晋级信息。 他们的需要或机会:提供一个方便的平台来记录和管理学校内羽毛球比赛数据,包括积分、排名以及教师的比赛晋级信息,以激励学生参与体育活动,促进羽毛球比赛的发展和提升…

【Azure Developer】C#/.NET 静态函数中this关键字的作用

问题描述 在查看.NET代码的时候,发现一个静态方法,第一个参数使用 this 关键字,它在这里是什么作用呢?public static XElement AquireElement(this XContainer container,string name, bool addFirst = false){ ... 问题解答 通过查看微软的官方博文介绍(https://as…

定点数的编码表示

真值和机器数 在日常生活中,形如“+15”、“-3”这样带正负号的数字叫做真值,而用0表示“正”,1表示“负”这样把符号数字化的数称为机器数,常用的有原码、补码和反码表示法,真值是机器数所代表的实际值 原码、补码、反码、移码原码表示的优点:与真值的对应关系简单、直观,…

字节码指令

加载与存储指令public int add(int a, int b) {int res = a + b;return res; }字节码指令public int add(int, int);descriptor: (II)Iflags: (0x0001) ACC_PUBLICCode:stack=2, locals=4, args_size=30: iload_11: iload_22: iadd3: istore_34: iload_35: ireturn1. 将局部变量…

idea 创建springboot项目

参考—— https://blog.csdn.net/Alger_/article/details/128749131——————————需要联网创建————创建项目 new project——》Spring initializr next springboot的版本与jdk版本有关 2.x :jdk8 3.x :jdk17 只选择web 下的spring web ——》create 项目需要联网下…

[智能网联汽车] CAN Log 文件 - ASC文件格式 [转]

因工作研究需要,担心精华内容丢失。故全文转载,转载自:图文详解CAN Log文件 - ASC文件格式 - CSDNVector提供了两种记录数据格式的格式规范:BLF和ASC。在Vector提供的CAN_LOG_TRIGGER_ASC_Format.pdf文件中,规定了CANoe/CANalyzer ASC记录中CAN、Log和Trigger event的格式…

第八天笔记(项目测试工具悟道使用)

禅道 一、禅道的介绍 (1)定义禅道是一个项目管理工具,也是一个bug管理工具,还是一个用例管理工具。 (2)作用:为了解决众多企业在管理中出现混乱,无序的现象,开发出来 (3)来源:禅道属易软天川公司 (4 )禅道是集于产品管理,项目管理,测试管理于一身,同时包含事务…

阿贝云永久免费云服务器1核1G5M服务器使用评测

最近关注到了阿贝云,申请了一台,做个评测,供大家参考使用。永久免费服务器规格(CPU1核,内存1G,公网带宽5M,SSD数据盘10G),网络还是防御 200G 的高防 BGP,还提供了两个快照服务,作为免费服务器来说还是非常不错的。 使用 i-abc/Speedtest 三网测速 大陆三网+教育网 I…

2024QBXT暑假j组精英营Day2

\(一\) \(数据结构\) \(1\) \(链表\) \(1.0\) \(介绍\) 链表分为单向链表和双向链表 单向链表即当前链表只指向下一个元素 双向链表即对于每个元素,记录其前面一个元素,也记录其后面一个元 素。 链表不建议使用 STL 的某些元素进行替代,手写链表更为方便。 \(1.1\) \(单向链…

抢红包设计(预分配法)

大致设计常见软件QPSNginx 单机理论能达到30w左右的QPSRedis 单机可以承受8W+的QPS,理论可以达到10wQPSMysql 单机只有4k左右的QPS创建红包 红包拆分算法二倍均值法(每个人获得的红包金额差不多)math.Max(0.01, money / member * 2) 假设有10个人,红包总额10元。 10…

揭秘 Java 变长参数:如何优雅地处理不定数量的字符串

哈喽,大家好,我是木头左!理解变长参数:基础概念 在Java中,变长参数也称为可变参数,它允许你传递任意数量的参数到一个方法中。这个特性是通过使用三个点符号...来实现的。当你在方法的参数列表中使用...时,任何传递给该方法的额外参数都会被当作数组来处理。这为提供了一…

记一道弱智题

P2033 Chessboard Dance 今天集训第四天,遇到这道模拟题。 我搞错了一大问题。首先我以为移动是整行移动,但显然不是的。于是我就开始想这个怎么处理:我想是先碰到之后让箱子作为P,继续往后推,再碰到箱子……最后回溯。这是可怕的递归,函数是 MOVE(x, y, Steps_rem)。奈何…