通过c对Flash进行读写操作

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

一、Flash块结构说明

我们所用板子上flash一共划分了259个块,0-254块为128kByte,255-258块为32kByte。

各个块的地址范围如下图:

我们要读flash中某个地址的数据,只要发送相关命令即可,下面会详细说明。向flash 中写数据较复杂,首先必须将目标地址所属块解锁,然后擦除,最后才能写数据,只要解锁与擦除后就可连续往flash中写,但是不能向同一个地址写,这样会写不进去。以上的解锁与擦除是针对一个块的操作,是将地址所属块全部擦除,写程序的时候注意不要误擦其它块。写过程详细步骤见(二)。

二、通过c对Flash进行读写操作说明

通过高级语言(如c)对flash进行读写,我们开始的想法是自己做一个flash读写的IP 核,然后在c中调用此ip核来实现对flash的读写,但是这种做法比较复杂,一直进展不顺利。后来一次偶然的试验发现直接向总线写读写flash的命令即可对flash进行读写,也就是说直接将以前在verilog中读写falsh的操作过程搬到c语言中,这大大降低了c中读写flash 的难度。具体说明如下:

1.读flash

读取flash包括两个步骤:1,首先向目标地址写x00ff,告诉flash表示要读数据了。

2,通过XIo_In16函数读取目标地址的数据。下面两行代码即可读取flash中地址为dataAddr的数据,保存在value中。

XIo_Out16(FlashBaseAddr+2*dataAddr,0x00ff);

u16 value = XIo_In16(FlashBaseAddr+2*dataAddr);

其中FlashBaseAddr为flash在硬件设计中分配的基地址,并且读取的数据只能是16位的数据,这是因为flash的数据输入输出出引脚只有16位。

2.写flash

向falsh中写数据包括三个步骤:1,对目标地址所属块进行解锁操作(write

0x60,write 0xD0);2,擦除目标地址所属块(write 0x20,write 0xD0);3,读取寄存器状态((write0x70,read regstatu)),当寄存器状态值为0x80说明准备就绪,可以下一个操作;4,向目标地址写数据(write 0x0040,write data),data为你要写如flash的数据。写下一个数据之前还需要读取状态寄存器,当寄存器准备就绪说明上一次写已经完成,可以写下一个数据。下面代码即可实现向目标地址dataAddr写数据。

u8 reg_status;

//unlock

XIo_Out16(FlashBaseAddr+2*dataAddr,0x0060);

XIo_Out16(FlashBaseAddr+2*dataAddr,0x00D0);

//erase

XIo_Out16(FlashBaseAddr+2*dataAddr,0x0020);

XIo_Out16(FlashBaseAddr+2*dataAddr,0x00D0);

//read register status

while(1)

{

XIo_Out16(FlashBaseAddr,0x0070);

reg_status = XIo_In16(FlashBaseAddr);

//xil_printf("%x\r\n",reg_status);

if(reg_status == 0x0080)

break;

}

XIo_Out16(FlashBaseAddr+2* dataAddr,0x0040);

XIo_Out16(FlashBaseAddr+2* dataAddr,data);

注:向Flash写数据也只能写16位的。

相关文档
最新文档