转载的!!!
同时要联想阅读:http://blog.chinaunix.net/u1/58640/showart_459199.html
很好的资料:
|
文件: | S3C44B0X存储控制器功能及应用.pdf |
大小: | 1849KB |
下载: | 下载 |
|
1
29LV160TE芯片具有3种
擦除方式:整片擦除、扇区擦除和快擦除。主要来看进行扇区擦除。
参考表中扇区擦除的操作流程,由此我们得到扇区擦除子程序的主体如下:
void F29LV160_EraseSector(int targetAddr)
{
Uart_Printf("Sector Erase is started!\n");
_RESET( ); //芯片复位
_WR(0x555,0xaa);
_WR(0x2aa,0x55);
_WR(0x555,0x80);
_WR(0x555,0xaa);
_WR(0x2aa,0x55);
_WR(BADDR2WADDR(targetAddr),0x30);
_WAIT( ); //等待擦除结束
_RESET( ); //芯片复位
}
其中 _WR(addr,data)是写入一个字函数。addr 为写入数据的目标地址,由于 data 为 16 位字而不是字节,addr 也是字地址。对处理器而言地址是以字节为单位的,因此,addr 必须加以调整,左移 1 位。
_ WR(addr,data) 函数:
#define _WR(addr,data) *((U16 *)(addr<<1))=(U16)data
BADDR2WADDR(Addr)函数:
#define BADDAZWADDR(Addr) (Addr>>1)
2
整片擦除之后,就能够在 flash 的任意地址中进行写入操作了。参考表,得到字写入子程序的主体如下:
int F29LV160_ProgFlash(U32 realAddr,U16 data)
{
volatile U16 *tempPt;
int temp,count=0;
tempPt=(volatile U16 *)realAddr;
_WR(0x555,0xaa);
_WR(0x2aa,0x55);
_WR(0x555,0xa0);
*tempPt=data;
return _WAIT( );
}
3不会这里,有人知道吗?
在写入操作的最后,有一个判断写入是否完成的_WAIT()的过程。
在这里我们采用 Toggle bit(翻转位)的方法检测 DQ6 脚的输出,若翻转停止则表示写入完成:
int _WAIT(void) //检测DQ6输出是否停止翻转
{
volatile U16 flashStatus,old;
old=*((volatile U16 *)0x0);
while(1)
{
flashStatus=*((volatile U16 *)0x0);
if( (old&0x40) == (flashStatus&0x40))
break;
if( flashStatus&0x20 ) //测试超时标志位DQ5
{
old=*((volatile U16 *)0x0);
flashStatus=*((volatile U16 *)0x0);
if( (old&0x40) == (flashStatus&0x40) ) return 1; //无翻转
else return 0; //翻转
}
old=flashStatus;
}
return 1;
}
|
存储器组设计和控制
S3C44B0X 有 6 组 ROM/SRAM(ROM0 组为 Boot ROM)和 2 组 ROM/SRAM/FP/EDO/SDRAM. S3C44B0X 中的系统管理能够通过 S/W 控制每组的访问时间、数据总线宽度,ROM/SRAM 组的访问时间和 FP/EDO/SDRAM 组被系统管理寄存器中的 BANKCON0-7 和 BANKCON6-7 控制。组 6-7 的类型需要相同.(例如 ROM&ROM,SDRAM&SDRAM)每组 ROM/SRAM/DRAM 的数据宽度受 BWSCON 控制寄存器控制。 ROM 组 0 用于 Boot ROM 组,因此组 0 受 H/W 控制,OM[1:0]用于这个目的的。 当系统复位时,通过专用的命令,LDMIA和STMIA对 BWSCON,BANKCON0-7,BANKSIZE, MRSRB6/7实施控制。例如下面代码用来配置特殊功能寄存器。
对特定地址的写入和读出操作: #define _WR(addr,data) *((U16 )(addr<<1))=(U16)data
#define _RD(addr) ( *((U16 *)(addr<<1)) )
|
阅读(787) | 评论(0) | 转发(0) |