NRF52832驱动W25Qxx并实现低功耗(FreeRTOS)

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

    在使用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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值