一:spi初始化

    hspi.Instance = SPI;hspi.Init.Mode = SPI_MODE_MASTER;hspi.Init.CLKPolarity = SPI_POLARITY_LOW; hspi.Init.CLKPhase = SPI_PHASE_1EDGE; hspi.Init.NSS = SPI_NSS_SOFT;hspi.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_4;hspi.Init.FirstByte = SPI_LITTLEENDIAN;

二:io初始化

    __HAL_RCC_SPI_CLK_ENABLE();__HAL_AFIO_REMAP_SPI_CS(GPIOB, GPIO_PIN_4);//22 or 18__HAL_AFIO_REMAP_SPI_CLK(GPIOB, GPIO_PIN_2);//24__HAL_AFIO_REMAP_SPI_MISO(GPIOB, GPIO_PIN_3);//25__HAL_AFIO_REMAP_SPI_MOSI(GPIOB, GPIO_PIN_5);//26

三:下载fatfs

//#define DEV_RAM        0   /* Example: Map Ramdisk to physical drive 0 */
//#define DEV_MMC       1   /* Example: Map MMC/SD card to physical drive 1 */
//#define DEV_USB       2   /* Example: Map USB MSD to physical drive 2 */#define DEV_SPI       0   /* Example: Map USB MSD to physical drive 2 *///修改添加 spi
/*-----------------------------------------------------------------------*/
/* Low level disk I/O module SKELETON for FatFs     (C)ChaN, 2019        */
/*-----------------------------------------------------------------------*/
/* If a working storage control module is available, it should be        */
/* attached to the FatFs via a glue function rather than modifying it.   */
/* This is an example of glue functions to attach various exsisting      */
/* storage control modules to the FatFs module with a defined API.       */
/*-----------------------------------------------------------------------*/#include "ff.h"            /* Obtains integer types */
#include "diskio.h"       /* Declarations of disk functions */#include "../src/wq25128.h"/* Definitions of physical drive number for each drive *///#define DEV_RAM     0   /* Example: Map Ramdisk to physical drive 0 */
//#define DEV_MMC       1   /* Example: Map MMC/SD card to physical drive 1 */
//#define DEV_USB       2   /* Example: Map USB MSD to physical drive 2 */#define DEV_SPI       0   /* Example: Map USB MSD to physical drive 2 *//*-----------------------------------------------------------------------*/
/* Get Drive Status                                                      */
/*-----------------------------------------------------------------------*/DSTATUS disk_status (BYTE pdrv       /* Physical drive nmuber to identify the drive */
)
{DSTATUS stat;
//  int result;uint8_t id[2] = {0};switch (pdrv) {case DEV_SPI://BSP_W25Q128_Init();BSP_W25Q128_Read_ID(id);//result = id[0] << 8 | id[1];if(id[0] == 0xEF && id[1] == 0x17)//0x18 is w25q256stat = !STA_NOINIT;else   stat = STA_NOINIT;return stat; }return STA_NOINIT;
}/*-----------------------------------------------------------------------*/
/* Inidialize a Drive                                                    */
/*-----------------------------------------------------------------------*/DSTATUS disk_initialize (BYTE pdrv               /* Physical drive nmuber to identify the drive */
)
{//DSTATUS stat;//int result;switch (pdrv) {case DEV_SPI://BSP_W25Q128_Init();return !STA_NOINIT;//disk_status(DEV_SPI);}return STA_NOINIT;
}/*-----------------------------------------------------------------------*/
/* Read Sector(s)                                                        */
/*-----------------------------------------------------------------------*/DRESULT disk_read (BYTE pdrv,        /* Physical drive nmuber to identify the drive */BYTE *buff,        /* Data buffer to store read data */LBA_t sector,   /* Start sector in LBA */UINT count     /* Number of sectors to read */
)
{//DRESULT res;//int result;switch (pdrv) {case DEV_SPI:if(pdrv != 0 || count == 0)   return RES_PARERR;if(BSP_W25Q128_Read(buff, sector * W25Q128FV_SECTOR_SIZE, count * W25Q128FV_SECTOR_SIZE) == W25Q128_OK)return RES_OK;else return RES_ERROR;}return RES_PARERR;
}/*-----------------------------------------------------------------------*/
/* Write Sector(s)                                                       */
/*-----------------------------------------------------------------------*/#if FF_FS_READONLY == 0DRESULT disk_write (BYTE pdrv,          /* Physical drive nmuber to identify the drive */const BYTE *buff,  /* Data to be written */LBA_t sector,       /* Start sector in LBA */UINT count         /* Number of sectors to write */
)
{//DRESULT res;//int result;uint8_t i = 0;switch (pdrv) {case DEV_SPI:if(pdrv != 0 || count == 0)   return RES_PARERR;for(i = 0; i < count; i++){if(BSP_W25Q128_Erase_Sector((sector + i) * W25Q128FV_SECTOR_SIZE) != W25Q128_OK)return RES_ERROR;if(BSP_W25Q128_Write((uint8_t*)buff + (i * W25Q128FV_SECTOR_SIZE), (sector + i) * W25Q128FV_SECTOR_SIZE, W25Q128FV_SECTOR_SIZE) != W25Q128_OK)return RES_ERROR;}return RES_OK;}return RES_PARERR;
}#endif/*-----------------------------------------------------------------------*/
/* Miscellaneous Functions                                               */
/*-----------------------------------------------------------------------*/DRESULT disk_ioctl (BYTE pdrv,       /* Physical drive nmuber (0..) */BYTE cmd,      /* Control code */void *buff        /* Buffer to send/receive control data */
)
{DRESULT res;//int result;switch (pdrv) {case DEV_SPI:if(pdrv != 0)   return RES_PARERR;switch(cmd){case CTRL_SYNC:res = RES_OK;break;case GET_SECTOR_COUNT:*(DWORD*)buff = W25Q128FV_FLASH_SIZE / W25Q128FV_SECTOR_SIZE;res = RES_OK;break;case GET_SECTOR_SIZE:*(WORD*)buff =  W25Q128FV_SECTOR_SIZE;res = RES_OK;break;case GET_BLOCK_SIZE:*(DWORD*)buff = 1;res = RES_OK;break;default:res = RES_PARERR;break;}return res;}return RES_PARERR;
}

