第3节 EEPROM的仿真演示
推荐给好友
打印
加入收藏
更新于2009-01-11 23:32:40

        理解了flash编程和擦除命令是如何工作的,然后就可以将这些概念应用到EEPROM的仿真中。本实 例使用了DEMO9S08LC60开发板和Softec的SCI及LCD显示软件。该EEPROM仿真软件提供了两个可选菜单:密码的存储和验证。你可以设置一个新密码,而且通过DEMO9S08LC60开发板上的按钮PTC7和PTC5还可以验证存放在仿真EEPROM内的当前密码。
        该演示软件用到的显示屏是整个软件的用户接口。首先,程序通过显示屏来显示那些选项,然后等待输入:
        void menu(){
                // Prints a welcome string
                SlideString("PTC7 - New psswd",250);
                Delay(3000);
                SlideString("PTC5 - Verify psswd",250);
                Delay(3000);
                SlideString("Make your choice", 250);
        }
        当你按下PTC7或PTC5时,中断产生并检查哪一个按钮被按过。任一种功能都需要输入8位字母数字密码,敲回车。必须使用这种格式;否则软件不识别输入的数据。

图5 DEMO9S08LC60开发板

3.1 显示
        由于DEMO9S08LC60支持板上使用的这种显示屏,所以它提供了显示屏的驱动和所有的源代码。
        本应用笔记主要用了9位字母数字显示。这些字符可以显示从SCI读取的数据和系统消息“MEMORY FULL”。

3.2 SCI接口
        这种微控制器硬件上有一个SCI接口,只要简单地配置一下8个8位的寄存器就可以使用该接口,这些寄存器是用于控制波特率,选择SCI选项,报告SCI状态以及收/发数据。 软件对SCI接口的配置如下:
  • ● 波特率——9600
  • ● 数据位——8
  • ● 奇偶校验——无
  • ● 停止位——1
        Softec已经实现了对SCI的接口软件。所有来自该接口的数据都是通过函数SCIGetBuffer()来接收的,等待SCI输入然后存放到一个缓冲区中。(注解:将外设连到MCU时,根据接口来设置正确的电压是很重要的)

3.3 数据存储
        0x1870~0x286F的地址区域被分成8个512字节的块(可擦除的最小块),用来存放数据。根据从SCI收到的字符数又将每块分成8字节的小块。
        使用的机制如下:
        假设微控制器第一次上电时,EEPROM的受保护区域是空的,接收到的第一个8字节数据被存放到EEPROM的第一个8字节的地址内(0x1870~0x1877)。
        为了存放从SCI接收到的下一个8字节数据,软件需要找到EEPROM内的下一个开放的地址(包括0xFF),并将该位置作为接下来的8字节数据存放的第一个地址。
        若EEPROM已存放满了,地址就到了0x286F。然后程序就擦除该块并又从0x1870开始写入。
        按SW305可随时清空存储区。8页全被清空。
        执行EEPROM.c中的void NVM_Write_Byte (unsigned char *dest, char data)就可以存储数据,该函数是按图3建议的编程流程来实现的。
        下面代码用于检查和验证被写入的地址:
                NVMStartAddress = &EEPAdrs; // pointer to start address
                do
                {
                        *NVMStartAddress++;
                        data = *NVMStartAddress;
                }
                while(data != 0xFF); //looks for empty space in EEPROM
                //Checks if reached end of EEProm
                if (NVMStartAddress == &EEPAdrsEnd+1)
                {
                        DisableInterrupts;
                        // Erases EEPROM sector : Memory Full NVM_Erase_Page(&(*NVMStartAddress));
                       //EEPROM.c erasing routine EnableInterrupts;
                        // reset pointer to EEPROM sector NVMStartAddress = &EEPAdrs;
                }
                if (FSTAT_FCBEF == 1) //Check if the command buffer is empty
                {
                        DisableInterrupts;
                       //EEPROM.c writing routine NVM_Write_Byte (&(*NVMStartAddress), *p);
                       *NVMStartAddress++; EnableInterrupts;
                }

3.4 数据验证
        如果按下PTC5按钮,主程序等待输入密码,键入8位字母数字字符后回车。然后读程序开始恢复上次存放的密码。如果与输入的密码匹配,LCD显示屏就会显示操作成功信息。
                NVMStartAddress = &EEPAdrs;
                do
                {
                        *NVMStartAddress++;
                        data = *NVMStartAddress;
                }
                while(data != 0xFF); //looks for empty space in EEPROM
                NVMReadAddress = NVMStartAddress - 8; //sets address for last valid passwd typed
                if (NVMReadAddress <= &EEPAdrs)
                {
                        NVMReadAddress = &EEPAdrs + 1;
                }
                t = &messageTX;
                for(i = 0; i != NVMRowSize; i++)
                {
                       NVM_Read_Byte(&(*NVMReadAddress), t);
                       // stores in messageTX the read data t++;
                       NVMReadAddress++;
                       if ( messageTX[i]== 0xFF )
                       {
                               messageTX[i] = 0;
                       }
                }


相关链接


 
关于我们 | 诚邀加盟 | 客户服务 | 相关法律 | 网站地图 | 友情链接 | 服务信箱:service@eefocus.com
© 2006 与非门科技信息咨询(北京)有限公司 All Rights Reserved.