背景技术:
在现有的工业控制和工业设备领域中,越来越多的用到了智能处理器和CPU,这样使这些设备的智能化大大提高,能处理更多了信息。同时,由于大量使用到了CPU,这些设备和软件的结合也越来越紧密,数据量的增加,使设备管理也更加复杂,而且软件本身的容量也越做越大,使用传统的串口,或者网口升级软件变得更加复杂,缓慢,而且不稳定。特别是在大规模生产中,软件下载的缓慢和不稳定大大影响生产的效率,影响了生产线产出。外部的可移动便携存储设备,为工业设备提供了一个稳定便捷的接口,可以和外部方便的进行数据交换,因此得到了广泛地应用。
便携式移动存储系统中,通用并行总线是一种比较常见的CPU控制总线,其大致上分为Intel结构和Motorola结构,以Intel结构为例,它又分为地址总线(Address)、数据总线(Data)、片选(/CS)、读(/OE)、写(/WE)信号等,如果系统支持慢速设备的话,还就会有准备信号(Ready)。Motorola总线和Intel的原理类似,只是接口信号线的定义不一样。通过简单的逻辑转换,Motorola总线也能转化成Intel总线。
在便携式移动存储系统中,CPU通用并行总线通过片选信号(/CS)选择需要操作的设备,用读信号(/OE)做读数据的操作,用写信号(/WE)做写数据的操作。CPU和外设分别在/OE和/WE的上升沿采样数据。对于慢速外设,在外设忙的时候,它会拉低Ready信号,那么CPU会在操作中插入等待周期,直到Ready信号重新跳高。
便携式移动存储设备如今广泛应用于各种消费类电子产品。存储介质主要采用的是Flash,存储设备的接口主要有CF(Compact Flash)Card,另外一种是PC Card。得到广泛应用的是CF Card,并且支持这种标准的厂家很多,主要有IBM,Hitachi,HP,Kodak等。
便携式移动存储设备可更方便于信息的导入和导出,以以太网交换机管理为例,现在的大型,高端交换设备,管理非常复杂,需要大量的配置信息,主要是一些路由表项;如果对每台交换机分别配置,需要花费大量的时间和精力,但如果将配置信息烧入CF卡中,用一张卡就可以解决所有机器的配置,方便快捷;另外,对于使用过程中交换机出现的异常信息,也可以通过CF卡将其方便地导出,便于记录。
便携式移动存储设备有着稳定可靠的数据通道,以以太网交换机升级为例;通过CF读卡器,可以将所用到的升级软件,烧入CF卡,将CF卡插在设备中就可以方便的进行升级,速度比串口加载快,比网口加载稍慢,但是由于没有物理连接,不用担心掉线,这种方式更加稳定可靠。
由于CF卡在使用上的种种优势,使之大面积的在工业设备上广泛应用。但是一般的应用方式是采用CF卡接口适配芯片,这种接口芯片同时具备接口访问控制和电源管理(支持热插拔)两种功能。但是接口芯片的造价比较高,无疑增加了设备的成本,不利于这种先进方式的大规模应用。
发明内容:
针对上述普通便携式移动存储设备所存在的问题和不足,本发明的目的是提供一种造价较低的CF卡实现热插拔的方法。
本发明是这样实现的:一种CF卡实现热插拔的方法,CF卡通过CPLD与CPU连接,即设置CPLD使CPU的地址线与CF卡的地址线及片选端连接;所述CF卡的socket槽中的CD0、CD1插针长度应该比电源插针短,两者之间的长度差应保证CF卡在拔出时,CD0和CD1已经和插槽脱离,CF还保持供电状态;
CF卡的中断通过CPLD与CPU连接,如果CPU仅支持电平信号的中断触发,则在CPLD中把CD0、CD1跳变转换成电平中断信号。
进一步地,所述CF卡使用的是True IDE Mode接口模式。
进一步地,所述CPU的地址线与CF卡的地址线及片选端连接具体为用CPU通用串行总线的五条地址线通过CPLD与CF卡的三条地址线和两个片选端连接;CPU对CF卡发出读写命令,对CF卡进行读写操作。
本发明通过造价比较低的CPLD代替接口芯片,通过将CF卡的socket槽中的CD0、CD1插针长度设计得比电源插针短,两者之间的长度差异,可保证CF卡在拔出时,CD0和CD1已经和插槽脱离,但是CF还保持供电状态;并且CPU必须支持边缘中断信号触发,如果CPU指支持电平信号的中断触发,那么就必须在CPLD中把/CD0和/CD1跳变转换成电平中断信号,CF卡就可轻松实现热插拔了;并选择CF卡的True IDE Mode接口模式,设置CPLD,使其具备接口适配芯片功能,这样,CPU就可完成对CF卡的读写功能,CF卡就实现了移动存储功能,即使用CPLD就完全代替接口芯片,轻松实现CF卡的移动存储功能。
具体实施方式:
本发明是这样实现的热插拔的:CF卡通过CPLD与CPU连接,即设置CPLD使CPU的地址线与CF卡的地址线及片选端连接;CF卡的socket槽中的CD0、CD1插针长度应该比电源插针短,两者之间的长度差应保证CF卡在拔出时,CD0和CD1已经和插槽脱离,CF还保持供电状态;
CF卡的中断通过CPLD与CPU连接,如果CPU仅支持电平信号的中断触发,则在CPLD中把CD0、CD1跳变转换成电平中断信号。
并且,选用CF的True IDE Mode接口模式,用CPU通用串行总线的五条地址线通过CPLD与CF卡的三条地址线和两个片选端连接;CPU对CF卡发出读写命令,对CF卡进行读写操作。
在这里介绍一下CF卡:CF卡支持三种接口模式,分别为PC Card MemoryMode,PC Card IO Mode,True IDE Mode,本发明选用True IDE mode,True IDEMode从硬件连接来看最简单,而且在软件上可以大量借用IDE接口的驱动程序,因此相对具有优势。
下表是CF卡设置成True IDE Mode时候的真值表:
/CS1 |
/CS0 |
A2 |
A1 |
A0 |
/IORD |
/IOWR |
BIT WITHE |
1 |
0 |
0 |
0 |
0 |
RD Data |
WR Data |
8 or 16bit |
1 |
0 |
0 |
0 |
1 |
Error Register |
Features |
8bit |
1 |
0 |
0 |
1 |
0 |
Sector Count |
Sector Count |
8bit |
1 |
0 |
0 |
1 |
1 |
Sector No. |
Sector No. |
8bit |
1 |
0 |
1 |
0 |
0 |
Cylinder Low |
Cylinder Low |
8bit |
1 |
0 |
1 |
0 |
1 |
Cylinder High |
Cylinder High |
8bit |
1 |
0 |
1 |
1 |
0 |
SelectCard/Head |
SelectCard/Head |
8bit |
1 |
0 |
1 |
1 |
1 |
Status |
Command |
8bit |
0 |
1 |
1 |
1 |
0 |
Alt Status |
Device Control |
8bit |
这样,通过CF卡的三条地址线(A2~A0)和两个片选信号(/CS1和/CS0),就能访问表中的所有寄存器,通过这些寄存器,CPU就能实现对CF卡的读写操作,同时还可以监控CF的状态。
CF卡内比较重要的几个寄存器分别是:
Error Register:监控是否出现扇区错误或者不可根正的错误,以及是否出现扇区溢出;
Sector Count,Sector No.Cylinder Low,Cylinder High:这四个寄存器是用于定位需要进行读写操作的空间的寄存器,与IDE硬盘类似,如果CF卡处于True IDE Mode,那么它也是用柱面加扇区来定位需要读写的空间的。CylinderLow,Cylinder High这两个寄存器都是8Bits,组成一个16bit Cylinder地址。SectorNo.寄存器指明了扇区开始的地址,Sector Count寄存器指明了扇区的偏移量;
Status:该寄存器的内容表明了CF卡当前的状态,是否忙,是否出现可恢复性的错误,是否出现操作错误等;
Control:该寄存器主要是用来控制CF卡的复位和中断。
如图1所示,用CPU通用并行总线的AD0~AD4这5条地址线加片选信号译码得到用于访问CF寄存器地址空间的A0~A2和/CS0,/CS1,当然,还包括CF的中断连接,以下为CPLD中的逻辑代码:
CF_ADD(0)<=IO_AD_REG(0);
CF_ADD(1)<=IO_AD_REG(1);
CF_ADD(2)<=IO_AD_REG(2);
CF_CS(0)<=IO_CS_L or IO_AD4 or(not IO_AD3);
CF_CS(1)<=IO_CS_L or(not IO_AD4)or(not IO_AD3);
CF_WR<=IO_CS_L or IO_WR_L;
CF_RD<=IO_CS_L or IO_OE_L;
IO_RDY<=IO_CS_L or CF_RDY;
CPU_IRQ<=CF_IRQ。
这样,就实现了CF与CPU的连接,CPU就可对CF进行读写访问了。
CF卡是通过/CD0和/CD1来控制在位信息的。在CF卡内部/CD0和/CD1是直接强下拉到地的,而在CF stocket中,/CD0和/CD1是弱上拉到3.3V。当CF卡插入的时候,CF stocket的/CD0和/CD1被CF拉低,以此触发CPU_INT,表明此时CF已经插入。此时CPU可以通过GPIO或者通用并行总线打开电子开关,给CF卡供电,可以开始对CF卡操作。在拔出CF卡之前,CPU通过GPIO或者通用并行总线关闭电子开关,停止给CF卡供电之后,CF卡就可以顺利拔出。但以上的热插拔操作在拔出的时候,还不是很智能,必须输入一个关闭CF卡电源的命令,确保CF卡电源已经关闭之后,才能拔出,不能做到即插即用。
CF卡的socket槽中的CD0、CD1插针长度设计得比电源插针短,两者之间的长度差异,应该能保证CF卡在插入插槽的时候,CF已经正常上电,而CD0、CD1还没有和相应插针接触,这样,在CF卡在拔出时,CD0和CD1已经和插槽脱离,CF还保持供电状态,根据实际情况,设计的CF卡stocket槽中的CD0、CD1插针长度至少比电源插针短1.5mm,如图2所示,在拔出CF的时候,/CD0和/CD1在CF卡断电之前即电源针和CF卡分离之前就已经跳高,即/CD0和/CD1比电源先和CF卡分离。此时会引发一个CPU_INT的上跳,CPU在监控到这个上跳信号之后,就可以把CF卡的电源关闭,此时就可以顺利拔出。如果要实现以上的热插拔,那么CPU必须支持边缘中断信号触发,如果CPU只支持电平信号的中断触发,那么就必须在CPLD中把/CD0和/CD1跳变转换成电平中断信号。以下为其逻辑代码:
process(GRESET,GCLK)
begin
if(GRESET=′0′)then
CD0_REG<=′0′;
CD1_REG<=′0′;
CD0_REG_CMP<=′0′;
CD1_REG_CMP<=′0′;
Elsif(GCLK′event and GCLK=′1′)then
if(((CD0_REG_CMP=′0′)and(CD0_REG=′1′))and
((CD1_REG_CMP=′0′)and(CD1_REG=′1′)))then
CPU_INT<=′0′;
end if;
CD0_REG<=/CD0;
CD1_REG<=/CD1;
CD0_REG_CMP<=CD0_REG;
CD1_REG_CMP<=CD1_REG;
end if; end process.