在做flash的读写试验时,程序在IDE里面build没有问题,然后run as hardware就出现这种flash无法打开的问题,
不知是什么原因?请高手解释下,先谢了
ps程序报错信息:open flash device...
open flash device failed!!!
多来点信息,你的flash打开错误,多半和sopc的配置有关,当然也有可能和你的cfi table就是targetboard有关。
你把信息说详细些好吗?
[此贴子已经被作者于2007-8-7 9:48:39编辑过]
硬件里flash的基地址已设为0 了,软件应该没问题,加了一行测试代码,
得知每次打开flash
alt_flash_fd* flash_handle;
flash_handle = alt_flash_open_dev(CFI_FLASH_NAME);
flash_handle 的返回值都是0,这是为什么?
说说你的配置方法和你的步骤。
你可以将reset和exception都选为flash。在nios中debug,看看能不能在flash中直接调试程序。
如果不能,说明系统没有认到或flash读写有问题。
首先说明板子没问题,因为别人的实验在上面做的没问题。
SOPC里面CFI的设置为就只有presets custom
address width: 22bits data width: 8bits
borad info: none
timing里面是默认的值,没有改
难道是borad或是timing的问题?
此实验还没下到flash里,还只是调试,软件是run as hardware就出问题的。
”软件是run as hardware就出问题的。“
将将reset和exception都选为flash就是在flash中跑程序。这是nios ide会先将程序下到flash中,然后再在里面跑。
如果你的sopc设置没有问题,只能说明flash有硬件问题。(既然能跑程序,硬件电路链接就没有问题)
你把系统的错误提示完整的贴出来看看,好吗?
对不起版主,前面说法有点错误,就是系统没有提示错误,程序运行正常,因为这个程序是一个在网上找的测试flash读写的程序,读写失败就打印上述消息,open flash device falied
其次就是这个板子别人用同样的程序运行,实验成功了,但在在我这就是打开失败。
还有一个问题就是,在quartus里面,cfi多了一个引脚,就是flash select,
由于我只有一个flash设备,所以这个引脚我就给悬空了。(心里有点悬,不知是不是这里有问题)
版主你说可以把reset和exception都选为flash来测试flash的好坏,我想这应该不行吧,应该在system library properties里改program memery (sram),read_only data memory(sram)等吧,所以我把这些sram全改成flash,在IDE里看发现程序刷进去了,但是在板子上程序要跑不起来,我就纳闷,这又是什么原因呢?[板子和 flash在别人那有试了一下,没问题,读写数据都没问题]
ps:我的程序
#include <stdio.h>
#include <sys/alt_flash.h>
#include "system.h"
#include <unistd.h>
#define DATA_OFFSET 0x300000
int main(void)
{
alt_flash_fd* flash_handle;
FILE *uart;
char write_data = 0;
char read_data = 0;
write_data = 100;
uart = fopen(UART_NAME,"w");
flash_handle = alt_flash_open_dev(CFI_FLASH_NAME);
fprintf(uart, "open flash device...\n");
usleep(10000);
if (flash_handle)
{
fprintf(uart, "open flash device successed!!!\n");
usleep(10000);
alt_write_flash(flash_handle, DATA_OFFSET, &write_data, 1);
fprintf(uart, "wirte_data = %d\n", write_data);
usleep(10000);
alt_read_flash(flash_handle, DATA_OFFSET, &read_data, 1);
fprintf(uart, "read_data = %d\n", read_data);
usleep(10000);
if(read_data == write_data)
{
fprintf(uart, "flash write and read successed!!!\n");
usleep(10000);
}
else
{
fprintf(uart, "flash write or read failed!!!\n");
usleep(10000);
}
alt_flash_close_dev(flash_handle);
fprintf(uart, "close flash device...\n");
usleep(10000);
}
else
{
fprintf(uart, "open flash device failed!!!\n");
usleep(10000);
}
}
问题还没解决,亟待高手帮助啊!
[此贴子已经被作者于2007-8-8 20:18:58编辑过]
还有一个问题就是,在quartus里面,cfi多了一个引脚,就是flash select,
由于我只有一个flash设备,所以这个引脚我就给悬空了。(心里有点悬,不知是不是这里有问题)
”
这个引脚是flash的片选信号,怎么能悬空呢。
这是非常重要的信号线!!!
接在flash ce上!
[此贴子已经被作者于2007-8-9 14:03:21编辑过]
我的板子由于它只有一个flash,所以板子上flash的FLASH_CE,已经接到开发板上固定电源上了,
使它长期有效使能,根本就没有就到FPGA的引脚上。
所以我在Quartus里分配引脚时,就多出一个引脚,就悬空了。
不知这样有没有问题。
“
我的板子由于它只有一个flash,所以板子上flash的FLASH_CE,已经接到开发板上固定电源上了,
使它长期有效使能,根本就没有就到FPGA的引脚上。
”又错了,片选信号多半是低电平有效!你这样不是永远无效了吗?
“版主你说可以把reset和exception都选为flash来测试flash的好坏,我想这应该不行吧,应该在system library properties里改program memery (sram),read_only data memory(sram)等吧,所以我把这些sram全改成flash,”
reset和exception都选为flash就是将text和ro等都为flash了。
SOPC中的reset address 指定的是最终全部软件程序代码下载到的地方,并且程序从reset address 启动。
SOPC中的exception address 指定的是系统异常处理代码存放的地方。如果exception address 和reset address 不一样,那么程序从
reset address 启动后将把放在reset address 处的系统异常处理代码拷贝到exception address 。
NIOS II软件中的text address指定的是程序运行的地方。如果text address和reset address 不一样,那么程序从reset address 启动
后将把放在reset address 处的普通只读程序代码拷贝到text address 。NIOS II软件中的rodata address指定的是只读数据的存放地方。
如果rodata address和reset address 不一样,那么程序从reset address 启动后将把放在reset address 处的只读数据拷贝到
rodata address 。
NIOS II软件中的rwdata address指定的是可读写数据的存放地方。如果rwdata address和reset address 不一样,那么程序从reset address
启动后将初始化rwdata address 处的可读写数据。
你说的这些我没有异议,但我认为我是在调试模式,也就是在IDE的Run as hardware的模式下运行的,所以,此时程序的代码还没有刷进sopc里的reset指定的存储器,仅仅是刷在program memery指定的存储器里,因为此时你一reset程序就没了,又要你得重新刷进去。
如果照版主你说的意思,那么就是在调试模式下,程序也刷进SOPC指定的存储器(如flash),然后再从SOPC reset指定的存储器下载到program memery指定的存储器中。那么我先前SOPC是指定在EPCS flash里的,那么在run as hardware之后,再reset我的cpu(开发板一直没有掉电,reset是由quartus里设置的一个按键),程序的代码应该还在flash里啊,但实际上此时epcs里已经没有程序了。所以我认为在RUN as hardware这种模式下,代码仅仅刷进program memery 指定的存储器里的。不知我的是否正确?
”又错了,片选信号多半是低电平有效!你这样不是永远无效了吗?”这个问题我在查用户手册和芯片资料时也很纳闷了,上面写的就是接高电平,但是我不敢肯定板子上也是这么接的,或许仅仅是用户手册上印错了,因为我的一个同学也是用这个板子做实验,他测试的结果是正确的(但是他的结果又是不稳定的,就是说相同的程序,相同的板子,在不同的时刻,有时他的结果也和我一样,只不过我是一次成功都没有)。
不过我现在正在和开发商联系,期待他的结果吧。如果排出板子有问题的情况,不知出现上面的问题是何原因?
[em11]
[此贴子已经被作者于2007-8-10 8:48:19编辑过]
"但我认为我是在调试模式,也就是在IDE的Run as hardware的模式下运行的,所以,此时程序的代码还没有刷进sopc里的reset指定的存储器"
事实上你在调试模式,也就是在IDE的Run as hardware的模式下运行的时候,在系统的console中,就是下面,可以看到:download和verify的字样。分别是下载和验证。但是这种下载程序是直接在flash中指定位置跑。不能上电自动运行,我们通常用这种方法来判断flash或其他如sdram是否是好的。
上电自动运行需要flash program或在shell中输入flash下载命令下载才能构成系统并自动运行。[此贴子已经被作者于2007-8-10 9:36:12编辑过]
"在系统的console中,就是下面,可以看到:download和verify的字样。"
这个没问题,我的reset地址设为EPCS,每次仿真都可以看到这些字样。
“分别是下载和验证。但是这种下载程序是直接在flash中指定位置跑。不能上电自动运行,我们通常用这种方法来判断flash或其他如sdram是否是好的。"
但是我还是不认同这个下载程序是直接在flash中跑,正如上面我所说,我在仿真的过程中,我的reset地址一直设在epcs,按楼主这么说我仿真的过程中程序都是在epcs里运行,也就是flash中。这样的话,我想运行速度会很慢,但是我最近的一个综合程序(比较大,包含flash读写,由于读写flash的子程序模块失败,我就把这个模块注释掉了,其他的不变)也是这样仿真,但是我没有感到他运行的速度慢啊,我认为是在program memery里运行的。
我认为楼主的这种方法是可以判断flash是否是好的,而且我改了reset地址为flash后,验证flash是好的。但我还是不认同程序是在sopc里reset指定的存储器里运行。
还有我上面说的掉电是指cpu掉电,但fpga开发板不掉电。
[此贴子已经被作者于2007-8-10 14:24:03编辑过]
呵呵
“我的reset地址一直设在epcs,按楼主这么说我仿真的过程中程序都是在epcs里运行,也就是flash中。这样的话,我想运行速度会很慢”速度是很慢,但是速度不是感觉出来的是测出来的。
你将reset和exception设置ram on chip中比较一下就知道了。你说program memery,我一直是说将reset和exception都选为flash就是将text和ro等都为flash了,请问你认为program memery在那里?不在flash中还叫debug as HARDWARE?
现在的flash读写为100ns级左右,sdram读写为10ns级左右。
干脆这样,你将flash一些脚接错,故意使flash读写错误,你看还能不能debug as hardware。
[此贴子已经被作者于2007-8-10 15:10:55编辑过]
谢谢版主啊,我明白了
太经典了 讨论的实在太经典了 再顶下!
欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/) | Powered by Discuz! 7.0.0 |