闪速存储器芯片K9F6408系列的典型应用
sh_CE=0;file://片选
WriteCommand(0x00);file://写读的命令
WriteAddress(0x00,0);file://写读的地址
for(d=0;d!=2;d++)file://一次读两页
{
uintk=528;file://每个扇区有528个字节
while(!Flash_RB)//当读信号无效时,等待
{
}
while(k)file://当k不为0时,就继读;否则就停止读
{
Flash_RD=0;file://准备好读入
#pragmaasmfile://嵌入汇编,插入2个机器周期
NOP
NOP
#pragmaendasm//结束汇编
ACC=P0;file://把P0口读出的值存入ACC寄存器
#pragmaasm//嵌入汇编,插入2个机器周期
NOP
NOP
#pragmaendasm//结束汇编
Flash_RD=1;file://不再读入
SendData();file://串口发送数据
k--;
}
}
Flash_CE=1;file://不再片选
}
3)写flash:和读操作不一样的是,写操作有两个命令字:0X80和0X10,写入0X80后,表示将向寄存器中写入数据,如果再键入0X10则Flash中的控制器将寄存器的数据存储到数据存储器中。写操作时,将欲写入数据的地址与错误扇区表相对照,看是否在表中。如果在表中,则将页指针地址加十六(即换到下一个Block中),再对照,循环操作直到找到不在表中的地址。以此保证所写的地址都是有效地址。具体过程:选中Flash,通过I/O口写入写命令字,写入所要编程数据地址,置写信号有效。(写时序见图五
*unsignedcharAssertBlock(unsignedchara)//与记录坏块的表相对照的子程序
{
unsignedchari=0;
while(i!=invalidblockbound+1)//invalidblockbound是无效块的总数
{
while(a!=*InvalidBlockAddress++)//当未遍历到最后一个无效块时,就继续核对
{
i++;
}
}
if(i!=invalidblockbound+2)
return1;//无效的块
else
return0;//有效的块
}
voidWrite(void)//写操作
{
unsignedcharh;
if(first)//当开始对一页进行写操作时,first=1,否则为0
{
Flash_CE=0;file://片选
WriteCommand(0x80);file://写命令0x80
*ucharAssertBlock(startpage/16)file://与记录坏块的表相对照
WriteAddress(0x00,startpage);file://写地址
first=0;
}
for(h=0;h!=16;h++)
WriteData(output[h]);file://写入寄存器处理好的GPS数据
if(FlagWrite)//当寄存器中数据满528字节(1页)时,FlagWrite=1,否则为0
{
WriteCommand(0x10);//将数据写入flash
while(!Flash_RB)file://等待读信号有效
{
}
WriteCommand(0x70);file://读状态量
Delay10us();
Flash_RD=0;file://准备好读入
#pragmaasm//嵌入汇编,插入两个机器周期
nop
nop
#pragmaendasm//结束汇编
ACC=P0;
ACC=ACC&0x01;
Flash_RD=1;
if(ACC!=0)file://若最后一位不 《闪速存储器芯片K9F6408系列的典型应用(第2页)》
本文链接地址:http://www.oyaya.net/fanwen/view/165318.html
WriteCommand(0x00);file://写读的命令
WriteAddress(0x00,0);file://写读的地址
for(d=0;d!=2;d++)file://一次读两页
{
uintk=528;file://每个扇区有528个字节
while(!Flash_RB)//当读信号无效时,等待
{
}
while(k)file://当k不为0时,就继读;否则就停止读
{
Flash_RD=0;file://准备好读入
#pragmaasmfile://嵌入汇编,插入2个机器周期
NOP
NOP
#pragmaendasm//结束汇编
ACC=P0;file://把P0口读出的值存入ACC寄存器
#pragmaasm//嵌入汇编,插入2个机器周期
NOP
NOP
#pragmaendasm//结束汇编
Flash_RD=1;file://不再读入
SendData();file://串口发送数据
k--;
}
}
Flash_CE=1;file://不再片选
}
3)写flash:和读操作不一样的是,写操作有两个命令字:0X80和0X10,写入0X80后,表示将向寄存器中写入数据,如果再键入0X10则Flash中的控制器将寄存器的数据存储到数据存储器中。写操作时,将欲写入数据的地址与错误扇区表相对照,看是否在表中。如果在表中,则将页指针地址加十六(即换到下一个Block中),再对照,循环操作直到找到不在表中的地址。以此保证所写的地址都是有效地址。具体过程:选中Flash,通过I/O口写入写命令字,写入所要编程数据地址,置写信号有效。(写时序见图五
*unsignedcharAssertBlock(unsignedchara)//与记录坏块的表相对照的子程序
{
unsignedchari=0;
while(i!=invalidblockbound+1)//invalidblockbound是无效块的总数
{
while(a!=*InvalidBlockAddress++)//当未遍历到最后一个无效块时,就继续核对
{
i++;
}
}
if(i!=invalidblockbound+2)
return1;//无效的块
else
return0;//有效的块
}
voidWrite(void)//写操作
{
unsignedcharh;
if(first)//当开始对一页进行写操作时,first=1,否则为0
{
Flash_CE=0;file://片选
WriteCommand(0x80);file://写命令0x80
*ucharAssertBlock(startpage/16)file://与记录坏块的表相对照
WriteAddress(0x00,startpage);file://写地址
first=0;
}
for(h=0;h!=16;h++)
WriteData(output[h]);file://写入寄存器处理好的GPS数据
if(FlagWrite)//当寄存器中数据满528字节(1页)时,FlagWrite=1,否则为0
{
WriteCommand(0x10);//将数据写入flash
while(!Flash_RB)file://等待读信号有效
{
}
WriteCommand(0x70);file://读状态量
Delay10us();
Flash_RD=0;file://准备好读入
#pragmaasm//嵌入汇编,插入两个机器周期
nop
nop
#pragmaendasm//结束汇编
ACC=P0;
ACC=ACC&0x01;
Flash_RD=1;
if(ACC!=0)file://若最后一位不 《闪速存储器芯片K9F6408系列的典型应用(第2页)》