根据需要 修改 配置 文件

#define FF_USE_MKFS      1         //支持格式化函数
#define FF_CODE_PAGE    936       //中文支持
#define FF_USE_LFN      1         //长文件名支持
#define FF_MAX_SS       4096        //扇区块字节
#define FF_MAX_SS       4096        //文件日期

w806 w25q128 spi flash 移植fatfs相关推荐

  1. STM32CUBEMX(13)--SPI,W25Q128外部Flash移植

    STM32CUBEMX--SPI,W25Q128外部Flash移植 概述 视频教学 完整代码下载 硬件准备 选择芯片型号 配置时钟源 配置时钟树 串口配置 SPI配置 接线方式 生成工程设置 生成代码 ...

  2. HI3516a w25q128 spi flash无法启动问题

    海思HI3516a开发套件上spi flash硬件默认3 addr模式,需要更改u-boot代码才能正确支持3 addr模式,具体操作如下: 更改u-boot代码osdrv/opensource/ub ...

  3. STM32外部Flash移植FATFS笔记

    FatFs是面向小型嵌入式系统的一种通用的FAT文件系统.它完全是由AISI C语言编写并且完全独立于底层的I/O介质.因此它可以很容易地不加修改地移植到其他的处理器当中,如8051. PIC. AV ...

  4. 【理论】SPI Flash和E2PROM区别

    SPI Flash和E2PROM两款存储芯片作为单片机常用的外部存储器件,其区别还是要去仔细把握一下的. 以W25Q128为代表的SPI Flash和以AT24C02为代表的E2PROM为例,下面我就 ...

  5. STM32CUBEIDE之SPI读写FLASH进阶串行FLASH文件系统FatFs

    预备知识 >>W25Q128是16M spi flash,一共有256个block ,每个Block 64KB. >>一个Block可以分割为16个扇区(small secto ...

  6. 串行FLASH文件系统FatFs介绍并在STM32F1上移植

          先对内存存储有一个理解,比如在FALSH中存储数据时,已知在STM32F1 开发板上都有自带有一个外部 FLASH(W25Q128.128Mbit=16MByte,即16M内存),FLAS ...

  7. 基于stm32、spi协议的Fatfs文件系统移植(附完整代码下载)

    开发环境:Window 7 32bit 开发工具:Keil uVision4 硬件:stm32f103vct6 目录 1.硬件设计: 2.软件设计 1.SPI收发数据 2.向SD卡发送的命令格式: 3 ...

  8. STM32CubeMX学习笔记(25)——FatFs文件系统使用(操作SPI Flash)

    一.FatFs简介 FatFs 是面向小型嵌入式系统的一种通用的 FAT 文件系统.它完全是由 ANSI C 语言编写并且完全独立于底层的 I/O 介质.因此它可以很容易地不加修改地移植到其他的处理器 ...

  9. 移植SFUD,驱动SPI FLASH ZD25WQ80

    1.关于SFUD SFUD (Serial Flash Universal Driver) 串行 Flash 通用驱动库,支持众多spi flash,关于SFUD的详细资料可参考:https://gi ...

最新文章

  1. 数据结构与算法:19 排序
  2. 猫、交换机和路由器的区别
  3. 高内聚低耦合通俗理解_抱歉,请不要把“业务逻辑层”理解为“业务中台”
  4. 如何把html转换为js文件,Html2Js--Html代码到Javascript文件的转换
  5. 动态切换view视图viewflipper组件
  6. 没有流氓软件,只有流氓行为
  7. 工业4.0围观,大炒作,大问题,大差距,你发现了吗?
  8. export ,export default 和 import 区别以及用法
  9. VC 6.0下载 VC 6.0英文版下载 Visual C++ 6.0 英文企业版 集成SP6完美版(最新更新地址,百度网盘)...
  10. Android实战之淘宝领券(二)
  11. 系统建模uml语言(用例图、实现类图、状态图、顺序图、活动图、组件图、部署图、详细类图、uml文档设计)
  12. 阿里企业邮箱收费版与免费版有哪些规格和功能上的区别?
  13. 【Unity3D】基于模板测试和顶点膨胀的描边方法
  14. Revit导出PDF格式图纸流程及“批量导出图纸”
  15. 高薪运维经典企业版面试题汇总
  16. input的value属性值
  17. ConcurrentHashMap是如何保证线程安全的?
  18. 说说共享纸巾的那些事
  19. 前端入门篇(八)表单
  20. 域名到期后多久释放?如何抢注到期域名?

热门文章

  1. 2021年进入AI和ML领域之前需要了解的10件事
  2. Wilcoxon符号秩检验-MATLAB实现
  3. linux创建虚拟磁盘的方法
  4. datatable需要多次初始化,使用ajax请求,无法跳到后端接口
  5. 对称与魔术初步(一)——美丽的对称
  6. Postgresql源码(106)Generic Plan与Custom Plan的区别(以分区表为例)
  7. Not Escaping(哈希+dp)
  8. C语言 输入输出1(8进制与16进制)
  9. IT学不好没什么,大不了躺平
  10. html实现数据存储,HTML5数据存储