/** ****************************************************************************** * @file gd5f2gq5ue.h * @brief GD5F2GQ5UE SPI NAND Flash 驱动头文件 ****************************************************************************** */ #ifndef __GD5F2GQ5UE_H #define __GD5F2GQ5UE_H #ifdef __cplusplus extern "C" { #endif #include "main.h" #include "spi.h" /* ===================== 硬件引脚定义 ===================== */ #define GD5F_CS_LOW() HAL_GPIO_WritePin(GD_CS_GPIO_Port, GD_CS_Pin, GPIO_PIN_RESET) #define GD5F_CS_HIGH() HAL_GPIO_WritePin(GD_CS_GPIO_Port, GD_CS_Pin, GPIO_PIN_SET) #define GD5F_WP_HIGH() HAL_GPIO_WritePin(GD_WP_GPIO_Port, GD_WP_Pin, GPIO_PIN_SET) #define GD5F_HOLD_HIGH() HAL_GPIO_WritePin(GD_HOLD_GPIO_Port, GD_HOLD_Pin, GPIO_PIN_SET) /* ===================== SPI 命令码 ===================== */ #define GD5F_CMD_WRITE_ENABLE 0x06 #define GD5F_CMD_WRITE_DISABLE 0x04 #define GD5F_CMD_GET_FEATURE 0x0F #define GD5F_CMD_SET_FEATURE 0x1F #define GD5F_CMD_READ_ID 0x9F #define GD5F_CMD_PAGE_READ 0x13 #define GD5F_CMD_READ_FROM_CACHE 0x0B /* Fast Read, 1 dummy byte */ #define GD5F_CMD_PROGRAM_LOAD 0x02 #define GD5F_CMD_PROGRAM_EXEC 0x10 #define GD5F_CMD_BLOCK_ERASE 0xD8 #define GD5F_CMD_RESET 0xFF /* ===================== 寄存器地址 ===================== */ #define GD5F_REG_STATUS 0xC0 #define GD5F_REG_PROTECT 0xA0 #define GD5F_REG_FEATURE 0xB0 #define GD5F_REG_DRIVER 0xD0 /* ===================== 状态位定义 ===================== */ #define GD5F_STATUS_OIP (1 << 0) /* 操作进行中 */ #define GD5F_STATUS_WEL (1 << 1) /* 写使能锁存 */ #define GD5F_STATUS_E_FAIL (1 << 2) /* 擦除失败 */ #define GD5F_STATUS_P_FAIL (1 << 3) /* 编程失败 */ #define GD5F_STATUS_BIT4 (1 << 4) #define GD5F_STATUS_ECCS0 (1 << 5) #define GD5F_STATUS_ECCS1 (1 << 6) #define GD5F_STATUS_ECCSE0 (1 << 4) /* ECC 单 bit 错误低位 */ #define GD5F_STATUS_ECCSE1 (1 << 5) /* ECC 单 bit 错误高位 */ #define GD5F_STATUS_ECCSE2 (1 << 6) /* ECC 单 bit 错误高位 */ /* ===================== Feature 位定义 ===================== */ #define GD5F_FEATURE_ECC_EN (1 << 4) #define GD5F_FEATURE_QE (1 << 0) /* Quad Enable, B0[0] */ /* ===================== 芯片参数 ===================== */ #define GD5F_PAGE_SIZE 2048 /* 主数据区字节数 */ #define GD5F_SPARE_SIZE 64 /* ECC 启用时 spare 区 */ #define GD5F_TOTAL_PAGE_SIZE 2112 /* 2048 + 64 */ #define GD5F_PAGES_PER_BLOCK 64 #define GD5F_BLOCK_SIZE (GD5F_PAGES_PER_BLOCK * GD5F_PAGE_SIZE) /* 128KB */ #define GD5F_TOTAL_BLOCKS 2048 #define GD5F_TOTAL_SIZE (GD5F_TOTAL_BLOCKS * GD5F_BLOCK_SIZE) /* 256MB */ /* 制造商 ID 和设备 ID */ #define GD5F_MANUFACTURER_ID 0xC8 #define GD5F_DEVICE_ID 0x52 /* ===================== 返回值定义 ===================== */ #define GD5F_OK 0 #define GD5F_ERROR -1 #define GD5F_BUSY_TIMEOUT -2 #define GD5F_ECC_ERROR -3 #define GD5F_PROGRAM_FAIL -4 #define GD5F_ERASE_FAIL -5 #define GD5F_ID_MISMATCH -6 /* ===================== 公共接口函数 ===================== */ /** * @brief 初始化 GD5F2GQ5UE(SPI + GPIO + 读 ID 验证) * @retval GD5F_OK 成功, 其他为错误码 */ int gd5f2gq5ue_init(void); /** * @brief 读取芯片 ID(MID + DID) * @param mid: 制造商 ID 输出指针 * @param did: 设备 ID 输出指针 * @retval GD5F_OK 成功 */ int gd5f2gq5ue_read_id(uint8_t *mid, uint8_t *did); /** * @brief 从 NAND 读取数据(支持跨页) * @param offset: 起始字节偏移(相对于 Flash 起始地址) * @param buf: 数据缓冲区 * @param size: 读取字节数 * @retval GD5F_OK 成功 */ int gd5f2gq5ue_read(long offset, uint8_t *buf, size_t size); /** * @brief 向 NAND 写入数据(支持跨页) * @param offset: 起始字节偏移 * @param buf: 数据缓冲区 * @param size: 写入字节数 * @retval GD5F_OK 成功 */ int gd5f2gq5ue_write(long offset, const uint8_t *buf, size_t size); /** * @brief 擦除块(按块擦除,最小单位 128KB) * @param offset: 起始字节偏移(必须块对齐) * @param size: 擦除字节数(必须为块大小的整数倍) * @retval GD5F_OK 成功 */ int gd5f2gq5ue_erase(long offset, size_t size); /** * @brief 复位芯片 * @retval GD5F_OK 成功 */ int gd5f2gq5ue_reset(void); #ifdef __cplusplus } #endif #endif /* __GD5F2GQ5UE_H */