修复多连接的问题
This commit is contained in:
@@ -3,34 +3,31 @@
|
||||
|
||||
/*
|
||||
* 模å<C2A1>—å<E28094><C3A5>称:FAL é…<C3A9>ç½®
|
||||
* 模块功能:定义 FAL Flash 设备表和分区表
|
||||
* 适用平台:STM32F407ZGT6
|
||||
* 作者:王建锋
|
||||
* 创建日期:2026-07-16
|
||||
* 修改记录:
|
||||
* 2026-07-16 王建锋 创建初始版本
|
||||
* 模å<EFBFBD>—功能:定ä¹?FAL Flash 设备表和分区è¡? * 适用平å<C2B3>°ï¼šSTM32F407ZGT6
|
||||
* 作者:王建� * 创建日期�026-07-16
|
||||
* 修改记录ï¼? * 2026-07-16 王建é”? 创建åˆ<C3A5>始版本
|
||||
*/
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/* FAL 调试开关:0-关闭,1-开启 */
|
||||
/* FAL 调试开关:0-å…³é—ï¼?-å¼€å<E282AC>?*/
|
||||
#define FAL_DEBUG 0
|
||||
|
||||
/* 启用分区表配置 */
|
||||
/* å<EFBFBD>¯ç”¨åˆ†åŒºè¡¨é…<EFBFBD>ç½?*/
|
||||
#define FAL_PART_HAS_TABLE_CFG
|
||||
|
||||
/* ======================== Flash 设备表 ======================== */
|
||||
/* ======================== Flash 设备�======================== */
|
||||
|
||||
extern const struct fal_flash_dev gd5f2gq5ue_flash;
|
||||
extern const struct fal_flash_dev g_gd5f2gq5ue_flash;
|
||||
|
||||
#define FAL_FLASH_DEV_TABLE \
|
||||
{ \
|
||||
&gd5f2gq5ue_flash, \
|
||||
&g_gd5f2gq5ue_flash, \
|
||||
}
|
||||
|
||||
/* ======================== 分区表 ======================== */
|
||||
/* ======================== 分区�======================== */
|
||||
/*
|
||||
* 分区å<C2BA><C3A5>ç§° 设备å<E280A1><C3A5>ç§° å<><C3A5>ç§» 大å°<C3A5>
|
||||
* KVDB: 64MB @ 0
|
||||
@@ -49,3 +46,4 @@ extern const struct fal_flash_dev gd5f2gq5ue_flash;
|
||||
#endif
|
||||
|
||||
#endif /* __FAL_CFG_H */
|
||||
|
||||
|
||||
@@ -1,11 +1,9 @@
|
||||
/*
|
||||
* 讓。蝮怜錐遘ー<E98198>哥AL Flash 隶セ螟<EFBDBE>る<C280>
|
||||
* 模块功能:将 GD5F2GQ5UE 驱动接口适配到 FAL 框架
|
||||
* 讓。蝮怜粥閭ス<EFBFBD>壼ー<EFBFBD> GD5F2GQ5UE 鬩ア蜉ィ謗・蜿」騾る<EFBFBD><EFBFBD>?FAL 譯<EFBFBD>楔
|
||||
* 騾ら畑蟷ウ蜿ー<E89CBF>售TM32F407ZGT6
|
||||
* 作者:王建锋
|
||||
* 创建日期:2026-07-16
|
||||
* 修改记录:
|
||||
* 2026-07-16 王建锋 创建初始版本
|
||||
* 菴懆<EFBFBD>シ夂視蟒コ<EFBFBD>? * 蛻帛サコ譌・譛滂ソ?026-07-16
|
||||
* 菫ョ謾ケ隶ー蠖包ソ? * 2026-07-16 邇句サコ<EFBDBB>? 蛻帛サコ蛻晏ァ狗沿譛ャ
|
||||
*/
|
||||
|
||||
/* 螟エ譁<EFBDB4>サカ蛹<EFBDB6>性蛹コ */
|
||||
@@ -17,60 +15,45 @@
|
||||
/*
|
||||
* 蜃ス謨ー蜉溯<E89C89><E6BAAF>哥lash 隶セ螟<EFBDBE><E89E9F>蟋句喧騾る<E9A8BE>
|
||||
* 蜈・蜿」蜿よ焚<E38288>壽裏
|
||||
* 返回值:0 - 成功,其他 - 错误码
|
||||
* 限定条件:SPI 和 GPIO 已由 CubeMX 初始化完成
|
||||
* 函数说明:调用底层驱动的初始化函数
|
||||
*/
|
||||
static int gd5f_fal_init(void)
|
||||
{
|
||||
* 霑泌屓蛟シ<EFBFBD><EFBFBD>0 - 謌仙粥<E4BB99>悟<EFBFBD><E6829F>?- 髞呵ッッ<EFBDAF>? * 髯仙ョ壽擅莉カ<E88E89>售PI <20>?GPIO 蟾イ逕ア CubeMX 蛻晏ァ句喧螳鯉ソ? * 蜃ス謨ー隸エ譏趣シ夊ー<E5A48A>畑蠎募アるゥア蜉ィ逧<EFBDA8><E980A7>蟋句喧蜃ス<E89C83>? */
|
||||
static int gd5f_fal_init(void) {
|
||||
return gd5f2gq5ue_init();
|
||||
}
|
||||
|
||||
/*
|
||||
* 蜃ス謨ー蜉溯<E89C89><E6BAAF>哥lash 隸サ蜿夜る<C280>
|
||||
* 蜈・蜿」蜿よ焚<E38288>嗤ffset - 襍キ蟋句ュ苓鰍蛛冗ァサ long
|
||||
* p_buf - 数据缓冲区 uint8_t*
|
||||
* size - 读取字节数 size_t
|
||||
* 返回值:0 - 成功,其他 - 错误码
|
||||
* 限定条件:gd5f_fal_init() 已成功调用
|
||||
* 函数说明:直接转发到底层驱动的读取函数
|
||||
*/
|
||||
static int gd5f_fal_read(long offset, uint8_t *p_buf, size_t size)
|
||||
{
|
||||
* p_buf - 謨ー謐ョ郛灘<EFBFBD><EFBFBD>? uint8_t*
|
||||
* size - 隸サ蜿門ュ苓鰍<EFBFBD>? size_t
|
||||
* 霑泌屓蛟シ<EFBFBD><EFBFBD>0 - 謌仙粥<E4BB99>悟<EFBFBD><E6829F>?- 髞呵ッッ<EFBDAF>? * 髯仙ョ壽擅莉カ<E88E89>喩d5f_fal_init() 蟾イ謌仙粥隹<E7B2A5>ソ? * 蜃ス謨ー隸エ譏趣シ夂峩謗・霓ャ蜿大芦蠎募アるゥア蜉ィ逧<EFBDA8>ッサ蜿門<E89CBF><E99680>? */
|
||||
static int gd5f_fal_read(long offset, uint8_t *p_buf, size_t size) {
|
||||
return gd5f2gq5ue_read(offset, p_buf, size);
|
||||
}
|
||||
|
||||
/*
|
||||
* 蜃ス謨ー蜉溯<E89C89><E6BAAF>哥lash 蜀吝<E89C80>騾る<E9A8BE>
|
||||
* 蜈・蜿」蜿よ焚<E38288>嗤ffset - 襍キ蟋句ュ苓鰍蛛冗ァサ long
|
||||
* p_buf - 数据缓冲区 const uint8_t*
|
||||
* size - 写入字节数 size_t
|
||||
* 返回值:0 - 成功,其他 - 错误码
|
||||
* 限定条件:目标区域已擦除
|
||||
* 函数说明:直接转发到底层驱动的写入函数
|
||||
*/
|
||||
static int gd5f_fal_write(long offset, const uint8_t *p_buf, size_t size)
|
||||
{
|
||||
* p_buf - 謨ー謐ョ郛灘<EFBFBD><EFBFBD>? const uint8_t*
|
||||
* size - 蜀吝<EFBFBD>蟄苓鰍<EFBFBD>? size_t
|
||||
* 霑泌屓蛟シ<EFBFBD><EFBFBD>0 - 謌仙粥<E4BB99>悟<EFBFBD><E6829F>?- 髞呵ッッ<EFBDAF>? * 髯仙ョ壽擅莉カ<E88E89>夂岼譬<E5B2BC>玄蝓溷キイ謫ヲ髯、
|
||||
* 蜃ス謨ー隸エ譏趣シ夂峩謗・霓ャ蜿大芦蠎募アるゥア蜉ィ逧<EFBFBD><EFBFBD>蜈・蜃ス<EFBFBD>? */
|
||||
static int gd5f_fal_write(long offset, const uint8_t *p_buf, size_t size) {
|
||||
return gd5f2gq5ue_write(offset, p_buf, size);
|
||||
}
|
||||
|
||||
/*
|
||||
* 蜃ス謨ー蜉溯<E89C89><E6BAAF>哥lash 謫ヲ髯、騾る<E9A8BE>
|
||||
* 蜈・蜿」蜿よ焚<E38288>嗤ffset - 襍キ蟋句ュ苓鰍蛛冗ァサ long
|
||||
* size - 擦除字节数 size_t
|
||||
* 返回值:0 - 成功,其他 - 错误码
|
||||
* 限定条件:gd5f_fal_init() 已成功调用
|
||||
* 函数说明:直接转发到底层驱动的擦除函数
|
||||
*/
|
||||
static int gd5f_fal_erase(long offset, size_t size)
|
||||
{
|
||||
* size - 謫ヲ髯、蟄苓鰍<EFBFBD>? size_t
|
||||
* 霑泌屓蛟シ<EFBFBD><EFBFBD>0 - 謌仙粥<E4BB99>悟<EFBFBD><E6829F>?- 髞呵ッッ<EFBDAF>? * 髯仙ョ壽擅莉カ<E88E89>喩d5f_fal_init() 蟾イ謌仙粥隹<E7B2A5>ソ? * 蜃ス謨ー隸エ譏趣シ夂峩謗・霓ャ蜿大芦蠎募アるゥア蜉ィ逧<EFBDA8>逃髯、蜃ス<E89C83>? */
|
||||
static int gd5f_fal_erase(long offset, size_t size) {
|
||||
return gd5f2gq5ue_erase(offset, size);
|
||||
}
|
||||
|
||||
/* ======================== FAL Flash 隶セ螟<EFBDBE>ョ壻ケ<E5A3BB> ======================== */
|
||||
|
||||
/* GD5F2GQ5UE FAL 设备实例,总容量256MB,块大小128KB */
|
||||
const struct fal_flash_dev gd5f2gq5ue_flash = {
|
||||
/* GD5F2GQ5UE FAL 隶セ螟<EFBFBD>ョ樔セ具シ梧サ螳ケ<EFBFBD>?56MB<4D>悟摎螟ァ蟆<EFBDA7>128KB */
|
||||
const struct fal_flash_dev g_gd5f2gq5ue_flash = {
|
||||
.name = "gd5f2gq5ue",
|
||||
.addr = 0,
|
||||
.len = GD5F_TOTAL_SIZE,
|
||||
@@ -83,3 +66,4 @@ const struct fal_flash_dev gd5f2gq5ue_flash = {
|
||||
},
|
||||
.write_gran = 8,
|
||||
};
|
||||
|
||||
|
||||
@@ -1,17 +1,14 @@
|
||||
/*
|
||||
* 妯″潡鍚嶇О锛欸D5F2GQ5UE SPI NAND Flash 椹卞姩
|
||||
* 模块功能:提供 GD5F2GQ5UE SPI NAND Flash 的初始化、读、写、擦除接口
|
||||
* 适用平台:STM32F407ZGT6 + SPI1 硬件 SPI
|
||||
* 作者:王建锋
|
||||
* 创建日期:2026-07-16
|
||||
* 修改记录:
|
||||
* 2026-07-16 王建锋 创建初始版本
|
||||
* 2026-07-17 王建锋 切换硬件 SPI,修正擦除地址,参考 NuttX 驱动
|
||||
* 妯″潡鍔熻兘锛氭彁锟?GD5F2GQ5UE SPI NAND Flash 鐨勫垵濮嬪寲銆佽<EFBFBD>銆佸啓銆佹摝闄ゆ帴锟? * 閫傜敤骞冲彴锛歋TM32F407ZGT6 + SPI1 纭<>欢 SPI
|
||||
* 浣滆€咃細鐜嬪缓锟? * 鍒涘缓鏃ユ湡锟?026-07-16
|
||||
* 淇<EFBFBD>敼璁板綍锟? * 2026-07-16 鐜嬪缓锟? 鍒涘缓鍒濆<E98D92>鐗堟湰
|
||||
* 2026-07-17 鐜嬪缓锟? 鍒囨崲纭<E5B4B2>欢 SPI锛屼慨姝f摝闄ゅ湴鍧€锛屽弬锟?NuttX 椹卞姩
|
||||
*/
|
||||
|
||||
/* 澶存枃浠跺寘鍚<E5AF98>尯 */
|
||||
#include "gd5f2gq5ue.h"
|
||||
#include <string.h>
|
||||
#include "gd5f2gq5ue.h"
|
||||
|
||||
/*
|
||||
* 璋冭瘯杈撳嚭閰嶇疆
|
||||
@@ -43,12 +40,11 @@ static int gd5f_block_erase(uint32_t block_addr);
|
||||
/*
|
||||
* 鍑芥暟鍔熻兘锛氱瓑寰呰姱鐗囨搷浣滃畬鎴愶紙杞<E7B499><E69D9E> OIP 浣嶏級
|
||||
* 鍏ュ彛鍙傛暟锛歵imeout_ms - 瓒呮椂鏃堕棿 uint32_t > 0
|
||||
* 返回值:0 - 操作完成,-2 - 超时
|
||||
* 杩斿洖鍊硷細0 - 鎿嶄綔瀹屾垚锟?2 - 瓒呮椂
|
||||
* 闄愬畾鏉′欢锛歋PI 宸插垵濮嬪寲
|
||||
* 鍑芥暟璇存槑锛氬惊鐜<E6838A><E9909C>鍙栫姸鎬佸瘎瀛樺櫒鐩村埌 OIP 浣嶆竻闆舵垨瓒呮椂
|
||||
*/
|
||||
static int gd5f_wait_busy(uint32_t timeout_ms)
|
||||
{
|
||||
static int gd5f_wait_busy(uint32_t timeout_ms) {
|
||||
uint8_t cmd = GD5F_CMD_GET_FEATURE;
|
||||
uint8_t addr = GD5F_REG_STATUS;
|
||||
uint8_t status = 0;
|
||||
@@ -75,10 +71,8 @@ static int gd5f_wait_busy(uint32_t timeout_ms)
|
||||
* 鍏ュ彛鍙傛暟锛氭棤
|
||||
* 杩斿洖鍊硷細0 - 鎴愬姛
|
||||
* 闄愬畾鏉′欢锛歋PI 宸插垵濮嬪寲
|
||||
* 函数说明:CS# 拉低后发送 06h 命令再拉高
|
||||
*/
|
||||
static int gd5f_write_enable(void)
|
||||
{
|
||||
* 鍑芥暟璇存槑锛欳S# 鎷変綆鍚庡彂锟?06h 鍛戒护鍐嶆媺锟? */
|
||||
static int gd5f_write_enable(void) {
|
||||
uint8_t cmd = GD5F_CMD_WRITE_ENABLE;
|
||||
|
||||
GD5F_CS_LOW();
|
||||
@@ -90,13 +84,11 @@ static int gd5f_write_enable(void)
|
||||
|
||||
/*
|
||||
* 鍑芥暟鍔熻兘锛氳<E9949B>鍙栫姸鎬佸瘎瀛樺櫒
|
||||
* 入口参数:p_status - 状态值输出指针 uint8_t* 不为 NULL
|
||||
* 鍏ュ彛鍙傛暟锛歱_status - 鐘舵€佸€艰緭鍑烘寚锟? uint8_t* 涓嶄负 NULL
|
||||
* 杩斿洖鍊硷細0 - 鎴愬姛
|
||||
* 闄愬畾鏉′欢锛歋PI 宸插垵濮嬪寲
|
||||
* 函数说明:发送 0Fh + C0h 地址后读取1字节状态值
|
||||
*/
|
||||
static int gd5f_read_status(uint8_t *p_status)
|
||||
{
|
||||
* 鍑芥暟璇存槑锛氬彂锟?0Fh + C0h 鍦板潃鍚庤<E98D9A>锟?瀛楄妭鐘舵€侊拷? */
|
||||
static int gd5f_read_status(uint8_t *p_status) {
|
||||
uint8_t cmd = GD5F_CMD_GET_FEATURE;
|
||||
uint8_t addr = GD5F_REG_STATUS;
|
||||
|
||||
@@ -110,15 +102,12 @@ static int gd5f_read_status(uint8_t *p_status)
|
||||
}
|
||||
|
||||
/*
|
||||
* 函数功能:页读取(将数据从存储阵列加载到内部缓存)
|
||||
* 入口参数:page_addr - 页地址 uint32_t
|
||||
* 返回值:0 - 成功,其他 - 错误码
|
||||
* 限定条件:SPI 已初始化
|
||||
* 函数说明:发送 13h + 3字节行地址,等待 OIP 清零
|
||||
* 鍑芥暟鍔熻兘锛氶〉璇诲彇锛堝皢鏁版嵁浠庡瓨鍌ㄩ樀鍒楀姞杞藉埌鍐呴儴缂撳瓨锟? * 鍏ュ彛鍙傛暟锛歱age_addr - 椤靛湴鍧€ uint32_t
|
||||
* 杩斿洖鍊硷細0 - 鎴愬姛锛屽叾锟?- 閿欒<E996BF>锟? * 闄愬畾鏉′欢锛歋PI 宸插垵濮嬪寲
|
||||
* 鍑芥暟璇存槑锛氬彂锟?13h + 3瀛楄妭琛屽湴鍧€锛岀瓑锟?OIP 娓呴浂
|
||||
*/
|
||||
static int gd5f_page_read(uint32_t page_addr)
|
||||
{
|
||||
uint8_t cmd[4];
|
||||
static int gd5f_page_read(uint32_t page_addr) {
|
||||
uint8_t cmd[4] = {0};
|
||||
|
||||
cmd[0] = GD5F_CMD_PAGE_READ;
|
||||
cmd[1] = (page_addr >> 16) & 0xFF;
|
||||
@@ -135,16 +124,14 @@ static int gd5f_page_read(uint32_t page_addr)
|
||||
/*
|
||||
* 鍑芥暟鍔熻兘锛氫粠鍐呴儴缂撳瓨璇诲彇鏁版嵁
|
||||
* 鍏ュ彛鍙傛暟锛歝olumn - 鍒楀湴鍧€锛堥〉鍐呭亸绉伙級 uint16_t 0 - 2047
|
||||
* p_buf - 数据输出缓冲区 uint8_t* 不为 NULL
|
||||
* size - 读取字节数 size_t > 0
|
||||
* p_buf - 鏁版嵁杈撳嚭缂撳啿锟? uint8_t* 涓嶄负 NULL
|
||||
* size - 璇诲彇瀛楄妭锟? size_t > 0
|
||||
* 杩斿洖鍊硷細0 - 鎴愬姛
|
||||
* 闄愬畾鏉′欢锛氬繀椤诲厛璋冪敤 gd5f_page_read 瀹屾垚鏁版嵁鍔犺浇
|
||||
* 函数说明:发送 0Bh + 2字节列地址 +1字节 dummy 后读取数据
|
||||
*/
|
||||
* 鍑芥暟璇存槑锛氬彂锟?0Bh + 2瀛楄妭鍒楀湴鍧€ +1瀛楄妭 dummy 鍚庤<E98D9A>鍙栨暟锟? */
|
||||
static int gd5f_read_from_cache(uint16_t column, uint8_t *p_buf,
|
||||
size_t size)
|
||||
{
|
||||
uint8_t cmd[4];
|
||||
size_t size) {
|
||||
uint8_t cmd[4] = {0};
|
||||
|
||||
cmd[0] = GD5F_CMD_READ_FROM_CACHE;
|
||||
cmd[1] = (column >> 8) & 0xFF;
|
||||
@@ -163,16 +150,13 @@ static int gd5f_read_from_cache(uint16_t column, uint8_t *p_buf,
|
||||
* 鍑芥暟鍔熻兘锛氶〉缂栫▼锛堝皢鏁版嵁鍐欏叆鎸囧畾椤碉級
|
||||
* 鍏ュ彛鍙傛暟锛歱age_addr - 椤靛湴鍧€ uint32_t
|
||||
* column - 鍒楀湴鍧€ uint16_t 0 - 2047
|
||||
* p_buf - 数据缓冲区 const uint8_t*
|
||||
* size - 写入字节数 size_t > 0
|
||||
* 返回值:0 - 成功,其他 - 错误码
|
||||
* 限定条件:目标区域已擦除
|
||||
* 函数说明:1. 写使能 - 02h 加载数据 - 10h 执行编程 - 等待完成
|
||||
* 2. 编程完成后检查 P_FAIL 位
|
||||
*/
|
||||
* p_buf - 鏁版嵁缂撳啿锟? const uint8_t*
|
||||
* size - 鍐欏叆瀛楄妭锟? size_t > 0
|
||||
* 杩斿洖鍊硷細0 - 鎴愬姛锛屽叾锟?- 閿欒<E996BF>锟? * 闄愬畾鏉′欢锛氱洰鏍囧尯鍩熷凡鎿﹂櫎
|
||||
* 鍑芥暟璇存槑锟?. 鍐欎娇锟?- 02h 鍔犺浇鏁版嵁 - 10h 鎵ц<E98EB5>缂栫▼ - 绛夊緟瀹屾垚
|
||||
* 2. 缂栫▼瀹屾垚鍚庢<E98D9A>锟?P_FAIL 锟? */
|
||||
static int gd5f_page_program(uint32_t page_addr, uint16_t column,
|
||||
const uint8_t *p_buf, size_t size)
|
||||
{
|
||||
const uint8_t *p_buf, size_t size) {
|
||||
int ret = GD5F_OK;
|
||||
uint8_t cmd[4];
|
||||
uint8_t status = 0;
|
||||
@@ -212,15 +196,12 @@ static int gd5f_page_program(uint32_t page_addr, uint16_t column,
|
||||
}
|
||||
|
||||
/*
|
||||
* 函数功能:设置 Feature 寄存器
|
||||
* 入口参数:addr - 寄存器地址 uint8_t
|
||||
* 鍑芥暟鍔熻兘锛氳<EFBFBD>锟?Feature 瀵勫瓨锟? * 鍏ュ彛鍙傛暟锛歛ddr - 瀵勫瓨鍣ㄥ湴鍧€ uint8_t
|
||||
* data - 鍐欏叆鏁版嵁 uint8_t
|
||||
* 杩斿洖鍊硷細0 - 鎴愬姛
|
||||
* 闄愬畾鏉′欢锛歋PI 宸插垵濮嬪寲
|
||||
* 函数说明:先写使能,发送 1Fh + 地址 + 数据,等待操作完成
|
||||
*/
|
||||
static int gd5f_set_feature(uint8_t addr, uint8_t data)
|
||||
{
|
||||
* 鍑芥暟璇存槑锛氬厛鍐欎娇鑳斤紝鍙戯拷?1Fh + 鍦板潃 + 鏁版嵁锛岀瓑寰呮搷浣滃畬锟? */
|
||||
static int gd5f_set_feature(uint8_t addr, uint8_t data) {
|
||||
uint8_t cmd[3];
|
||||
|
||||
gd5f_write_enable();
|
||||
@@ -239,15 +220,11 @@ static int gd5f_set_feature(uint8_t addr, uint8_t data)
|
||||
}
|
||||
|
||||
/*
|
||||
* 函数功能:块擦除(擦除128KB块)
|
||||
* 入口参数:block_addr - 块编号 uint32_t 0 - 2047
|
||||
* 返回值:0 - 成功,其他 - 错误码
|
||||
* 限定条件:gd5f2gq5ue_init() 已调用
|
||||
* 函数说明:1. 写使能 - D8h + 3字节字节地址 - 等待完成
|
||||
* 2. 擦除完成后检查 E_FAIL 位
|
||||
*/
|
||||
static int gd5f_block_erase(uint32_t block_addr)
|
||||
{
|
||||
* 鍑芥暟鍔熻兘锛氬潡鎿﹂櫎锛堟摝锟?28KB鍧楋級
|
||||
* 鍏ュ彛鍙傛暟锛歜lock_addr - 鍧楃紪锟? uint32_t 0 - 2047
|
||||
* 杩斿洖鍊硷細0 - 鎴愬姛锛屽叾锟?- 閿欒<E996BF>锟? * 闄愬畾鏉′欢锛歡d5f2gq5ue_init() 宸茶皟锟? * 鍑芥暟璇存槑锟?. 鍐欎娇锟?- D8h + 3瀛楄妭瀛楄妭鍦板潃 - 绛夊緟瀹屾垚
|
||||
* 2. 鎿﹂櫎瀹屾垚鍚庢<E98D9A>锟?E_FAIL 锟? */
|
||||
static int gd5f_block_erase(uint32_t block_addr) {
|
||||
int ret = GD5F_OK;
|
||||
uint8_t cmd[4];
|
||||
uint8_t status = 0;
|
||||
@@ -282,15 +259,11 @@ static int gd5f_block_erase(uint32_t block_addr)
|
||||
/*
|
||||
* 鍑芥暟鍔熻兘锛氬垵濮嬪寲 GD5F2GQ5UE
|
||||
* 鍏ュ彛鍙傛暟锛氭棤
|
||||
* 返回值:0 - 成功,其他 - 错误码
|
||||
* 限定条件:SPI1 和相关 GPIO 已由 CubeMX 初始化完成
|
||||
* 函数说明:1. 发送复位命令并等待完成
|
||||
* 2. 读取芯片 ID 并校验
|
||||
* 3. 使能内部 ECC (B0h bit4)
|
||||
* 杩斿洖鍊硷細0 - 鎴愬姛锛屽叾锟?- 閿欒<E996BF>锟? * 闄愬畾鏉′欢锛歋PI1 鍜岀浉锟?GPIO 宸茬敱 CubeMX 鍒濆<E98D92>鍖栧畬锟? * 鍑芥暟璇存槑锟?. 鍙戦€佸<E282AC>浣嶅懡浠ゅ苟绛夊緟瀹屾垚
|
||||
* 2. 璇诲彇鑺<E5BD87>墖 ID 骞舵牎锟? * 3. 浣胯兘鍐呴儴 ECC (B0h bit4)
|
||||
* 4. 瑙i櫎鎵€鏈夊潡淇濇姢 (A0h = 0x00)
|
||||
*/
|
||||
int gd5f2gq5ue_init(void)
|
||||
{
|
||||
int gd5f2gq5ue_init(void) {
|
||||
int ret = GD5F_OK;
|
||||
uint8_t mid = 0;
|
||||
uint8_t did = 0;
|
||||
@@ -338,15 +311,13 @@ int gd5f2gq5ue_init(void)
|
||||
}
|
||||
|
||||
/*
|
||||
* 函数功能:读取芯片 ID(MID + DID)
|
||||
* 入口参数:mid - 制造商 ID 输出指针 uint8_t* 不为 NULL
|
||||
* 鍑芥暟鍔熻兘锛氳<EFBFBD>鍙栬姱锟?ID锛圡ID + DID锟? * 鍏ュ彛鍙傛暟锛歮id - 鍒堕€犲晢 ID 杈撳嚭鎸囬拡 uint8_t* 涓嶄负 NULL
|
||||
* did - 璁惧<E79281> ID 杈撳嚭鎸囬拡 uint8_t* 涓嶄负 NULL
|
||||
* 杩斿洖鍊硷細0 - 鎴愬姛
|
||||
* 闄愬畾鏉′欢锛歋PI 宸插垵濮嬪寲
|
||||
* 函数说明:发送 9Fh 命令后接收1个 dummy + MID + DID
|
||||
* 鍑芥暟璇存槑锛氬彂锟?9Fh 鍛戒护鍚庢帴锟?锟?dummy + MID + DID
|
||||
*/
|
||||
int gd5f2gq5ue_read_id(uint8_t *mid, uint8_t *did)
|
||||
{
|
||||
int gd5f2gq5ue_read_id(uint8_t *p_mid, uint8_t *p_did) {
|
||||
uint8_t cmd = GD5F_CMD_READ_ID;
|
||||
uint8_t id_buf[3] = {0};
|
||||
|
||||
@@ -355,23 +326,19 @@ int gd5f2gq5ue_read_id(uint8_t *mid, uint8_t *did)
|
||||
HAL_SPI_Receive(&hspi1, id_buf, 3, GD5F_SPI_TIMEOUT);
|
||||
GD5F_CS_HIGH();
|
||||
|
||||
*mid = id_buf[1];
|
||||
*did = id_buf[2];
|
||||
*p_mid = id_buf[1];
|
||||
*p_did = id_buf[2];
|
||||
|
||||
return GD5F_OK;
|
||||
}
|
||||
|
||||
/*
|
||||
* 鍑芥暟鍔熻兘锛氫粠 NAND 璇诲彇鏁版嵁锛堟敮鎸佽法椤碉級
|
||||
* 入口参数:offset - 起始字节偏移 long 0 ~ 总容量-1
|
||||
* p_buf - 数据缓冲区 uint8_t* 不为 NULL
|
||||
* size - 读取字节数 size_t > 0
|
||||
* 返回值:0 - 成功,其他 - 错误码
|
||||
* 限定条件:gd5f2gq5ue_init() 已成功调用
|
||||
* 函数说明:自动处理跨页读取
|
||||
*/
|
||||
int gd5f2gq5ue_read(long offset, uint8_t *p_buf, size_t size)
|
||||
{
|
||||
* 鍏ュ彛鍙傛暟锛歰ffset - 璧峰<E792A7>瀛楄妭鍋忕Щ long 0 ~ 鎬诲<EFBFBD>锟?1
|
||||
* p_buf - 鏁版嵁缂撳啿锟? uint8_t* 涓嶄负 NULL
|
||||
* size - 璇诲彇瀛楄妭锟? size_t > 0
|
||||
* 杩斿洖鍊硷細0 - 鎴愬姛锛屽叾锟?- 閿欒<E996BF>锟? * 闄愬畾鏉′欢锛歡d5f2gq5ue_init() 宸叉垚鍔熻皟锟? * 鍑芥暟璇存槑锛氳嚜鍔ㄥ<E98D94>鐞嗚法椤佃<E6A4A4>锟? */
|
||||
int gd5f2gq5ue_read(long offset, uint8_t *p_buf, size_t size) {
|
||||
int ret = GD5F_OK;
|
||||
|
||||
while (size > 0) {
|
||||
@@ -403,15 +370,11 @@ int gd5f2gq5ue_read(long offset, uint8_t *p_buf, size_t size)
|
||||
|
||||
/*
|
||||
* 鍑芥暟鍔熻兘锛氬悜 NAND 鍐欏叆鏁版嵁锛堟敮鎸佽法椤碉級
|
||||
* 入口参数:offset - 起始字节偏移 long 0 ~ 总容量-1
|
||||
* p_buf - 数据缓冲区 const uint8_t* 不为 NULL
|
||||
* size - 写入字节数 size_t > 0
|
||||
* 返回值:0 - 成功,其他 - 错误码
|
||||
* 限定条件:gd5f2gq5ue_init() 已成功调用,目标区域已擦除
|
||||
* 函数说明:自动处理跨页写入
|
||||
*/
|
||||
int gd5f2gq5ue_write(long offset, const uint8_t *p_buf, size_t size)
|
||||
{
|
||||
* 鍏ュ彛鍙傛暟锛歰ffset - 璧峰<E792A7>瀛楄妭鍋忕Щ long 0 ~ 鎬诲<EFBFBD>锟?1
|
||||
* p_buf - 鏁版嵁缂撳啿锟? const uint8_t* 涓嶄负 NULL
|
||||
* size - 鍐欏叆瀛楄妭锟? size_t > 0
|
||||
* 杩斿洖鍊硷細0 - 鎴愬姛锛屽叾锟?- 閿欒<E996BF>锟? * 闄愬畾鏉′欢锛歡d5f2gq5ue_init() 宸叉垚鍔熻皟鐢<E79A9F>紝鐩<E7B49D>爣鍖哄煙宸叉摝锟? * 鍑芥暟璇存槑锛氳嚜鍔ㄥ<E98D94>鐞嗚法椤靛啓锟? */
|
||||
int gd5f2gq5ue_write(long offset, const uint8_t *p_buf, size_t size) {
|
||||
int ret = GD5F_OK;
|
||||
|
||||
while (size > 0) {
|
||||
@@ -437,15 +400,9 @@ int gd5f2gq5ue_write(long offset, const uint8_t *p_buf, size_t size)
|
||||
}
|
||||
|
||||
/*
|
||||
* 函数功能:擦除块(按块擦除,最小单位 128KB)
|
||||
* 入口参数:offset - 起始字节偏移 long 必须块对齐
|
||||
* size - 擦除字节数 size_t 必须块大小整数倍
|
||||
* 返回值:0 - 成功,其他 - 错误码
|
||||
* 限定条件:gd5f2gq5ue_init() 已成功调用
|
||||
* 函数说明:擦除操作以块为单位
|
||||
* 鍑芥暟鍔熻兘锛氭摝闄ゅ潡锛堟寜鍧楁摝闄わ紝鏈€灏忓崟锟?128KB锟? * 鍏ュ彛鍙傛暟锛歰ffset - 璧峰<E792A7>瀛楄妭鍋忕Щ long 蹇呴』鍧楀<E98DA7>锟? * size - 鎿﹂櫎瀛楄妭锟? size_t 蹇呴』鍧楀ぇ灏忔暣鏁帮拷? * 杩斿洖鍊硷細0 - 鎴愬姛锛屽叾锟?- 閿欒<E996BF>锟? * 闄愬畾鏉′欢锛歡d5f2gq5ue_init() 宸叉垚鍔熻皟锟? * 鍑芥暟璇存槑锛氭摝闄ゆ搷浣滀互鍧椾负鍗曚綅
|
||||
*/
|
||||
int gd5f2gq5ue_erase(long offset, size_t size)
|
||||
{
|
||||
int gd5f2gq5ue_erase(long offset, size_t size) {
|
||||
int ret = GD5F_OK;
|
||||
|
||||
if (offset % GD5F_BLOCK_SIZE != 0) {
|
||||
@@ -471,14 +428,12 @@ int gd5f2gq5ue_erase(long offset, size_t size)
|
||||
}
|
||||
|
||||
/*
|
||||
* 函数功能:复位芯片
|
||||
* 入口参数:无
|
||||
* 鍑芥暟鍔熻兘锛氬<EFBFBD>浣嶈姱锟? * 鍏ュ彛鍙傛暟锛氭棤
|
||||
* 杩斿洖鍊硷細0 - 鎴愬姛
|
||||
* 闄愬畾鏉′欢锛歋PI 宸插垵濮嬪寲
|
||||
* 函数说明:发送 FFh 复位命令后等待 5ms
|
||||
* 鍑芥暟璇存槑锛氬彂锟?FFh 澶嶄綅鍛戒护鍚庣瓑锟?5ms
|
||||
*/
|
||||
int gd5f2gq5ue_reset(void)
|
||||
{
|
||||
int gd5f2gq5ue_reset(void) {
|
||||
uint8_t cmd = GD5F_CMD_RESET;
|
||||
|
||||
GD5F_CS_LOW();
|
||||
@@ -489,3 +444,4 @@ int gd5f2gq5ue_reset(void)
|
||||
|
||||
return GD5F_OK;
|
||||
}
|
||||
|
||||
|
||||
@@ -101,7 +101,7 @@ int gd5f2gq5ue_init(void);
|
||||
* 限定条件:SPI 已初始化
|
||||
* 函数说明:发送 9Fh 命令后接收1个 dummy + MID + DID
|
||||
*/
|
||||
int gd5f2gq5ue_read_id(uint8_t *mid, uint8_t *did);
|
||||
int gd5f2gq5ue_read_id(uint8_t *p_mid, uint8_t *p_did);
|
||||
|
||||
/*
|
||||
* 函数功能:从 NAND 读取数据(支持跨页)
|
||||
|
||||
Reference in New Issue
Block a user