Emosyn TT120芯片迁移

author: scruffybear

release time: 19/06/2007

如有转载,请注明出处,并保持文章的完整性,谢谢! 

    前两个月做了Emosyn TP系列芯片COS迁移到TT120芯片的工作,感觉同为Emosyn的这两款芯片还是有较大区别的,抛开各种细节不说,单就芯片类型来说,TP系列芯片是EEPROM芯片,而Emosyn TT120芯片是一款Flash芯片,下面就TT120芯片的一些主要特性进行说明。

寻址方式
    我们将整个芯片的地址空间称之为NVM,用户可配置空间称之为UCM,就TP100-2为例,它有98K的NVM空间,其中66K的UCM和32K的EEPROM。而TT120有120K的NVM,同样也是120K的UCM。可支配空间清楚了,剩下就是如何对芯片空间进行访问读写了。
    TP系列和TT120都是8051核心,TP系列芯片的内存控制是通过MMU装置进行空间分配,通过“Code Banking”机制,在Bank0,Bank1,Bank2,Bank3之间进行切换,达到访问超过64K空间的目的,也就是说所有的地址空间都可以通过两字节的DPTR进行访问。
    而TT120芯片没有MMU装置,但是它支持24位的寻址模式,也就是“24-Bit Contiguous Addressing Mode”,抱歉不知道“Contiguous”怎么翻译。使用24位的寻址模式,也就是可以寻址16M空间大小,而TT120仅有120K的Flash空间大小,所以不使用MMU装置就可以访问所有空间,并且还真有点“大材小用”,在以后的更大容量的智能卡中还有更大的发挥空间。
    24位寻址模式也叫扩展寻址模式,在汇编语言中的16位寻址模式中,DPTR是由DPH,DPL两个寄存器组成的,如果是24位的扩展寻址模式,DPTR是由DPX,DPH,DPL三个寄存器组成的,三个寄存器可以作为一个24位的整体进行运算。
    如果需要使用24位的寻址模式,需要在KEIL编译环境中进行一下相关的设置以支持扩展寻址模式,在“Project”-“Options for Target ‘TT120’”-“Device”菜单下,如图1中的红圈中所示,需要用LX51连接器替换BL51连接器,需要用AX51汇编器替代A51汇编器。

                                                          图1
    在“Project”-“Options for Target ‘TT120’”-“Target”菜单下,需要选中“Contiguous Mode:512KB program”,因为我们的程序大小远小于512K,所以不选择16M模式。另外还要选择“’far’ memory type support”,如图2所示。

                                                          图2
    在C51中,与24位寻址模式相对应的是far远程类型指针,通过far类型指针的定义,可以访问16M的地址空间。实际上我们的COS在8051核的情况下只考虑了16位的地址模式,对于超过64K的地址空间,采用的是扩展区块寻址方式进行操作,也就是“块号+偏移量”的方式。
    现在的问题是:如何由TP系列的16位寻址模式迁移到TT120的24位寻址模式,用另外一种说法是原来访问基本区使用两字节就可以,现在访问基本区需要使用三字节(因为基本区前面放代码)。我们是不是应该在C51中使用far类型指针呢。答案是否定的。因为在芯片的迁移过程中,应该尽可能地减少对原有系统的修改,也就是说还是应该在C51中使用16位的寻址模式,超过64K的地址空间,使用扩展区操作解决(也是16位地址)。
    现在要达到使用16位的地址对24位的地址空间进行寻址,可以采用基地址的方法进行解决。在对flash的120K地址进行寻址时,通过加上基地址的方法将上层用到两字节DPTR和DPTRW转换为底层读写用的三字节DPTR和DPTRW。具体到程序中,对于基本区,所有的地址都要加上EEPBASE,用完之后都要减去EEPBASE。对于扩展区,所有的地址都要加上EXTBASE,用完之后都要减去EXTBASE。对于SRAM,所有的地址都要加上XRAMBASE,用完之后都要减去XRAMBASE。
    虽然说这样实现起来很麻烦,但是为了做到与原来的COS相兼容并改动最小,只有采用这个方法了。
页擦除方式
    芯片是存储信息的方式归根到底都是由二进制的1和0组成的。对芯片进行读操作是没有问题的,很容易理解,但是在对芯片进行写的时候麻烦就来了。芯片存储的二进制只能由1写成0,不能由0写成1,要将0写成1,只能通过擦除操作。所以我们要对芯片写一个字节时,必须先要将这个字节擦掉(如果有必要的话,也就是0要写成1),再进行写操作。
    但是芯片的擦写粒度是有区别的,以TP系列EEPROM芯片为例,每次最小可以擦除8字节,对于TT120 Flash芯片,每次最小只能擦除256字节。
    对于TP系列,要写入8字节中的某一个字节,必须将8字节全部擦除(如果必要擦),殃及了邻近的字节也被擦掉,再进行写。所以这里引入了备份的概念,先将8字节进行备份,对备份区进行操作,擦除8字节,再将备份区写回。这样就达到了写一字节的目的。写一串数据也是同样的道理。
    对于TT120的写操作,也是一样的道理,只是备份的大小变了而已,每次备份 256字节,每次擦256字节。这一点与三星的C9DD类似,但C9DD不是8051核心。

批量脚本调试环境
    Emosyn的TP系列和TT120都没有硬件仿真,只能通过纯软件进行仿真。这给编程者的调试带来了极大的痛苦,因为在KEIL集成的串口输入的窗口中,不能粘贴,不能复制,不能回退,而且每次只能输入一个字符,如果输入错一个数据,全部重新输入。而且软件仿真也没有硬件仿真可靠稳定。而调试时又免不了有大数据量的输入,所以在这种情况下调试起来基本上类似于慢性自杀。
    在TT120项目中,进行了批量处理脚本的调试环境配置,模拟了批量数据的串口输入。

                                                           图3
    Keil UV3集成了批量处理脚本的工具,但是需要进行后期再开发配置,以下进行说明。
    按图3进行相应的选择,需要对APDU_Test.ini文件进行相应编程。
    定义信号量函数,SIGNAL void ApduTest(void)和SIGNAL void ApduTest_reset(void),在这两个函数进行循环,分别对APDU_Command_Buffer[]和APDU_Command_Buffer1[]数组里的内容进行处理,达到大批量处理串口输入的目的。
    最后定义两个按钮:
        define button "ApduTest", "ApduTest()"    
        define button "ApduTest_after_reset", "ApduTest_reset()" 
  
    可以通过这两个按钮启动信号量函数,达到对串口的仿真大批量输入。

    而APDU_Command_Buffer[]和APDU_Command_Buffer1[]数组定义在APDU_Test.h文件中,APDU_Test.h文件由Timecosc.c文件中被引入。APDU_Test.h的格式如下:
code APDU_Command_Buffer []=
{
 0xA0, 0x20, 0x00, 0x0B, 0x08, 01, 
  0x36, 0x34, 0x37, 0x32, 0x32, 0x32, 0x38, 0x38, 02,   //A020000B083634373232323838SW9000
};
code APDU_Command_Buffer1 []=
{
   0xA0, 0x10, 0x00, 0x00, 0x14, 01,
}

进行仿真如下所示(图4和图5):


                                           图4

                                           图5
几个重要的缩写:

    MMU  Memory Management Unit
    NVM  Non-Volantile Memory
    UCM  User Configurable Memory 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值