W25Q32 spi flash的使用

1、继续使用上节的spi1 ,将数据写入w25Q32,然后读出来,校验一致即可。
2、直接上代码

w25q32.c

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "spi.h"
#include "gd32f30x.h"
#include "w25q32.h"
#include "message.h"#define MAX_BLOCKSIZE         128
#define MAX_SECTORSIZE        2048   #define CMD_WRIRE_ENABLE      0x06
#define CMD_WRITE_DISABLE     0x04
#define CMD_READ_STATUS_R1    0x05
#define CMD_READ_STATUS_R2    0x35
#define CMD_READ_STATUS_R3    0x15
#define CMD_WRITE_STATUS_R    0x01
#define CMD_PAGE_PROGRAM      0x02
#define CMD_QUAD_PAGE_PROGRAM 0x32
#define CMD_BLOCK_ERASE64KB   0xd8
#define CMD_BLOCK_ERASE32KB   0x52
#define CMD_SECTOR_ERASE      0x20
#define CMD_CHIP_ERASE        0xC7
#define CMD_ERASE_SUPPEND     0x75
#define CMD_ERASE_RESUME      0x7A
#define CMD_POWER_DOWN        0xB9
#define CMD_HIGH_PERFORM_MODE 0xA3
#define CMD_CNT_READ_MODE_RST 0xFF
#define CMD_RELEASE_PDOWN_ID  0xAB
#define CMD_MANUFACURER_ID    0x90
#define CMD_READ_UNIQUE_ID    0x4B
#define CMD_JEDEC_ID          0x9f#define CMD_READ_DATA         0x03
#define CMD_FAST_READ         0x0B
#define CMD_READ_DUAL_OUTPUT  0x3B
#define CMD_READ_DUAL_IO      0xBB
#define CMD_READ_QUAD_OUTPUT  0x6B
#define CMD_READ_QUAD_IO      0xEB
#define CMD_WORD_READ         0xE3
#define CMD_ENABLE_4_BYTE_ADDR    0xB7
#define CMD_EXIT_4_BYTE_ADDR      0xE9#define SR1_BUSY_MASK       0x01
#define SR1_WEN_MASK          0x02#define W25Q80                  0XEF13
#define W25Q16                0XEF14
#define W25Q32                0XEF15
#define W25Q64                0XEF16
#define W25Q128               0XEF17
#define W25Q256               0XEF18
#define W25QXX_TYPE           W25Q32#if SPI_MODE != SPI_SLAVE_MODE_INTstatic void spi_write_read_data(uint8_t *w_data,uint8_t *r_data,int len)
{
#if SPI_MODE == SPI_MASTER_MODE_POLLspi1_write_read_data(w_data,r_data,len);
#elif SPI_MODE == SPI_MASTER_MODE_DMA#endif
}static void spc_dump(char *id,int rc, uint8_t *data,int len)
{int i;printf("[%s] = %d\r\n",id,rc);for(i=0;i<len;i++) {printf("%0x ",data[i]);if ( (i % 10) == 9) printf("\r\n");}printf("\r\n");
}static void w25q32_read_manufacturer_id(uint16_t *id)
{uint8_t tx_data[6] = {CMD_MANUFACURER_ID ,0,0,0,0,0};uint8_t rx_data[6] = {0};spi_write_read_data(tx_data,rx_data,6);*id = (rx_data[4]<<8)|rx_data[5];
}static void w25q32_read_jedec_id(uint16_t *id)
{uint8_t tx_data[4] = {CMD_JEDEC_ID ,0,0,0};uint8_t rx_data[4] = {0};spi_write_read_data(tx_data,rx_data,4);*id = (rx_data[2]<<8)|rx_data[3];
}static void w25q32_read_uniqie_id(void)
{uint8_t tx_data[12] = {0x4B ,0,0,0};uint8_t rx_data[12] = {0};spi_write_read_data(tx_data,rx_data,12);print_register_value(rx_data,12);
}/*** 状态寄存器1:*   BIT7  6   5   4   3   2   1   0*  SPR   RV  TB BP2 BP1 BP0 WEL BUSY
*/
static int w25q32_read_status_reg1(void)
{uint8_t tx_data[2];uint8_t rx_data[2]= {0};tx_data[0] = CMD_READ_STATUS_R1;tx_data[1] = 0xff;spi_write_read_data (tx_data,rx_data,sizeof(rx_data));//spc_dump(__FUNCTION__,0,rx_data,sizeof(rx_data));return rx_data[1];
}/*** 状态寄存器2:*BIT7  6   5   4   3   2   1   0*SUS   CMP LB3 LB2 LB1 (R) QE  SRP1
*/
static int w25q32_read_status_reg2(void)
{uint8_t tx_data[2];uint8_t rx_data[2];tx_data[0] = CMD_READ_STATUS_R2;tx_data[1] = 0xff;spi_write_read_data (tx_data,rx_data,sizeof(rx_data));//spc_dump(__FUNCTION__,0,rx_data,sizeof(rx_data));return rx_data[1];
}static int w25q32_read_status_reg3(void)
{uint8_t tx_data[2];uint8_t rx_data[2];tx_data[0] = CMD_READ_STATUS_R3;tx_data[1] = 0xff;spi_write_read_data (tx_data,rx_data,sizeof(rx_data));//spc_dump(__FUNCTION__,0,rx_data,sizeof(rx_data));return rx_data[1];
}int w25q32_is_busy()
{uint8_t tx_data[2];uint8_t rx_data[2] = {0};tx_data[0] = CMD_READ_STATUS_R1;tx_data[1] = 0xff;spi_write_read_data (tx_data,rx_data,sizeof(rx_data));uint8_t r1;r1 = rx_data[1];if(r1 & SR1_BUSY_MASK)return 1;return 0;
}//等待空闲
void w25q32_wait_busy(void)
{   while((w25q32_read_status_reg1()&0x01)==0x01);
} void w25q32_power_down(void)
{uint8_t tx_data;uint8_t rx_data;tx_data = CMD_POWER_DOWN;spi_write_read_data (&tx_data,&rx_data,1);
}void w25q32_write_enable(void)
{uint8_t tx_data[1];uint8_t rx_data[1];tx_data[0] = CMD_WRIRE_ENABLE;spi_write_read_data(tx_data,rx_data,1);
}void w25q32_write_disable(void)
{uint8_t tx_data[1];uint8_t rx_data[1];tx_data[0] = CMD_WRITE_DISABLE;spi_write_read_data(tx_data,rx_data,1);
}int w25q32_erase_all()
{uint8_t tx_data[1];uint8_t rx_data[1];w25q32_write_enable();  tx_data[0] = CMD_CHIP_ERASE;spi_write_read_data(tx_data,rx_data,1);w25q32_wait_busy();return 1;
}void w25q32_erase_sector(uint32_t dst_addr)
{  uint8_t tx_data[4];uint8_t rx_data[4];uint32_t addr = dst_addr;addr<<=12;w25q32_write_enable();tx_data[0] = CMD_SECTOR_ERASE;tx_data[1] = (addr>>16) & 0xff;tx_data[2] = (addr>>8) & 0xff;tx_data[3] = addr & 0xff;spi_write_read_data (tx_data,rx_data,sizeof(rx_data));w25q32_wait_busy();
} uint16_t w25q32_read(uint32_t addr,uint8_t *buf,uint16_t n)
{ uint8_t *tx_data;uint8_t *rx_data;tx_data = (uint8_t*)malloc(n+4);rx_data = (uint8_t*)malloc(n+4);tx_data[0] = CMD_READ_DATA;tx_data[1] = (addr>>16) & 0xFF;     // A23-A16tx_data[2] = (addr>>8) & 0xFF;      // A15-A08tx_data[3] = addr & 0xFF;           // A07-A00spi_write_read_data(tx_data,rx_data,n+4);memcpy(buf,&rx_data[4],n);free(tx_data);free(rx_data);return n;
}uint16_t W25Q64_fastread(uint32_t addr,uint8_t *buf,uint16_t n)
{uint8_t *tx_data;uint8_t *rx_data;tx_data = (uint8_t*)malloc(n+5);rx_data = (uint8_t*)malloc(n+5);tx_data[0] = CMD_FAST_READ;tx_data[1] = (addr>>16) & 0xFF;     // A23-A16tx_data[2] = (addr>>8) & 0xFF;      // A15-A08tx_data[3] = addr & 0xFF;           // A07-A00tx_data[4] = 0;spi_write_read_data(tx_data,rx_data,n+5);memcpy(buf,&rx_data[5],n);free(tx_data);free(rx_data);return n;
}uint16_t w25q32_page_write( uint16_t inaddr, uint8_t* buf, uint16_t n)
{uint8_t *tx_data;uint8_t *rx_data;tx_data = (uint8_t*)malloc(n+4);rx_data = (uint8_t*)malloc(n+4);w25q32_write_enable();  tx_data = (uint8_t*)malloc(n+4);tx_data[0] = CMD_PAGE_PROGRAM;tx_data[1] = (inaddr>>16) & 0xff;tx_data[2] = (inaddr>>8) & 0xff;tx_data[3] = inaddr & 0xFF;memcpy(&tx_data[4],buf,n);spi_write_read_data(tx_data,rx_data,n+4);while(w25q32_is_busy()) ;free(tx_data);free(rx_data);return 0;
}void w25q32_write_no_check( uint16_t inaddr, uint8_t* buf, uint16_t n)
{uint16_t page_remain;page_remain = 256 - inaddr % 256;if (n <= page_remain)page_remain = n;while (1){/* code */w25q32_page_write(inaddr,buf,page_remain);if(n == page_remain)break;else{buf += page_remain;inaddr += page_remain;n -= page_remain;if (n > 256)page_remain = 256;elsepage_remain = n; }   }
}void w25q32_buffer_write(uint8_t *p_buf,uint16_t inaddr,uint16_t n)
{uint32_t sec_pos;uint16_t sec_off;uint16_t sec_remian;uint16_t i;uint8_t  w_buff[4096];sec_pos = inaddr / 4096 ;sec_off = inaddr % 4096;sec_remian = 4096 - sec_off;if (n <= sec_remian){sec_remian = n;}while (1){w25q32_read(sec_pos*4096,w_buff,4096);for(i=0;i<sec_remian;i++){if (w_buff[sec_off + i] != 0xff){break;}}if (i<sec_remian){w25q32_erase_sector(sec_pos);for(int i=0;i<sec_remian;i++){w_buff[i+sec_off] = p_buf[i];}w25q32_write_no_check(sec_pos*4096,w_buff,4096);}else{w25q32_write_no_check(inaddr,w_buff,4096);}if (n == sec_remian){break;}else{sec_pos++;sec_off = 0;p_buf += sec_remian;inaddr += sec_remian;n -= sec_remian;if (n > 4096){sec_remian = 4096;}else{sec_remian = n;}}}
}void w25q32_init(void)
{uint16_t manufacturer_id = 0;uint16_t jedec_id = 0;w25q32_read_manufacturer_id(&manufacturer_id);w25q32_read_jedec_id(&jedec_id);if (manufacturer_id == W25QXX_TYPE){printf("W25Q32 Init Succdess\r\n");}
}
#endif //SPI_SLAVE_MODE_INT

