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
我用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
相关文章推荐
- NIOS II 软核中EPCS配置芯片的存储操作
- 【转】NIOS II 软核中EPCS配置芯片的存储操作
- NIOS II 软核中EPCS配置芯片的存储操作
- NiosII+EPCS配置芯片下载步骤
- FPGA配置芯片EPCS读写操作--STM32读写
- FPGA配置文件和NIOS代码程序写入EPCS
- 利用JTAG配置EPCS芯片的方法
- Quartz任务调度(3)存储与持久化操作配置详细解析
- FPGA配置文件和NIOS代码程序写入EPCS
- 在审批时通过存储过程动态干预操作结果的配置
- Quartz任务调度存储与持久化操作配置详细解析
- WinForm中使用XML文件存储用户配置及操作本地Config配置文件
- IIC接口AT24C02存储芯片的操作
- SecureCrt配置之自动存储操作日志
- WinForm中使用XML文件存储用户配置及操作本地Config配置文件(zt)
- iscsi网络存储介绍及客户端配置操作
- Quartz任务调度存储与持久化操作配置详细解析(1)
- 使用JTAG方式配置EPCS芯片时显示容量不够的解决方法
- 无废话Android之android下junit测试框架配置、保存文件到手机内存、android下文件访问的权限、保存文件到SD卡、获取SD卡大小、使用SharedPreferences进行数据存储、使用Pull解析器操作XML文件、android下操作sqlite数据库和事务(2)
- 黑马程序员——Properties读取load(),操作,存储store()配置文件简介