資源簡介
uint8_t Program_verify(uint8_t* buff1, uint8_t* buff2, uint32_t count);
void WB_Serial_NAND_Pageprogram_Pattern(uint8_t addh, uint8_t addl, uint8_t* program_buffer, uint32_t count);
void WB_Serial_NAND_Program_Excute(uint8_t addh, uint8_t addl);
/* status check */
uint8_t WB_Check_Embedded_ECC();
uint8_t WB_Check_Program_Erase_Fail_Flag();
uint8_t WB_Read_Serial_NAND_StatusRegister(uint8_t sr_sel);
void WB_Serial_NAND_ReadyBusy_Check();
uint32_t WB_NAND_Read_JEDEC_ID();
uint8_t WB_Serial_NAND_bad_block_check(uint32_t page_address);
void WB_Serial_NAND_LUT_Read(uint16_t* LBA, uint16_t* PBA);
/* Stack function for W25M series */
void WB_Die_Select(uint8_t select_die);
/* status set */
void WB_Enable_Embedded_ECC();
void WB_Disable_Embedded_ECC();
void WB_Enable_Buffer_mode();
void WB_Disable_Buffer_mode();
void WB_Serial_NAND_StatusRegister_Write_SR1(uint8_t SR1);
void WB_Serial_NAND_StatusRegister_Write_SR2(uint8_t SR2);
void WB_Serial_NAND_StatusRegister_Write_SR3(uint8_t SR3);
void WB_NAND_Reset();
void WB_Protect();
void WB_Unprotect();
void WB_Serial_NAND_LUT_Set(uint16_t LBA, uint16_t PBA);
/* erase function */
void WB_Serial_NAND_BlockErase(uint8_t PA_H, uint8_t PA_L);
/* read function */
void WB_Serial_NAND_PageDataRead(uint8_t PA_H, uint8_t PA_L);
void WB_Serial_NAND_Normal_Read(uint8_t addh, uint8_t addl, uint8_t* buff, uint32_t count);
void WB_Serial_NAND_Continuous_Normal_Read(uint8_t* buff, uint32_t count);

代碼片段和文件信息
/**
??******************************************************************************
??*?@file????/WB_SerialNAND_Sample_Code_LLD.c
??*?@author??Winbond?FAE?Steam?Lin
??*?@version?V1.0.4
??*?@date????9-March-2016
??*?@brief???This?code?provide?the?basic?Serial?NAND?Flash?application?cover?ONFI?NAND?Flash?working?behavior?based?on?STM32F205?
??*????????????
??*?COPYRIGHT?2015?Winbond.
*/?
#include?
#include?“WB_SerialNAND_Sample_Code_LLD.h“
#define?Page_size?0x800 //?2048?bytes?per?page
#define?Spare_size?0x40 //?64?bytes?per?page?spare?area
#define?Block_size?0x40 //?64?pages per?block
#define?Block_count?0x400 //?1024?blocks?per?1G?NAND
#define?status_ok?0x00
#define?ID_error?0x01
#define?Read_error?0x02
#define?Erase_error?0x03
#define?Program_error?0x04
#define?Bad_block_count_over?0x05
uint32_t?Chip_size?=?Page_size*Block_size*Block_count;
//?Address?data?mapping?follow?W25N01GV?datasheet?user?could?modify?according?to?the?controller?memory?mapping?method
#define?ADDR_Col_CA15_CA8(ADD) (uint8_t)(((ADD)?&?0x0F00)?>>?8)
#define?ADDR_Col_CA7_CA0(ADD) (uint8_t)((ADD)?&?0xFF)
#define?ADDR_Row_PA15_PA8(ADD) (uint8_t)(((ADD)?&?0xFF00000)?>>?20)
#define?ADDR_Row_PA7_PA0(ADD) (uint8_t)(((ADD)?&?0xFF000)?>>?12)
void?main(){
Initial_Serial_NAND();
Check_JEDEC_ID();
Check_Serial_NAND_Read_Write();
}
void?Die_Select_Sample(){
WB_Die_Select(0x00); //?Select?default?die
WB_Die_Select(0x01); //?Select?the?other?1G?NAND?Flash?die
}
void?Continuous_Read_Sample(){
uint8_t?read_buf[Chip_size]; //?read?whole?Flash?data
WB_Disable_Buffer_mode();?//?Enter?continuous?read?mode
WB_Serial_NAND_PageDataRead(0x00?0x00); //?Load?paga?data?address?at?0x00
WB_Serial_NAND_Continuous_Normal_Read(read_buf?Chip_size);
}
void?Initial_Serial_NAND(){
PCB_SPI_Bus_Init();? //?Initial?MOSI?MISO?and?CLK?
PCB_SPI_IO_Init(); //?Initial?CS?WP?CLK
PCB_Power_on(); //?Flash?power?on?function?prototype
WB_NAND_Reset(); //?Reset?instruction?Serial?NAND?enter?in?buffer?mode
//WB_Disable_embedded_ECC(); //?After?power?on?Winbond?Serial?NAND?ECC-E?default?=?1.?Set?ECC-E?=?0?to?disable?embedded?ECC
}
uint8_t?Check_JEDEC_ID(){
uint32_t?JEDEC_ID;
JEDEC_ID?=?WB_NAND_Read_JEDEC_ID(); //?Read?JEDEC_ID
if(JEDEC_ID?!=?0xEFAA21){
return?ID_error;
}
else{
return?status_ok;
}
}
uint8_t?Check_Serial_NAND_Read_Write(){
uint32_t?memory_offset?=?0;? //?Flash?Address?to?access
uint8_t?read_buffer[Page_size];
uint8_t?program_buffer[Page_size];
uint8_t?EPR_status; //?Check?Erase?program?read?status
uint32_t?i;
/*Do?un-protect?*/
WB_Unprotect();
/*Winbond?Serial?NAND?Flash?default?ECC-enable
//WB_Enable_embedded_ECC();
//WB_Disable_embedded_ECC();
/*Do?block?erase*/
//WB_Serial_NAND_BlockErase(?ADDR_Row_PA15_PA8(memory_offset)?ADDR_Row_PA7_PA0(memory_offset)?);?//?Do?Erase
WB_Serial_NAND_BlockErase(0?0);?//?
?屬性????????????大小?????日期????時間???名稱
-----------?---------??----------?-----??----
?????文件????????2117??2016-03-09?10:39??Read_me.txt
?????文件????????5979??2016-03-09?10:38??WB_SerialNAND_Sample_Code_APP.c
?????文件???????15195??2016-03-09?09:42??WB_SerialNAND_Sample_Code_LLD.c
?????文件????????2089??2016-03-09?09:43??WB_SerialNAND_Sample_Code_LLD.h
評論
共有 條評論