w25q32.h

#ifndef __W25Q32_H__
#define __W25Q32_H__#include "spi.h"#if SPI_MODE == SPI_MASTER_MODE_POLLvoid w25q32_init(void);
uint16_t w25q32_page_write( uint16_t inaddr, uint8_t* buf, uint16_t n) ;
uint16_t w25q32_read(uint32_t addr,uint8_t *buf,uint16_t n);
void w25q32_erase_sector(uint32_t dst_addr) ;#endif //SPI_MODE == SPI_MASTER_MODE_POLL
#endif //__W25Q32_H__

main函数调用

单片机GD32F303RCT6 (Macos环境)开发 (二十四)—— W25Q32 spi flash的使用相关推荐

  1. 《封号码罗》关于js逆向猿人学第一题m值的获取[纯补环境](二十四)

    网上有很多资料,包括视频都讲解了m值的生成方式,但是我自己总是看过之后,有很多疑惑,所以我自己再总结一遍. 抓包看看请求 m值得生成位置 用AST简单解混淆一下,源码就是整个混淆的js复制到本地文件 ...

  2. Window XP驱动开发(二十四)虚拟串口设备驱动

    转载请标明是引用于 http://blog.csdn.net/chenyujing1234 欢迎大家拍砖 在我的一篇文章<<winCE中实现虚拟串口的方法 >>中,讲到在win ...

  3. 【Visual C++】游戏开发五十七 浅墨DirectX教程二十四 打造游戏GUI界面(二)

    本系列文章由zhmxy555(毛星云)编写,转载请注明出处. 文章链接: http://blog.csdn.net/poem_qianmo/article/details/16922703 作者:毛星 ...

  4. 实验二十四、OSPF 在NBMA 环境中点到点的配置

    实验二十四.OSPF 在NBMA 环境中点到点的配置 一. 实验目的 1. 掌握NBMA 环境中点到点的配置 2. 理解NBMA 环境中点到点网络类型的意义 二. 应用环境 在帧中继的网络中,OSPF ...

  5. JavaWeb开发与代码的编写(二十四)

    JavaWeb开发与代码的编写(二十四) JNDI数据源的配置 数据源的由来 在Java开发中,使用JDBC操作数据库的四个步骤如下: ①加载数据库驱动程序(Class.forName("数 ...

  6. matlab火星漫游车转向控制,OSG开发笔记(二十四):OSG漫游之平移与转向

    若该文为原创文章,未经允许不得转载 原博主博客地址:https://blog.csdn.net/qq21497936 本文章博客地址:https://blog.csdn.net/qq21497936/ ...

  7. SAP UI5 初学者教程之二十四 - 如何使用 OData 数据模型试读版

    一套适合 SAP UI5 初学者循序渐进的学习教程 教程目录 SAP UI5 本地开发环境的搭建 SAP UI5 初学者教程之一:Hello World SAP UI5 初学者教程之二:SAP UI5 ...

  8. Docker最全教程之MySQL容器化 (二十四)

    Docker最全教程之MySQL容器化 (二十四) 原文:Docker最全教程之MySQL容器化 (二十四) 前言 MySQL是目前最流行的开源的关系型数据库,MySQL的容器化之前有朋友投稿并且写过 ...

  9. 真三国无双8二十四项修改器风灵月影版

    点击下载来源:真三国无双8二十四项修改器风灵月影版 真三国无双8修改器风灵月影顾名思义,就是由风灵月影大神专门为<真三国无双8(Dynasty Warriors 8)>量身打造的一款游戏辅 ...

最新文章

  1. mysql自动增长恢复_mysql自动增长的有关问题,怎么恢复从1开始
  2. Cell综述-建立因果关系:合成菌群在植物菌群研究中的机会
  3. NCBI下载SRA数据的4种方法
  4. JAVA SE学习day_04:RandomAccessFile
  5. 往自身页面提交和别处页面提交到本页的设计小技巧
  6. 案例39-后台查询订单详情代码实现
  7. SharePoint 2010 同步用户Services 一直Starting 终极解决方案
  8. Qt界面开发(各种控件以及图表)
  9. 跨计算机建立视图_计算机二级office
  10. (原创) JavaScript是什么?
  11. INITRANS和MAXTRANS参数的作用
  12. web.xml文件书写规则
  13. CSP202009-1 称检测点查询(100分)【数学】
  14. 十行代码实现高仿Promise
  15. TCP报文-选项字段
  16. ESP8266-Arduino网络编程实例-HightCharts实时图表显示BME280数据
  17. 如何查看当前计算机硬盘状态,win7系统下如何查看硬盘状态
  18. python游戏猜拳_Python之猜拳游戏
  19. Android Studio运行项目
  20. mantis php7,CentOS7下安装mantis

热门文章

  1. Mac电脑删除第三方软件工具CleanMyMac X
  2. 有关树莓派驱动1.3寸IPS屏幕的一点经验
  3. Java--->编程题之水仙花
  4. 显示器接口有几种 显示器各种接口知识扫盲
  5. 图文详述:IntelliJ IDEA的下载、安装、配置、使用
  6. matlab什么专业要学,【读书1】【2017】MATLAB与深度学习——什么是机器学习(1)
  7. Matlab——离散点的随机区域分配
  8. 个人博客功能及技术栈介绍
  9. sqlite一条语句插入多条记录
  10. 【Vue】032-尚硅谷-尚品汇-mockjs模拟数据---20230111