w806 w25q128 spi flash 移植fatfs

发布者:梦想学院最新更新时间:2022-08-02 来源: csdn关键字:w25q128  spi  flash  移植fatfs 手机看文章 扫描二维码
随时随地手机看文章

一: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 w25q256

stat = !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 == 0

 

DRESULT 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        //文件日期


关键字:w25q128  spi  flash  移植fatfs 引用地址:w806 w25q128 spi flash 移植fatfs

上一篇:国产W806 I2C硬件模块
下一篇:W801 W800 W806串口下载失败的原因

推荐阅读最新更新时间:2024-11-16 20:35

DSP芯片的Flash存储器的在线编程方式
在嵌入式系统中,为了实现程序的脱机自动运行,程序往往固化在电可擦除的Flash存储器中。要实现一个嵌入式系统的带电脱机运行,在线编程就成为嵌入式系统开发过程的必经之路。由于在线编程涉及到硬件和软件方面的内容,因此要从顶层设计和系统的角度来考虑在线编程。硬件设计要为软件设计作铺垫,尽可能简化软件设计。   本文以TI公司的DSP芯片 TMS320C6711D 和AMD公司的4 Mb Flash存储器AM29LV400B为例来介绍两种在线编程方式。   1 DSP与Flash存储器的两种硬件连接关系   1.1 以Ready信号作为硬件握手   带有Ready信号的TMS320C6711D的EMIF(Exterha
[嵌入式]
DSP芯片的<font color='red'>Flash</font>存储器的在线编程方式
一种支持ISP的Flash在嵌入式设计中的应用
1 引言 在基于VxWorks的嵌入式系统开发过程中,板卡支持包BSP(Board Support Package)的开发是非常重要而又闲难的一个环节。因为不能确定硬件系统是否正常丁作,而后续应用开发都是以此为基础。 在实际开发中,为了提高开发效率,大多是采用以一个与目标板硬件相似的BSP为模板,并在此基础上修改移植。在这个过程中.除了CPU以外,另一个重要的器件就是装有启动程序的Flash器件。 2 系统介绍 采用高性能PowerPC系列器件PPC440EPx为核心设计的一款符合CPCI标准的嵌入式单板计算机系统。 该系统集成了丰富的外设接口和调试接口,可用于设备控制、设备管理、通信设备中的通信控制、协议处理、路由处理
[电源管理]
一种支持ISP的<font color='red'>Flash</font>在嵌入式设计中的应用
点序科技10 年深耕 NAND flash 控制芯片市场
【Technews科技新报】 在大数据、人工智能兴起的世代,「数据为王」的数据经济时代即将来临,数据存储将成为兵家必争之地。成立 10 年、深耕 NAND flash 控制芯片领域的点序科技,不但已成为全球最大 SD 存储卡控制芯片的供应商,还继续朝向下一个里程碑迈进,打造兼具深度与广度的产品线,陆续推出 USB、eMMC 与 SSD 控制芯片,以技术与速度满足市场全方位需求。 掌握新世代产品技术,快速支持市场需求 目前点序科技已经成为全球最大 SD,并且和群联、慧荣并列全球唯 3 家拥有完整 NAND flash 全系列控制芯片解决方案的领导厂商。能有这样的成绩,除了点序科技掌握了 NAND flash 控制芯片的关键
[嵌入式]
点序科技10 年深耕 NAND <font color='red'>flash</font> 控制芯片市场
基于STM32F407的flash内存结构分析
硬件平台:STM32F4 DISCOVERY开发板 型号:MB997A或MB997C 主芯片型号:STM32F405xx, STM32F407xx, STM32F415xx, 或 STM32F417xx 主要参考文档: (1)PM0081 STM32F40xxx and STM32F41xxx Flash programming manual.pdf (2)STM32F407 datasheet.pdf 做为嵌入式方面的开发人员,拿到一个芯片后,我们首先看它的参数指标,有多少多少容量的RAM,多少多少容量的Flash。当然,前提是芯片自带这两个模块。 今天我们只研究Flash的结构:) (一)声明 STM32F405x
[单片机]
基于STM32F407的<font color='red'>flash</font>内存结构分析
存储器望出现DRAM、NAND Flash双好行情
DRAM价格趋于稳定,1Gb容量提前在9月初站上1.7美元,台厂面对这样美好的光景,心中还是有些疑虑,担心三星电子(Samsung Electronics)会从中作梗,破坏DRAM价格涨势,然现在苹果(Apple)强劲追加NAND Flash订单,且随著智能型手机价格平民化的趋势,未来内建高容量存储器普及,都让各界相当看好2010年NAND Flash市场前景,三星在喜迎苹果大单之余,也无暇与台系DRAM厂厮杀,暌违多年的DRAM和NAND Flash双好行情可望再现。    2009 年存储器产业触底反弹的步调相当健康,年初由NAND Flash领涨,之后再由DRAM接棒,但NAND Flash价格虽然涨势熄火,但也未
[手机便携]
S3C2440 Nor Flash驱动(二十四)
1、Nor Flash硬件介绍: 从原理图中我们能看待NOR FLASH有地址线,有数据线,它和我们的SDRAM接口类似,能直接读取数据,但不能想SDRAM直接写入数据,需要有命令才行。 1.1 其中我们2440的地址线共有27根(LADDR0~26),为什么是27根? 因为2440共有7个bank内存块,每个bank=128M=(2^27)B,所以共有27根数据线 1.2 为什么Nor Flash的地址线A0是接在2440的LADDR1上? 因为Nor Flash的数据共有16位,也就是每个地址保存了2B数据,而我们的2440的每个地址是保存1B数据 比如: 当2440访问0x00地址时,就会读取到N
[单片机]
S3C2440 Nor <font color='red'>Flash</font>驱动(二十四)
NOR FLASH驱动程序
// // 参考 drivers\mtd\maps\physmap.c // #include linux/module.h #include linux/types.h #include linux/kernel.h #include linux/init.h #include linux/slab.h #include linux/device.h #include linux/platform_device.h #include linux/mtd/mtd.h #include linux/mtd/map.h #include linux/mtd/partitions.h #include asm/
[单片机]
SPI总线的特点、工作方式及常见错误解答
1.SPI 总线 总线   总线是将信息以一个或多个源部件传送到一个或多个目的部件的一组传输线。通俗的说,就是多个部件间的公共连线,用于在各个部件之间传输信息。人们常常以MHz表示的速度来描述总线频率。 简介   SPI(serial peripheral interface,串行外围设备 接口 )总线技术是 Motorola 公司推出的一种同步串行接口。它用于 CPU CPU   CPU也称为中央处理器,是电子计算机的主要设备之一。其功能主要是解释计算机指令以及处理计算机软件中的数据。所谓的计算机的可编程性主要是指对CPU的编程。CPU是计算机中的核心配件,只有火柴盒那么大,几十张纸那么厚
[工业控制]
<font color='red'>SPI</font>总线的特点、工作方式及常见错误解答
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved