基于SAM模块的CPU型IC卡燃气表的设计
2009-09-23
作者:强 英
摘 要:一种以NEC公司的8位单片机uPD789167和SAM模块为核心的预付费型智能IC卡燃气表的设计,介绍了其工作原理、功能,硬、软件设计及其实际应用情况。
关键词:NEC单片机 SAM模块低功耗防攻击 认证
预付费型智能IC卡燃气表是一种根据用户IC卡购气量实现自动计费、自动控制用气的民用高技术产品。它和售气管理系统配合可实现预付费,从而免去人工入户抄表带来的诸多不便,并可解决欠费问题,具有传统人工抄表收费式燃气表无可比拟的优越性。目前,随着国家“金卡工程”的深入开展和开发大西北“西气东输”工程的正式启动,IC卡燃气表已呈现出十分广阔的应用前景。而将普通IC卡改进成CPU卡(智能卡),将使这种燃气表的保密性得到进一步的提升。本文介绍了该产品的核心技术——基于NEC单片机的预付费型智能CPU IC卡燃气表的硬件和软件设计,论述了该IC卡燃气表的工作原理、功能、可靠性设计、低功耗低成本设计及其实际应用情况。
1 预付费型智能CPU IC卡燃气表的工作原理
预付费型智能CPU型IC卡燃气表是在常规机械燃气表体上安装以单片机为主的智能测控系统而构成的。该测控系统主要由单片机、SAM(Secure Access Module)模块、CPU IC卡接口、计量电路、保护检测电路以及气路控制阀等组成,其系统结构如图1所示。
工作原理:当用户将含有一定购气量的CPU型IC卡插入表内时,控制阀在电控系统软件控制下打开气路阀门。用户每使用一个微小的计量单位(如1/1000L,该值根据机械表的参数设定)的气体时,计量电路便发出1个计量脉冲,该脉冲如经电控系统判定为有效,即进入软件进行累计,当达到一定数目(如1/100L)时可以从存于SAM模块中的已购气量中减去1个计量单位。当剩余气量为某一设定值时,燃气表进入报警状态,并关闭控制阀,切断气路以便提醒用户购气。用户此时按一次按键后,仍然可以打开阀门继续用气;当剩余气量为零时,控制阀再次关闭,用户只有将存储一定购气量的卡插入后才能打开阀门。
2 预付费型智能IC卡燃气表实现的功能
(1)计量和控制功能:充分利用单片机计量各种煤气用量;通过控制阀控制用户用气。
(2)加密功能:采用加密强度极高的CPU卡且一户一卡,通过完善的多重内部和外部认证后,达到一定的权限才可实现购气及其他操作。
(3)显示功能:可显示剩余煤气、月累计和季度累计煤气等;各种系统状态显示,如电池欠压、报警状态、气体过流等。
(4)提示功能:当剩余气不多(等于某一设定值)时,关阀一次提醒用户购气。
(5)报警功能:电池欠压报警、防止管道破裂的气体过流报警、阀门打开及关闭故障报警、外接可燃气体报警器接口的报警、卡非正常操作报警、燃气表开盖报警等。在发生报警情况时,首先关闭控制阀,然后蜂鸣器发声、LCD显示。每次报警事件都会记录在SAM模块中,在用户下次购气时返写到用户购气卡,再由购气卡返回到售气部门,从而可供主管部门或银行查询。
(6)自我保护功能:防止IC卡口和电池接线处的高电压攻击和短路行为、开盖检测、无电池检测、选用不怕强磁场的特殊脉冲传感器等。
3 预付费型智能IC卡燃气表的硬件设计
因为本预付费型IC卡燃气表是一种面向家庭的民用产品,因此,在设计硬件时要兼顾以下的原则:低成本;低功耗,尽量延长电池寿命;高可靠型,不允许死机以及已购气数据丢失的情况发生。
3.1 控制单片机的选择
控制单片机选用NEC公司生产的8位单片机uPD789167。uPD789167是44pin封装的低成本单片机,具有24KB ROM、512B RAM、8路8位A/D转换器、外部32kHz副时钟、6个定时器、4个外部中断等资源,在掩模后具有非常低的成本。
3.2 时钟电路的设计
本设计使用了uPD789167单片机的3.58MHz的主时钟和32kHz的副时钟。前者在单片机高速工作时运行,并经过内部2分频后提供给SAM模块和外部CPU型IC卡。为了降低功耗,在上电、访问SAM模块和IC卡以外的时间里,3.58MHz的主时钟停止振荡,而32kHz晶体则一直振荡,完成内部软件走时、气量的累计和统计,并协助对单位时间内的用气量进行判断,确定是否气体过流,必要时驱动LCD模块的显示。
3.3 SAM模块及CPU型IC卡的选择
CPU卡同普通的存储卡和逻辑加密卡相比,由于采用了CPU、片上操作系统(COS)、文件系统、加解密算法等先进技术,因而具有更高的安全性。为了提高智能燃气表的保密性能,本设计选取了北京握奇公司的SAM模块和CPU卡作为安全认证、数据存储和传输的介质。该产品拥有自主知识产权,符合ISO7816、PBOC等国际标准和行业标准;支持层次化文件结构,可建立三级应用目录,适合一卡多用的要求;支持包括二进制、定(变)长记录、钱包记录等多种文件类型;包含可擦写50万次的E2PROM,其容量从0.5K~16KB可选;已有在电表等行业成功应用的经验。CPU与SAM模块的接口如图2所示。标准规定CLOCK频率必须大于1MHz,本设计中CLOCK为1.79MHz;在不访问SAM模块时,SAM模块的电源被切断,同时CPU的-RST、CLOCK脚也输出低电平,CPU的I/O脚被置为输入、内部不上拉模式。
3.4 电源电路
如图3所示,电源分为2路,一路是3节电池经过3V稳压后,由VCC给CPU等供电;另一路不稳压,由VDD给开关阀门电路供电。2路分别使用各自的法拉电容,互不干扰,保证了掉电时阀门的可靠关闭以及数据传输到SAM模块的可靠保存。
电源电路提供了3.3V、3V的电池电压检测机制,电压分压后进入单片机的A/D转换输入端,单片机按照固定时间间隔检测1次电压,当发现低于3.3V时LCD显示低压告警;低于3V时则关闭阀门。此外,电源电路还提供了电池拔去或短路检测电路。当出现此类情况时,9015的集电极变高,以外部中断的方式激活单片机,使单片机及时关闭阀门。配合BAT54双二极管,达到了防止电池短路攻击行为的目的。
为了防止从电池接线端子进行的高电压攻击,配置了TVS管和200mA的可恢复保险丝。再结合IC卡口的保护,保证了本燃气表的自身安全。
3.5 看门狗电路
在有大容量电容的供电电路中,电源充放电速度缓慢,普通的RC复位电路经常不能产生正确的复位。在用户的正常使用过程中,更不允许燃气表死机的情况出现。为此采用74HC14设计了兼有上电复位、看门狗、低功耗低成本的振荡器型的复位、监控电路(低成本看门狗电路),如图4所示。图中,30kΩ电阻配合104电容及二极管,组成RC上电复位;在3V工作电压时,该看门狗清除时间间隔必须小于0.9秒。本设计的燃气表中,CPU每0.5秒唤醒1次,以检测并累计燃气脉冲,同时发出高电平宽度为20μs的清狗脉冲。另外,74HC14的其他门还用于燃气脉冲的整型电路和IC卡座时钟线的隔离电路中。
3.6 控制阀驱动电路
燃气阀门采用了专门设计的低功耗自保持阀门,只有在开关过程中耗电,平常不耗电。电磁阀驱动电路如图5所示。开关电压最低要求2.5V,开阀时最大电流约120mA,最大时间2秒;关阀时消耗电流最大为100mA,最大时间1秒。开阀有到位检测开关,如果开阀超时,则CPU发出阀门故障报警信号,同时关闭阀门。阀门驱动电路采用了0.22ΩF/5.5V电容的单独供电电源VDD(见图3),以保障开关阀门成功。
3.7 IC卡接口电路
IC卡接口直接执行人机交互,最有可能受到有意或无意的损坏,最常见的现象是短路、高压串入,因此接口电路必须具备完善的保护功能。IC卡座及保护电路如图6所示。CPU发现IC SWITCH为低电平后,知道有卡插入,则启动3.58MHz晶体振荡,输出-IC PWR CTRL低电平,给卡座供电,随后经过5ms延时再从IC VCC端检查卡座的电源是否准确。这可以用单片机的A/D转换器检测,如果电压太低,立即关闭供电放弃读卡。每一根信号线上具有由正温度系数热敏电阻(MZ12A-75S102M008,阻值为1000Ω,动作电流16mA)和嵌位二极管(1N4148)构成的限流限压保护电路,以防止外部高压串入。因电源线上阻值不能太大,热敏电阻要单独选取,故选择MZ12A-3R5N010(阻值为3.5Ω,动作电流200mA)。
3.8 开盖检测电路
如图7所示,S1是一个簧片,在燃气表出厂表壳盖上时是闭合的,当燃气表被打开表盖时,S1断开。图7中左、右2个电路虽然都能检测到开盖,即开盖时“开盖检测”端子都有电平变化,但左边电路的功耗明显比右边电路的功耗大。首先,由于CPU的输入管脚允许有最大3μA的漏电流,200kΩ的电阻不能再增大阻值,否则会影响高低电平的判断。设VCC=3V,左边的静态电流为3V/200kΩ=15μA,右边的静态电流为3V/1MΩ=3μA,其电流是前者的1/5,故本设计采用右边的电路。CPU在每0.5秒唤醒时间内检测“开盖检测”端子,一旦发现开盖,将关闭阀门、报警、并记录一次开盖事件到SAM模块中。
3.9 报警及LCD显示电路
uPD789167单片机以串行通信的方式驱动LCD模块实现显示,但LCD平常不显示时断开电源以节省电能。另外,设置有蜂鸣器报警电路,以便在刚发现故障时提醒用户。
4 低功耗设计技术
本燃气表的设计是:不旦要有CPU保持实时时钟走时、带看门狗,而且功耗要很低(平常的工作电流略大于30μA),为此采用了如下一些措施,以保证本机的低功耗运行。
4.1 采用低功耗的器件
本设计中尽可能采用低功耗器件,如3V稳压器采用了理光的低功耗产品;采用低功耗的可自保持的阀门,只有在开关过程中才会耗电。
4.2 采用低耗电的电路设计
(1)电池电压降至3V后才给CPU及其他外围电路供电,使芯片工作于低电压时消耗电流较少。
(2)SAM模块和IC卡座平常断电,只在读写认证时才供给电源。
(3)在不影响CPU电平判断的情况下,使用大一些的电阻(如开盖检测和电池检测电路中)。
脉冲采样电路也只在有脉冲时瞬间耗电。
4.3 软件配合实现低功耗
(1)让单片机尽量低速工作,软件只在访问SAM模块及CPU IC卡时才让3.58MHz的晶体振荡,平时只用32kHz的晶体就可以完成工作。
(2)合理配置CPU的各个管脚,输出脚输出合适电平,使平常不输出或吸入电流;输入脚平常一般不用内部上拉电阻而用外部电阻,因为内部上拉电阻较小,掩模时典型值为30kΩ,当输入低电平时耗电较多;CPU多余的管脚设置为输出模式,且输出低电平。
(3)CPU在32kHz晶体下工作时,处于HALT模式,每0.5秒时间到、或中断唤醒一次,软件检查几个中断标志、计数、走时、清狗后立即转入HALT睡眠,从而有效节省电能。
5 预付费型智能IC卡燃气表的软件设计
5.1 软件功能模块
软件用NEC78k0S C语言编写,采用模块化、层次化的编程方法。核心部分包括以下几个模块:SAM、CPU卡的通信模块(T=0,字符方式,串行速率9.6Kbps);SAM、CPU卡的认证和读写模块;燃气计量模块;电源管理模块;LCD显示模块;报警模块;工厂测试模块等(由于篇幅原因,在此不细述)。
5.2 SAM和CPU卡的认证过程
本燃气表中,软件必须接收和处理多种CPU卡:用户购气卡、检查卡、厂家生产测试卡(如阀门检测卡等6种)、修改主密钥卡等。每种CPU卡的目录文件结构和认证访问方式不尽相同,以使用用户购气卡购气后在燃气表上插卡为例,说明软件认证过程:
(1)从卡的可读二进制文件中识别出卡的类型,即用户购气卡。
(2)燃气表从用户卡中读取卡序列号和用户号,并比较用户号是否与SAM中存储的一致,不一致则拒绝读卡。
(3)若用户号一致,IC卡燃气表将卡序列号送至SAM模块。SAM模块对卡序列号进行加密,并生成相应的内部认证密钥。
(4)燃气表用内部认证密钥对用户卡做内部认证。
(5)燃气表用气表外部认证密钥对用户卡做外部认证。
(6)燃气表从用户卡购气应用二进制文件中读取购气数据,判断其完整性,同时判断购气次数是否与IC燃气表内一致。若不一致则向IC卡燃气表返写应用二进制文件(返写数据)退出;若判断一致,则进入(7)。
(7)由IC卡燃气表用气量外部认证密钥对SAM模块进行外部认证,若一致则将购气量及状态数据存入SAM模块,并返写数据退出,完成购气操作;否则只返写数据退出。
关于更详细的认证过程和更多的操作流程,有兴趣的读者可参考文献[1]、[2]、[3]。
6 结束语
基于NEC单片机和SAM模块的CPU IC卡预付费型燃气表,在安全保密性、防攻击、低功耗、低成本等方面作了有益的探索,经过几个月的实际使用,已证明达到了预期的效果。
参考文献
1 杨义先.智能卡安全与应用(第二版).北京:人民邮电出版社,2002
2 邵建平.智能卡开发者指南.北京:电子工业出版社,2000
3 北京握奇智能科技有限公司.北京握奇智能TimeCos培训资料V1.3(电子版).2002
4 袁涛.单片机C高级语言程序设计及其应用.北京:北京航空航天大学出版社,2001
5 NEC corporation.uPD789167 user manual,2001