2.Flash芯片—SST39VF400A介绍
Flash是一种体积小,容量大的非易失性存贮器,可以反复烧写十万次。但其写操作比较麻烦:一是先要擦除,后写数据;二是写擦除/写操作之前需要加上一定前导指令码。
YK5000实验仪板载Flash芯片型号为SST39VF400A,此芯片是Silicon Storage Technology生产的4M位(256k×16)FLASH存储器。以下是SST39LF400A写操作指令码:
表9.1 SST39LF400A指令序列
指令序列 1 2 3 4 5 6
Addr D Addr D Addr D Addr D Addr D Addr D
写数据 5555 AA 2AAA 55 5555 A0 WA Data
擦除扇区 5555 AA 2AAA 55 5555 80 5555 AA 2AAA 55 SAX 30
擦除区块 5555 AA 2AAA 55 5555 80 5555 AA 2AAA 55 BAX 50
擦除整片 5555 AA 2AAA 55 5555 80 5555 AA 2AAA 55 5555 10
WA表示写数据地址,SAX表示扇区地址,扇区大小是2k Word;BAX表示区块地址,区块大小是32k Word。
需要特别注意的是,Flash指令序列中的Addr格式是A14~A0,默认其高位地址线为0。在YK5000实验仪中,Flash被映射到DSP的高32k地址(0x8000~0xFFFF),因此,在DSP中访问Flash空间的时候,写地址Addr都需要加上基地址0x8000。
详细内容,请阅读SST39LF400A的数据手册。
实验内容
本小节的实验内容是在CCS里编写一个擦除、烧写YK5000实验仪上Flash芯片的程序。
要求:
1. 擦除Flash的存储区;
2. 将Flash切换到第0页;
3. 将数据0x0000~0x8000烧写到第0页存储区内。
在CCS的仿真、调试环境下,读者可以实时的观察到Flash中存储区变化情况,掌握Flash读写操作的知识。
(1)整块Flash的擦除
只要在相应地址写入表9.1所示的指令序列,就能对SST39LF400A进行各种擦除操作,下面是擦除整片Flash所用的函数形式:
//定义指向地址0x8000的IO端口变量,用来控制Flash页面切换
ioport unsigned port8000h;
//擦除整块Flash
void EraseChip()
{
unsigned int i;
*(volatile unsigned int *)(0x8000+0x5555) = 0xAA;
delay(10);
*(volatile unsigned int *)(0x8000+0x2AAA) = 0x55;
delay(10);
*(volatile unsigned int *)(0x8000+0x5555)= 0x80;
delay(10);
*(volatile unsigned int *)(0x8000+0x5555)= 0xAA;
delay(10);
*(volatile unsigned int *)(0x8000+0x2AAA)= 0x55;
delay(10);
*(volatile unsigned int *)(0x8000+0x5555)= 0x10;
delay(10);
//验证
for( i=0x0; i<07FFF; i++ ) //在此仅验证页0擦除操作是否正确完成
while( *(volatile unsigned int *)(0x8000+i) != 0xffff );
}
(2)为Flash写入特定的数据
为了方便观察起见,将数据0x0000~0x8000烧写到Flash的第0页存储区内。函数形式如下:
//向Flash中写数据,依次为0x0000--0xFFFF
void WriteChip()
{
unsigned int i;
for( i=0; i<=0x7FFF; i++ )
{
*(volatile unsigned int *)(0x8000+0x5555) = 0xAA;
delay(PERIOD);
*(volatile unsigned int *)(0x8000+0x2AAA) = 0x55;
delay(PERIOD);
*(volatile unsigned int *)(0x8000+0x5555)= 0xA0;
delay(PERIOD);
*(volatile unsigned int *)(0x8000+i) = i;
delay(PERIOD);
//在此仅验证当前字写入操作是否正确完成
while( *(volatile unsigned int *)(0x8000+i) != i );