微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 硬件电路设计 > TI模拟硬件电路设计 > flash烧写问题

flash烧写问题

时间:10-02 整理:3721RD 点击:
我的芯片是6416 1Ghz,flash是am29lv400bt,用作8位异步存储器
我将ce1空间定义为0x02a08a00,
现在的情况是,能够擦除,但是无法烧写,这是为什么呢?
我的烧写实验如下:
在烧写程序里加一个boot.asm,将其定位在0x0开头的空间,然后程序对此段进行搬移:
烧写程序如下:
void flash_write(volatile unsigned char *addr,volatile unsigned char *ptr,unsigned int length)
{
Uint32 i;
int b;
for(i = 0; i < length; i++)
{
*FLASH_AAA = 0xaa;
*FLASH_555 = 0x55;
*FLASH_AAA = 0xa0;
*ptr++=*addr++;
for(b=0;b<10000;b++)
{}
}
}编译无错误,但是就是无法烧,不知道到底哪里出问题了
addr为0x0,ptr为0x64000000

 

emif ce1空间设置了阿,0x02a08a00,还有0xffffff03我也试过。
写状态字加偏移?在哪?没有看到
emif设置如下:
static EMIFB_Config MyEmifbConfig =
{
EMIFB_GBLCTL_RMK
(
EMIFB_GBLCTL_EK2RATE_FULLCLK, //1 X EMIF input clock
EMIFB_GBLCTL_EK2HZ_CLK, //eclkout2 continue output during hold
EMIFB_GBLCTL_EK2EN_ENABLE, //eclkout2 enable output
EMIFB_GBLCTL_BRMODE_MRSTATUS, //bus request is memory access or refresh pending/in progress
EMIFB_GBLCTL_NOHOLD_ENABLE,
EMIFB_GBLCTL_EK1HZ_CLK, //eclkout1 continue output during hold
EMIFB_GBLCTL_EK1EN_ENABLE //eclkout1 enable
),
0x22a28a22,
// 0xffffff0f,
0xffffff03,
0x22a28a22,
0x22a28a22,
EMIFB_SDCTL_DEFAULT,
EMIFB_SDTIM_DEFAULT,
EMIFB_SDEXT_DEFAULT,
0x00000002,
0x00000002,
0x00000002,
0x00000002
};
 

晕,我没有左移吧
左移部分应该是0x64000000+(0x5555<<2)这个阿

想了一上午也没想明白,程序应该没有什么问题?用for循环也是没问题的,我用for循环
都是挺好用的。

楼上的能具体一点嘛?我没有偏移阿,对flash的烧写本来就是一个单位一个单位的烧,不像擦除那样是整块擦除。所以每次都要移动一位,使能够烧下一个单元。
我用memory来看0x64000000空间的,我先用flashburn for dsk6416烧一些程序进去,然后load自己的烧写程序,运行,发现可疑擦掉以前的,但是自己的烧不进去。明天就要写报告,看来又要误工了。

因为我开发自己的板子,先在dsk6416上调试flash烧写程序,理解过程阿,然后针对情况在自己的板子上烧。
另外,是555不是5555,我用的是上面那个,没有加偏移。
所以这不是重点,我就不明白到底是哪里出了问题。
即时是地址偏移,我也试过,还不是不成功。
我设置了emifb ce1的0x02a08a00,还有0xffffff03我也试过。

我将烧写段程序改为 void flash_writem( unsigned char *addr, unsigned char *ptr, unsigned short length)
{
unsigned short timeout;
unsigned char c;
unsigned int i;

while(length--)
{
/* Prep AMD
* 4MBit (512K X 8) Flash Memory
* for writing a byte.
*/
*(volatile char *)FLASH_AAA = (char)FLASH_UL1;
*(volatile char *)FLASH_555 = (char)FLASH_UL2;
*(volatile char *)FLASH_AAA = (char)FLASH_PROGRAM;

*ptr = *addr;
for(i=0;i<100;i++)
{};

/* Spin here \'til programming completes
*/
c = *addr++;
timeout = 0;
do timeout += 1;
while(*ptr != c && timeout < (unsigned short)0xffff);

ptr++;
}
又出现个问题,就是0x64000000到0x6400002f段写不进去

还有个问题,我发现许多人都对怎么将自己的程序烧进flash不清楚,谁知道的话能不能在这个帖子里也写一写,有人说先转换为hex文件,这时打开hex文件会发现很多段,有文献说按段烧写,谁能说具体一点?是定义数组的方式吗?

1。我仔细检查了,无论我将ptr设为什么值,它总是在ptr的初始值开始到0x17这段地址之间的值烧不进去,但是地址并没有偏移。
看对应的writem函数汇编那里,有一句SUB .D2 SP,0X18,SP
不知道是怎么产生的
2。那么怎么将hex文件作为目标烧写进去?还是将hex文件其整体作为一个数组在flash烧写程序中load进去?
 

不是偏移问题,没有偏移,是前面有一段程序段写不进去

我加了延时的

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top