Flash: S29GL064N90FFI01
硬件连接:16位模式,nAMS0和nAMS1经过“与门”选通Flash,同时nAMS0连接至A19,寻址空间为0x2000 0000-0x201F FFFF;另外使用2个GPIO连接A20和A21,用于选通当前访问的2MByte。
初始化:CCLK=500MHz,SCLK=125MHz
*pEBIU_AMBCTL0 = 0x7BB07BB0;
*pEBIU_AMBCTL1 = 0x7BB07BB0;
*pEBIU_AMGCTL = 0x00FF;
底层驱动:使用Spansion官网的lld_S29GLxxxN.c
问题:
1. 读取DeviceID不稳定,大多数情况为0x007e0c01,是正确的,偶尔为0x00ff22ff;
2. 整片擦除过程,ToggleBit的状态定时出现DEV_SUSPEND状态,发现是定时器中断的影响,关掉中断之后起初貌似正常,但是还偶尔遇到过第一次查询就出现DEV_SUSPEND的现象,修改驱动程序,当出现该现象时仍处于循环等待状态,则擦除过程是正确的;
3. 向Flash循环写入数据,当地址偏移量为0x0010 0000时(即nAMS0和nAMS1的边界),提示校验错误(出现DEVICE_NOT_BUSY状态,然后读取数据进行比较)。
本段代码如下, 使用测试方式一时异常,只有Bank0和Bank2的前半部分可以写入;测试方式二时4个Bank都可写入。
for (j=0; j<4; j++)
{
SelNorFlashBank(j);
DelayMS(1);
for (i=0; i<FLASH_BYTE_NUM; i+=2)
{
#if (1) // 测试方式一
mask_int = cli();
status = lld_ProgramOp(base_addr, i, tdata[j]);
sti(mask_int);
if (status != DEV_NOT_BUSY)
{
error |= 2;
printf("Error! Status = %d\n", status);
break;
}
#else // 测试方式二
mask_int = cli();
lld_ProgramCmd(base_addr, i, &tdata[j]);
sti(mask_int);
while (1)
{
status = lld_StatusGet(base_addr, i);
if (status == DEV_NOT_BUSY)
{
break;
}
}
#endif
readbuf[j][i/2] = lld_ReadOp(base_addr, i);
}
}
请帮忙分析,多谢!