📄 flash.c
字号:
#include "flash.h"
#include "..\Target\44b.h"
#include "..\Target\44blib.h"
#define LASTBLOCK 1023
void ST_CMD(void)
{
rPDATC =(rPDATC&0xf1)|(Nand_CLE&(~(Nand_CE|Nand_ALE)));
// CLE为高、CE和ALE为低
}
void ST_ADR(void)
{
rPDATC =(rPDATC&0xf1)|(Nand_ALE&(~(Nand_CE|Nand_CLE)));
// ALE为高、CE和CLE为低
}
void ST_DAT(void)
{
rPDATC =(rPDATC&0xf1)|( ~(Nand_CE|Nand_CLE| Nand_ALE));
// ALE、CE和CLE全为低
}
void ST_INVALID(void)
{
rPDATC =(rPDATC&0xf1)|( Nand_CE&(~(Nand_CLE|Nand_ALE)));
// CE为高、ALE和CLE为低
}
void WAIT_RB(void)
{
while(!(rPDATC & Nand_RB));
}
unsigned int Check_Flash_Id(void)
{
int i;
unsigned int id;
ST_CMD();
Nand_IO = 0x90;
ST_ADR();
Nand_IO = 0;
ST_DAT();
for(i=0;i<10;i++);
id = Nand_IO<<8;//连续读出两个字节
id += Nand_IO;
ST_INVALID();
return id;
}
void Flash_Reset()
{
int i;
// rPDATC = rPDATC | WP;
ST_CMD();
Nand_IO = 0xff;
for (i=0;i<3000;i++);
}
/********************************************************/
/*功能:擦除FLASH的1Block(对应文件系统为1Cluster) */
/********************************************************/
unsigned char Erase_Block(unsigned int block)
{
unsigned int blockPage = (block<<5);
int i;
ST_CMD();
Nand_IO = 0x60;
ST_ADR();
Nand_IO = blockPage & 0xff;
Nand_IO = (blockPage>>8) & 0xff;
for(i=0;i<2;i++);
ST_CMD();
Nand_IO = 0xd0;
for(i=0;i<3;i++);
ST_DAT();
WAIT_RB();
ST_CMD();
Nand_IO = 0x70;
ST_DAT();
if (Nand_IO & 0x1)
{
ST_INVALID();
return FAIL;
}
else
{
ST_INVALID();
return OK;
}
}
/*****************************************************************/
/*功能:读取FLASH的某个Block中的1page数据 */
/*****************************************************************/
void Read_Page(unsigned int block,unsigned int page,unsigned char *buffer)
{
int i;
unsigned int blockPage = (block<<5) + page;
ST_CMD();
Nand_IO = 0x00;
ST_ADR();
Nand_IO = 0;
Nand_IO = blockPage & 0xff;
Nand_IO = (blockPage>>8) & 0xff;
for(i=0;i<3;i++);
ST_DAT();
WAIT_RB();
for(i=0;i<528;i++)
{
*buffer++=Nand_IO;
}
//ReadPage(buffer);
ST_INVALID();
}
/*****************************************************************/
/*功能:向FLASH的某个Block中的1page写入数据 */
/*输出:0:Fail;1:OK */
/*****************************************************************/
int Write_Page(unsigned int block,unsigned int page,unsigned char *buffer)
{
unsigned int blockPage = (block<<5) + page;
int i;
unsigned char *Source;
Source=buffer;
ST_CMD();
Nand_IO = 0x80;
ST_ADR();
Nand_IO = 0;
Nand_IO = blockPage & 0xff;
Nand_IO = (blockPage>>8) & 0xff;
ST_DAT();
for(i=0;i<528;i++)
{
Nand_IO=*buffer++;
}
//WritePage(buffer);
ST_CMD();
Nand_IO = 0x10;
for(i=0;i<10;i++);
WAIT_RB();
Nand_IO = 0x70;
ST_DAT();
for(i=0;i<3;i++);
if((Nand_IO & 0x1))
{
ST_INVALID();
return 0;
}
else
{
ST_INVALID();
return 1;
}
}
void Read_ID(void)
{
unsigned short id;
id = Check_Flash_Id();
Uart_Printf("\nChip's ID is 0x%4x.",id);
}
void Erase_test(void)
{
Uart_Printf("\nBegin to erase the last block...");
if(Erase_Block(LASTBLOCK))
Uart_Printf("\nOK! Compeleted.");
else
Uart_Printf("\nErase error!");
}
void Write_test(void)
{
int i;
unsigned char buffer[528];
for(i=0;i<528;i++)
buffer[i]=0xaa;
Uart_Printf("\nBegin to Write the first Page of the last block...");
if(Write_Page(LASTBLOCK,0,buffer))
Uart_Printf("\nOK! Compeleted.");
else
Uart_Printf("\nWrite error!");
}
void Read_test(void)
{
int i,j=0;
unsigned char buffer[528];
Uart_Printf("\nBegin to Read the first Page of the last block...");
Read_Page(LASTBLOCK,0,buffer);
for(i=0;i<528;i++)
{
if(buffer[i]==0xaa)
j++;
}
Uart_Printf("\n%4d Bytes verify match!",j);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -