您的位置:首页 > 移动开发 > IOS开发

NIOS 2 软核中EPCS配置芯片的存储操作

2016-11-05 07:01 288 查看

我用fpga altera , 用的存储芯片是EPCS16,具体型号是M25P16, 其存储了系统的配置以及我的 nios2 软件。

我在研究如何读取 M25P16 的 ID, 所以需要如何操作芯片, 我用的Altera 15 下的Qsys ,芯片已经添加到系统了。

 如何对其进行spi 操作呢? 在网上闻询,查找了资料,顺带学习了其 读写,erase 操作,

先简要描述如下:

需要的几个关键文件: alt_type.h  alt_flash.h, alt_flash_dev 都是产生在hello_bsp 的 drivers\inc 下,

 drivers\src 下的 altera_avalon_epcs_flash_controller.c, epcs_commands.c, altera_avalon_spi.c 是值得研究的源代码。

主要的步骤是:

1: alt_flash_open_dev("/dev/epcs");//打开FLASH器件,获取句柄

  这个 /dev/epcs 的根据是用户在配置NIOS核时自命名的,可以在system.h中查到,即“EPCS_CONTROLLER_NAME”。

2:alt_epcs_flash_get_info (my_epcs, my_epcs->region_info,my_epcs->number_of_regions);//获取配置芯片信息

3: alt_epcs_flash_erase_block(my_epcs,my_epcs->region_info->offset+0x70000);//擦除第8块

  一块的大小是0x10000,

3a: 显示epcs 块的信息内容:

4: alt_epcs_flash_read(my_epcs, my_epcs->region_info->offset+0x70000, epcsbuf, 40); //读40字节

 显示 可以看到其结果都是0xff

5: alt_epcs_flash_write(my_epcs, my_epcs->region_info->offset+0x70000, epcsbuf, 32); //写32字节

 写的内容是 i+0x22

6: alt_epcs_flash_read(my_epcs, my_epcs->region_info->offset+0x70000, epcsbuf, 40); //读40字节 

  验证我们写入的内容正确。

程序如下:

main 函数里调用epcs(), main没有显示,我的项目程序里还有其他东西,我这里只是突出epcs 的操作。

结果显示不知怎么不能复制粘贴, 只有用贴图的方式了。

#include "system.h"

#include <stdio.h>

#include "alt_types.h"

#include "sys/alt_flash.h"

#include "sys/alt_flash_dev.h"

unsigned char  epcsbuf[32];

int ret_code;

alt_flash_fd*  my_epcs;//定义句柄

void epcs()

{

int i;

my_epcs = alt_flash_open_dev("/dev/epcs");//打开FLASH器件,获取句柄

ret_code = alt_epcs_flash_get_info (my_epcs, my_epcs->region_info,my_epcs->number_of_regions);//获取配置芯片信息

printf("ret_code=%d",ret_code);

if(my_epcs) //信息获取成功

 {

 //example application, read general data from epcs address 0x70000

 ret_code = alt_epcs_flash_erase_block(my_epcs,my_epcs->region_info->offset+0x70000);//擦除第8块

 ret_code = alt_epcs_flash_read(my_epcs, my_epcs->region_info->offset+0x70000, epcsbuf, 40); //读32字节

 printf("offset=%d\n",my_epcs->region_info[0].offset);

 printf("size=%d\n",my_epcs->region_info[0].region_size);

 printf("numberOfBlock=%d\n",my_epcs->region_info[0].number_of_blocks);

 printf("blockSize=%d\n",my_epcs->region_info[0].block_size);

 printf("after erase:\n");

 for(i=0;i<40;i++)

 {

  printf("%x ",epcsbuf[i]);

 }

 printf("\nafter write:\n");

 for(i=0;i<32;i++)

  epcsbuf[i]=i+0x22;

 ret_code = alt_epcs_flash_write(my_epcs, my_epcs->region_info->offset+0x70000, epcsbuf, 32); //写32字节

 ret_code = alt_epcs_flash_read(my_epcs, my_epcs->region_info->offset+0x70000, epcsbuf, 40); //读32字节

 for(i=0;i<40;i++)

 {

  printf("%x ",epcsbuf[i]);

 }

 printf("\n");

 }

}



参考文章有:

http://m.blog.csdn.net/article/details?id=5701024

https://www.altera.com/content/dam/altera-www/global/en_US/pdfs/literature/ug/ug_embedded_ip.pdf
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: