热度 18
2012-10-12 11:07
1005 次阅读|
0 个评论
iMCU W7100A 是一款单片式以太网控制芯片,内嵌8051单片机、硬件 TCP/IP协议栈,以及10/100 高速以太网络MAC/PHY。 W7100A的内部存储器由两部分组成:程序存储器和数据存储器。 程序存储器又由启动ROM和代码闪存组成。启动ROM的地址范围从0×0000到0x07FF,启动ROM中含有ISP函数以及W7100A内嵌的其它必需的代码程序。代码闪存的地址范围从0×0000到0xFFFF,它位于另外一个不同的存储器空间内并且和启动ROM共享部分地址范围以节省用户的应用代码。更多关于W7100A存储器组成的详细信息请参考中文主页中的 ‘W7100数据手册’。 图1.1 代码闪存更新过程 如图1.1在用户应用代码执行过程中允许修改或者更新64kbyte的程序闪存,这样用户可以在程序运行时更新固件。本篇文档将会介绍如何读取、写入以及擦除代码闪存。 下面是用来控制代码闪存的函数,将会在下面部分详细介绍。 表1.1 代码闪存存取函数 注意: 请注意用来写入和擦除W7100A存储器数据的WizISP程序中的ISP与本文档中用到的ISP不同。 1. 代码闪存编程 1.1 编程过程 代码闪存的编程流程如下: 如果用户按照下面的步骤进行,那么在用户代码执行过程中可以执行字节读(Byte read)、字节写(Byte write)或者其它ISPID命令对代码闪存中的数据进行修改。 图2.1 代码闪存存取过程 1. 当使用ISP函数时,不能有中断发生。通过设置EA=0禁止所有的中断。 2. 为了能够激活启动ROM和ISP ENTRY,将WCONF寄存器的ISPEN设置为‘0’。 3. 根据定义的ISPID写入相应的ISPADDR和ISPDATA。例如,如果用户希望将0xFF写入存储器地址0×4000中,参照下面方框中的格式。 ISPID = ISP_BPROG; ISPADDR = 0×4000; ISPDATA = 0xFF 下一步是调用ISP代码。为了能够调用ISP代码,用户需要跳转到ISP代码定义的地方。ISP代码被定义为0×0003,但是可以根据编译器来定义不同的值。本文档中的代码基于Keil 4.10编译器。 4. 将WCONF寄存器的ISPEN设置为‘1’,启动ROM和ISP ENTRY将处于未激活状态。 代码闪存存取的示例函数见1.2~1.5章节 1.2 读(Read) 在ISPID命令中,代码闪存读被定义为ISP_READ(0×00)。读命令读取指定地址的1byte数据,并且将数据保存到ISPDATA。读命令函数如下所示。 1.3 写(Write) 在ISPID命令中,代码闪存写被定义为ISP_BPROG(0×40)。写命令向指定的地址中写入1 byte数据。写命令函数如下所示: 1.4 扇区擦除(Sector Erase) 代码闪存扇区擦除在ISPID命令中被定义为ISP_SERASE(0×30)。‘扇区擦除’命令擦除从指定存储器地址开始的256 byte大小的block。与读和写命令相比较,擦除命令有一些不同。这里有两个步骤:第一步预写,设置闪存中的每一个单元都为相同的电气充电电平;第二步指定地址,并且擦除从指定点开始的256 byte大小的block。用户需要注意在这两步中都要调用ISP entry函数。 1.5 芯片擦除(Chip Erase) 在ISPID命令中代码闪存芯片擦除被定义为ISP_MERASE(0×10)。一旦执行芯片擦除,就会擦除代码闪存中的全部数据。芯片擦除的步骤和扇区擦除完全相同。ISP_ERASE命令和ISPID类似用作预写。这两个命令都需要调用ISP Entry函数,没有输入值和返回值。 警告: 请注意在用户代码执行过程中如果使用芯片擦除命令,所有的操作数据都会被擦除。 2. 示例演示 这一章将会介绍读、写和擦除函数的示例代码。函数的执行可以按照下面的顺序来验证和执行,如下图3.1所示。 图3.1 示例演示样本流程 1. 擦除– 擦除从基地址开始的256字节。 2. 写 – 从基地址开始的256字节写0 ~ FF。 3. 验证 – 执行读来读取写入的值并且和实际使用的值比较 注意: 在这片文档中的程序代码都是假的代码,只是整个代码的一部分。示例代码都是基于KEIL µvision V4.10版编译器。 示例程序命令的结果入下面所示。 图3.2 应用示例结果 去WIZnet官方博客查看本文: blog.iwiznet.cn ☞ 想了解更多,请登录我们的网站: http://www.iwiznet.cn/