|
|
#ifndef __FLASH_H
|
|
|
#define __FLASH_H
|
|
|
|
|
|
#include "sys.h"
|
|
|
#include "LT768.h"
|
|
|
|
|
|
#define MCU_SPI 1
|
|
|
#define LT_SPI 0
|
|
|
#define UartTFT_Flash_0 0
|
|
|
#define DMA_flag 0
|
|
|
|
|
|
#define Back_color White
|
|
|
#define File_name_color Black
|
|
|
#define Warm_color Orange
|
|
|
#define OK_color Blue
|
|
|
#define NG_color Red
|
|
|
#define Fail_color Red
|
|
|
#define None_color Purple
|
|
|
#define Progress_color Black
|
|
|
extern u8 MUC_SS_flag;
|
|
|
extern u8 W25Q256 ;
|
|
|
typedef struct VCOM_REP
|
|
|
{
|
|
|
//UINT8 buf[512];
|
|
|
UINT32 wrAddr;
|
|
|
UINT16 wrLen;
|
|
|
UINT8 fullIndex;
|
|
|
UINT8 actIndex;
|
|
|
} vcom_rep;
|
|
|
|
|
|
typedef union {
|
|
|
char u8[4];
|
|
|
int u32;
|
|
|
}UN_u32Data;
|
|
|
|
|
|
typedef union {
|
|
|
char u8[2];
|
|
|
short u16;
|
|
|
}UN_u16Data;
|
|
|
|
|
|
extern u8 Flash_type;
|
|
|
|
|
|
#if MCU_SPI
|
|
|
|
|
|
void MCU_SS_RESET(void);
|
|
|
void MCU_SS_SET(void);
|
|
|
#define Flash_SS_RESET /*SPI1->U8SPIPORT.SS = 0*/MCU_SS_RESET()
|
|
|
#define Flash_SS_SET /*SPI1->U8SPIPORT.SS = 1*/MCU_SS_SET()
|
|
|
#define SPIWR SPI1_ReadWriteByte
|
|
|
|
|
|
#else
|
|
|
#define Flash_SS_RESET nSS_Active()
|
|
|
#define Flash_SS_SET nSS_Inactive()
|
|
|
#define SPIWR SPI_Master_FIFO_Data_Put
|
|
|
|
|
|
#endif
|
|
|
|
|
|
/*
|
|
|
#define MUC_CS0_RESET *(volatile unsigned char*)(0x40019000+0x05) &= ~(1<<(5)); //GINT5 拉低
|
|
|
#define MUC_CS0_SET *(volatile unsigned char*)(0x40019000+0x05) |= (1<<(5)); //GINT5 拉高
|
|
|
#define MUC_CS0_INPUT *(volatile unsigned char*)(0x40019000+0x03) &= ~(1<<(5)); //GINT5配置为输入,CS0配置为输入
|
|
|
#define MUC_CS0_OUTPUT *(volatile unsigned char*)(0x40019000+0x03) |= 1<<(5); //GINT5配置为输出,CS0配置为输出
|
|
|
*/
|
|
|
#define MUC_CS0_RESET EPORT_WriteGpioData(EPORT_PIN3, Bit_RESET);//EPORT_WriteGpioData(EPORT_PIN1, Bit_RESET);
|
|
|
#define MUC_CS0_SET EPORT_WriteGpioData(EPORT_PIN3, Bit_SET);//EPORT_WriteGpioData(EPORT_PIN1, Bit_SET);
|
|
|
#define MUC_CS0_OUTPUT EPORT_ConfigGpio(EPORT_PIN3, GPIO_OUTPUT);
|
|
|
#define MUC_CS0_INPUT EPORT_ConfigGpio(EPORT_PIN3, GPIO_INPUT);
|
|
|
|
|
|
|
|
|
void SPI1_Flash_Init(void);
|
|
|
void Close_SPI1(void);
|
|
|
UINT8 SPI1_ReadWriteByte(UINT8 Send);
|
|
|
void SPI1_Clock(u8 prescale);
|
|
|
|
|
|
|
|
|
/*************************** winbond NorFlash ***************************/
|
|
|
|
|
|
/*读取器件ID*/
|
|
|
UINT16 W25QXX_ReadID(void);
|
|
|
UINT32 W25QXX_ReadID_9F(void);
|
|
|
//-----------------------------------------
|
|
|
|
|
|
/*写使能和失能*/
|
|
|
void W25QXX_Write_Enable(void); //W25QXX写使能
|
|
|
void W25QXX_Wait_Busy(void); //W25QXX写禁止
|
|
|
//-----------------------------------------
|
|
|
|
|
|
/*读写状态寄存器*/
|
|
|
UINT8 W25QXX_ReadSR(void); //读取W25QXX的状态寄存器
|
|
|
//-----------------------------------------
|
|
|
|
|
|
/*擦除*/
|
|
|
void W25QXX_Erase_Chip(void);
|
|
|
void W25QXX_SectorErase4KB(UINT32 addr);
|
|
|
void W25QXX_BlockErase64KB(UINT32 addr);
|
|
|
//-----------------------------------------
|
|
|
|
|
|
/*读写操作*/
|
|
|
//单页读写
|
|
|
void W25QXX_Write_Page(UINT8* pBuffer,UINT32 WriteAddr,UINT16 NumByteToWrite);
|
|
|
|
|
|
//连续读写
|
|
|
void W25QXX_Read(UINT8* pBuffer,UINT32 ReadAddr,UINT16 NumByteToRead);
|
|
|
void W25QXX_Write_NoCheck(UINT8* pBuffer,UINT32 WriteAddr,UINT16 NumByteToWrite);
|
|
|
//-----------------------------------------
|
|
|
|
|
|
/*4Byte地址*/
|
|
|
void W25QXX_Enter_4Byte_AddressMode(void);
|
|
|
//-----------------------------------------
|
|
|
|
|
|
void W25QXX_Wait_Busy(void);
|
|
|
/*************************** winbond NorFlash ***************************/
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/*************************** winbond NandFlash **************************/
|
|
|
|
|
|
/*读取器件ID*/
|
|
|
uint32_t W25N01GV_ReadID(void);
|
|
|
//-----------------------------------------
|
|
|
|
|
|
/*写使能和失能*/
|
|
|
void W25N01GV_Write_Enable(void);
|
|
|
void W25N01GV_Write_Disable(void);
|
|
|
//-----------------------------------------
|
|
|
|
|
|
/*读写状态寄存器*/
|
|
|
uint8_t W25N01GV_ReadSR(uint8_t reg);
|
|
|
void W25N01GV_Write_SR(uint8_t reg, uint8_t val);
|
|
|
//-----------------------------------------
|
|
|
|
|
|
/*擦除*/
|
|
|
void W25N01GV_EraseFlash(void);
|
|
|
void W25N01GV_Erase_Block(uint16_t block);
|
|
|
//-----------------------------------------
|
|
|
|
|
|
|
|
|
void W25N01GV_Write_NoCheck(uint8_t* pBuffer,uint32_t WriteAddr,uint16_t NumByteToWrite);
|
|
|
void W25N01GV_Read_NoCheck(uint8_t* pBuffer,uint32_t ReadAddr,uint16_t NumByteToRead);
|
|
|
void W25N01GV_WritePageAddr_Data(uint8_t* pBuffer,uint16_t ColumnAddr,uint32_t PageAddr,uint16_t NumByteToWrite); //不能写入超过2048 Byte(一页2048个Byte,后面的64 Byte非数据位)
|
|
|
void W25N01GV_ReadPageAddr_Data(uint8_t* pBuffer,uint16_t ColumnAddr,uint32_t PageAddr,uint16_t NumByteToRead);
|
|
|
|
|
|
typedef struct
|
|
|
{
|
|
|
uint16_t LBA ; //坏块地址
|
|
|
uint16_t PBA ; //替换地址
|
|
|
}BBM;
|
|
|
void W25N01GV_Read_BBM_LUT(BBM * L );
|
|
|
uint8_t W25N01GV_Bad_Block_Replace(uint16_t LBA,uint16_t PBA);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#endif
|
|
|
|