笔者使用的是MEIF接口对FLASH接口进行操作,EMIF初始化和系统初始化与本文无关,故不再详细介绍,本文只列举对S29GL256S11的操作。其实SPI操作与EMIF操作类似,只是调用的接口不一样而已。
指令和地址关系如图:
1.FLASH擦除操作
全片擦除的指令顺序(最好在指令间延迟一会儿):
1.地址0x555写入0xAA
2.地址0x2AA写入0x55
3.地址0x555写入0x80
4.地址0x555写入0xAA
5.地址0x2AA写入0x55
6.地址0x555写入0x10
7.等待擦除信号完成,我就没有去判断DQ引脚状态,直接读出地址数据是否为0XFF,有点不严谨,应该加一个超时检测,不然如果出问题会一直卡死在这儿,但是只是测试使用。
//整片擦除
void Nor_Flash_Erase()
{EMIF_WRITE(0x555,0xAA);platform_delay_us(10);EMIF_WRITE(0x2AA,0x55);platform_delay_us(10);EMIF_WRITE(0x555,0x80);platform_delay_us(10);EMIF_WRITE(0x555,0xAA);platform_delay_us(10);EMIF_WRITE(0x2AA,0x55);platform_delay_us(10);EMIF_WRITE(0x555,0x10);platform_delay_us(10);while((EMIF_READ(0x0) != 0xFFFF)&&(EMIF_READ(0x1000) != 0xFFFF));
}
2.写入操作(因为我在使用的时候是对FLASH空间进行验证,所以采取了整片FLASH写入操作)
1.地址0x555写入0xAA
2.地址0x2AA写入0x55
3.地址0x555写入0xA0
4.地址是需要写入的地址 写入待写入的数据
5.最后的检测应该是判断写入状态,我也没有去判断DQ引脚,直接读出写入数据是否完成,也没有加超时检测。
//整片写入
void Nor_Flash_Write()
{int i = 0;for(i=0;i<0xFFFFFF;i++){EMIF_WRITE(0x555,0xAA);platform_delay_us(10);EMIF_WRITE(0x2AA,0x55);platform_delay_us(10);EMIF_WRITE(0x555,0xA0);platform_delay_us(10);EMIF_WRITE(i,0x1234);while( EMIF_READ(i) != 0x1234);}
}
3.读出操作(因为我在使用的时候是对FLASH空间进行验证,所以采取了整片FLASH读出操作并校验,校验在实际使用可以删除)
1.读出操作的时候,直接读出地址就好了
//整篇读出
void Nor_Flash_Read()
{int i = 0;int data =0;for(i=0;i<0x1000000;i++){data = EMIF_READ(i);if(data != 0x1234){printf("Error Found! %drn",i);}}}
本文发布于:2024-01-30 15:55:37,感谢您对本站的认可!
本文链接:https://www.4u4v.net/it/170660134021150.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |