读写EPCS
2019-07-01 21:25阅读:
读写EPCS有三个好处:其一根据flash芯片进行程序加密,其二保存一些运行数据,掉电后依旧保存,其三:在线烧写程序。后面写一下如何在线更新烧写程序。
这里的设计思路是通过nios来完成,当然也可以通过逻辑来完成,后面有时间学习一下如何通过逻辑进行flash读写。
一、顶层代码
module top(
//always on 40MHz clock LVDS
input codec_main_clk,
output epcs_dclk,
output epcs_sce ,
output epcs_sdo ,
input epcs_data0
);
wire sys_rstn;
wire sys_clk,sys_clk_1,sys_clkx2;
wire int_40mhz,ref_pll_clk;
wire locked;
sys_pll MAIN_PLL(
.areset(1'b0), //(reset_global),
.inclk
0(codec_main_clk),
//40M
.c0(), //60M
.c1(sys_clk), //60M
.locked(locked)
);
assign sys_rstn = locked;
nios_cpu u0 (
.clk_clk
(sys_clk),
.reset_reset_n
(sys_rstn),
.epcs_flash_external_dclk
(epcs_dclk),
.epcs_flash_external_sce
(epcs_sce),
.epcs_flash_external_sdo
(epcs_sdo),
.epcs_flash_external_data0
(epcs_data0)
);
二、qsys配置
时钟设置
cpu设置
添加jtag,默认配置
添加ID
添加epcs
添加onchipmem,内存设置为409600
连续如下所示,中断如下所示:
将EPCSE设置为export,自动分配地址,自动分配中断,点击generate,完成。
在quartus中将EPCSE接口的4根线设置为普通IO,具体如下图配置:
生成bit,然后启动eclipse,新建software文件夹。
三、软件编写
新建工程,设置为hello world。
Main函数编程如下所示:
#include
#include
'sys/alt_flash.h'
#include
'sys/alt_flash_dev.h'
#include
'system.h'
int
main(void)
{
printf('Hello
from Nios
II!');
alt_flash_fd*
my_epcs;
int
i=0;
alt_u8
epcsbuff[32],epcsbuff2[32];
for(i=0;i<32;i++)
{
epcsbuff[i]=i;
epcsbuff2[i]=0;
}
my_epcs=alt_flash_open_dev(EPCS_FLASH_NAME);
if(my_epcs)
{
//
alt_epcs_flash_erase_block(my_epcs,0x8f0000);
//
alt_epcs_flash_write(my_epcs,0x8f0000,epcsbuff,32);
alt_epcs_flash_read(my_epcs,0x8f0000,epcsbuff2,32);
alt_flash_close_dev(my_epcs);
}
else
return
0;
}
说明首先添加三个头文件,前两个用于epcs函数使用,后一个用于EPCS_FLASH_NAME。
用到的函数alt_flash_open_dev,该函数打开EPCS设备。
alt_epcs_flash_erase_block用于擦除EPCS
alt_epcs_flash_write用于写内容,后面为地址,buff和长度。
alt_epcs_flash_read用于读内容,后面为地址,buff和长度。
alt_flash_close_dev用于关闭设备。
四、验证
首先给0x8f0000写0到31递增数据,然后可以读出来写入的值也为0到31,然后断电,设备重启,这时候不给EPCS写,只是读取,会发现内容还是0到31,表示数据读取正确没有丢失数据,EPCS操作完成。