在使用52832的时候,有时候需要存储大量的数据,就需要外置存储芯片,这里我使用的存储是W25Qxx系列,并实现低功耗。
为了方便实现低功耗和代码移植的方便,这里我是用的是模拟SPI驱动W25Qxx.废话少说,上代码:
w25qxx.h
#ifndef __W25QXX_H__
#define __W25QXX_H__
#include "boards.h"
#include "app_error.h"
#define W25QXX_ADD_BASE (0) //W25QXX的起始地址
#define W25QXX_ADD_END (128*1024*1024-1) //W25Q128的结束地址,如果是其它器件,需要修改此项大小
#define SECTOR_SIZE 4096 //扇区大小
#define PAGE_SIZE 256 //页大小
/**
* 函数名:W25Qxx_PowerDown
* 功能:进入掉电模式
* 输入参数:None
* 输出参数:None
* 返回值:None
* 其他:None
**/
void W25Qxx_PowerDown(void);
/**
* 函数名:W25Qxx_WakeUP
* 功能:唤醒
* 输入参数:None
* 输出参数:None
* 返回值:None
* 其他:None
**/
void W25Qxx_WakeUP(void);
/**
* 函数名:W25Qxx_Erase_Sector
* 功能:擦除一个扇区
* 输入参数:
* sectorAddr:扇区地址
* 输出参数:None
* 返回值:None
* 其他:擦除一个扇区至少需要150ms
**/
void W25Qxx_Erase_Sector(uint32_t sectorAddr);
/**
* 函数名:W25Qxx_Write_Page
* 功能:在一个页内写入数据
* 输入参数:
* @pBuffer:数据缓存
* @writeAddr:开始写入的地址
* @writeLen:写入的数据长度(小于页的剩余字节数)
* 输出参数:None
* 返回值:NRF错误类型
* 其他:None
**/
uint32_t W25Qxx_Write_Page(uint8_t *pBuffer, uint32_t writeAddr, uint32_t writeLen);
/**
* 函数名:W25Qxx_Write_NoCheck
* 功能:从指定地址开始写入指定长度的数据
* 输入参数:
* @pBuffer:数据缓存
* @writeAddr:开始写入的地址
* @writeLen:写入的数据长度(开始写入的地址+数据长度小于总地址数)
* 输出参数:None
* 返回值:NRF错误类型
* 其他:写之前必须保证所写地址范围的数据以擦除(数据都为0xFF).
**/
uint32_t W25Qxx_Write_NoCheck(uint8_t *pBuffer, uint32_t writeAddr, uint32_t writeLen);
/**
* 函数名:W25Qxx_Init
* 功能:初始化W25QXX
* 输入参数:None
* 输出参数:None
* 返回值:None
* 其他:None
**/
void W25Qxx_Init(void);
/**
* 函数名:W25Qxx_unInit
* 功能:复位W25QXX
* 输入参数:None
* 输出参数:None
* 返回值:None
* 其他:None
**/
void W25Qxx_unInit(void);
/**
* 函数名:W25Qxx_ReadID
* 功能:读取芯片ID
* 输入参数:None
* 输出参数:None
* 返回值:芯片ID
* 其他:None
**/
uint16_t W25Qxx_ReadID(void);
/**
* 函数名:W25Qxx_Read
* 功能:从指定地址开始读取指定长度的数据
* 输入参数:
* @readAddr:开始读取的地址
* @readLen:读取的数据长度
* 输出参数:
* @pBuffer:读取的数据缓存
* 返回值:NRF错误类型
* 其他:None
**/
uint32_t W25Qxx_Read(uint8_t *pBuffer, uint32_t readAddr, uint32_t readLen);
/**
* 函数名:W25Qxx_Write
* 功能:从指定地址开始写入指定长度的数据
* 输入参数:
* @pBuffer:数据缓存
* @writeAddr:开始写入的地址
* @writeLen:写入的数据长度(开始写入的地址+数据长度小于总地址数)
* 输出参数:None
* 返回值:NRF错误类型
* 其他:该函数自带擦除功能,写入地址可以随意
**/
uint32_t W25Qxx_Write(uint8_t *pBuffer, uint32_t writeAddr, uint32_t writeLen);
/**
* 函数名:W25Qxx_WaitRW
* 功能:等待W25Qxx读写完成
* 输入参数:None
* 输出参数:None
* 返回值:None
* 其他:None
**/
void W25Qxx_WaitRW(void);
#endif
w25qxx.c
#include "w25qxx.h"
#include <string.h>
#ifndef BOOTLOADER
#include "uart.h"
#include "FreeRTOS.h"
#inc

本文介绍了一种用于52832微控制器的W25Qxx系列存储芯片驱动程序的设计与实现,包括低功耗模式的管理、扇区擦除、数据读写等功能。
最低0.47元/天 解锁文章
2万+

被折叠的 条评论
为什么被折叠?



