首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

关于NE64的flash程序自我擦除

关于NE64的flash程序自我擦除

介绍一下我进行的设计:移植了网络上公开的OpenTCP/IP和Webserver到自己的项目中(可在freescale站上找到链接,在sourceforge中的开源项目),但是需要增加功能,让免费的TCP/IP协议栈支持自我进行IP地址的修改,方便现场调试和批量生产时的地址设定。

我采用的办法是向协议栈主程序(大循环程序)发送UDP包,程序受到特定格式的UDP包后按照包内自定义的码字进行flash《擦除+编程》,修改IP地址。

尝试了很多次,主程序编译后实际烧录后在3C页面执行,在RAM中放了一段擦除程序,从3C页面强制跳转到RAM中(地址大约在0x3200)的擦除程序后试图擦除非页面化区0x4000位置开始的第一个sector,里面包含了IP地址的所有信息,一直没有成功。

单步进RAM中程序去错误是在擦除那段代码上,在擦除前先要对目标扇区的某个地址赋值,赋一个任意的dummy数值,单步发现在这个赋值操作后FSTAT的ACCERR发生置位提示发生错误,后面程序段自然没有继续正常执行下去的可能了。很奇怪!

主要代码如下:

1.定义字串RAM_Func:

-------------------------------------------

static unsigned char Ram_Fcnt[36]={0xC6,0x40,0x7b,0x01,0x06,0x58,0x7b,0x01,
0x05,0x86,0xff,0x7a,0x40,0x00,0x1e,0x01,
0x05,0x20,0x0a,0x1e,0x01,0x05,
0x10,0x05,0x1f,0x01,0x05,0x40,0xfb,0x0a };

(说明一下,以上对应实际源代码

static void OP_in_RAM()
{
*(volatile byte *far) (0x4000) = 0x00; // Write data to the flash memory
FCMD = 0x40; // Initiate command
FSTAT = 0x80; // Launch the command
if(FSTAT_PVIOL ) return;
if(FSTAT_ACCERR ) return;
while(FSTAT_CCIF ==0 ) ; //idle loop waiting earasure op. completed
return;
}
抓flash内容得到上述Ram_Fcnt字串。

主程序中如下设计:

--------------------------------------

FCLKDIV = 0xCF; //我用的外部晶振25MHz
FPROT = 0;//或者写0b10110100;
//Enter critical region
FSTAT = 0x30; /* Clear PVIOL & ACERR flag */
__asm SEI;
__asm pshc;
__asm movb 1,SP+,CCR_reg;
asm { /* Jump to RAM code */
JSR Ram_Fcnt //单步进去,发现第1~2个汇编指令开始执行就错,经查,对应的实际代码是用dummy数值对擦除目标区赋值。此后RAM子程序返回,进入莫名奇妙的代码执行后死机。跳转后PPAGE内容一直好像不正常,甚至是一些不可能的值。
}
__asm movb CCR_reg, 1,-SP;
__asm pulc;
__asm CLI;





以往和陈刚还有安富利的梅生联系过,一直侧重在提示是否是中断未被关闭,本人对此觉得可能不大。是否有其他问题在里面呢?

请TX们指教。

[此贴子已经被作者于2008-9-29 22:54:42编辑过]

有没有核对过,RAM区的代码,以及跳入RAM执行程序的地址是否都正确?
海纳百川  有容乃大

汗,陈同志还是没有把问题说到点子上。

今天问题已经解决,HCS12烂熟了,精力消耗巨大。以后有做NE64的嵌入式TCP/IP的TX可以联系我,不过要收费的。

MSN: algol@e165.com

QQ:896934649

email: algol.cn@gmail.com

返回列表