1 系统设计
磁条卡信息终端基于ARM单片机和μC/OS-Ⅱ实时操作系统。μC/OS-Ⅱ是由Jean J.Labrosse编写的一种公开源代码的实时操作系统。但是μC/OS-Ⅱ只提供了一个操作系统内核,没有提供网络协议栈、文件系统等支持。在μC/OS-II操作系统上移植开源的嵌入式TCP/IP协议栈LwIP,利用西门子公司的GPRS模块MC39i就可以实现无线Internet的接入。系统总体框图如图1所示。
2 硬件设计
系统硬件组成框图如图2所示。系统以ARM单片机为核心构成,主要包括NXP公司的单片机LPC2106/01,GPRS无线MODEM MC39i,磁条卡接口芯片BS100E,键盘和LCD模块等。
NXP的LPC2106/01微控制器是基于ARM7TDMI内核的高性能32位RISC微处理器。LPC2106内嵌了128 KB可在系统编程的FLASH和64 KB的SR-AM,同时集成了多个32位定时器、PWM输出、2个UARTs接口和32个GPIO。LPC2106支持的最高CPU时钟频率为60 MHz。
GPRS MODEM选用西门子公司的MC39i。MC39i是双频GSM/GPRS模块,支持标准的ITU-TAT命令集,支持GPRS Class 10功能,具有功耗低,接口简单等优点。MC39i模块需要外接SIM卡座和天线。LPC2106的UART1接口与MC39i模块的数据串口连接,并通过IGT信号启动触发MC39i模块。
磁条卡上的数据记录格式采用ISO7811国际标准,最多包含3个磁道。大部分应用中只使用二磁道信息。系统的磁条卡接口由磁头和接口芯片组成。磁条卡接口芯片选用了台湾Vikintek公司的单磁道F2F解码芯片BS100E,该芯片可以实现磁头信号的放大和F2F编码数据的恢复。 BS100E的MSIA+和MSIA-管脚接磁头输出;CLS(Card Load Signal)管脚为磁条卡的刷卡有效信号,信号低电平有效,接LPC2106的外部中断IO口;RDPA和RCPA分别为解码输出的数据信号和时钟信号,RDPA接LPC2106的GPIO口,RC-PA接LPC2106的外部中断IO口。RCPA设置为上升沿触发中断。
3 软件设计
3.1 磁条卡接口驱动的实现
(1)磁条卡数据帧格式。本应用系统中只考虑磁条卡的二磁道信息。二磁道以5个比特组成一个字符数据,最后一位表示奇偶校验位,使用奇校验,前面4位表示数据位,可以表示16种字符,包括10个阿拉伯数字和6个其他字符。
磁道上的数据帧包括前导冗余数据、起始标志、数据区、结束标志、纵向冗余校验位(LRC),后沿冗余数据6个部分(见图3),冗余数据区不含有效数据,只用作磁道数据的同步,由若干的0组成。起始标志为11010;结束标志为11111;LRC为磁道上有效字符的异或和。正向刷卡时,数据将按图3的数据帧格式输出;反向刷卡时,数据帧将会被前后反转输出,即先检测到LRC,再检测到结束标志、数据区、起始标志,同时每个字符的位顺序也是前后反转输出的。此外,BS100E解码芯片输出的数据采用负逻辑表示,即输出为1的数据,实际上表示的是数据0,必须取反后才能使用。
(2)读卡程序的实现
磁条卡解码输出接口的时序图如图4所示。
当CLS为低电平时,表示磁卡已经进入读卡器,开始刷卡;当CLS由低变高时,表示磁卡已经离开读卡器,结束刷卡。在CLS为低的时候,每次RCPA下降沿出现时,RDPA送出一位数据。
在译码数据时,为了提高实时性,所有的数据处理都在中断中进行。在每次RCPA上升沿触发中断时读取RDPA的数据并处理。在解码时,首先要确定字符的边界,即确定一个字符的起始位。字符的边界识别采用图5所示的状态机实现。
在搜索状态,每读入一位数据就与之前读入的4位数据一起进行奇校验,当奇校验正确时,认为识别出字符的边界,转移到预同步状态。在预同步状态,连续读入5位数据后,判断这5位数据奇校验是否正确。如果这五位数据奇校验正确,认为字符的边界判别正确,进入同步状态;否则返回到搜索状态。在同步状态中,按照图3的数据帧格式进行数据译码。在数据译码的同时进行奇校验检查,当出现奇校验错误时,认为字符的边界不正确,重新返回搜索状态。
译码成功后,中断程序通过信号量通知应用程序任务处理译码数据。
3.2 LwIP在μC/OS-Ⅱ上的移植
LwIP是瑞士计算机科学院的Adam Dunkels等开发的一套用于嵌入式系统的开放源代码TCP/IP协议栈。它占用较少的RAM和ROM,这使LwIP协议栈适合在低端嵌入式系统中使用。LwIP还支持点对点协议(PPP),可以通过PPP连接GPRS网络,实现无线上网。
LwIP在设计时就考虑到移植问题,把所有与硬件、编译器和操作系统相关的部分独立出来,放在LwIP-1.3.0\include\arch和LwIP-1.3.0\arch目录下。因此LwIP在μC/OS-Ⅱ上的移植,主要工作就是编写这两个目录下的相关文件。要编写的文件主要包括cc.h、sys_ arch.h和sys_arch.c三个文件。移植LwIP协议栈,主要是针对具体硬件、编译器和μC/OS-Ⅱ系统重新设计以上3个文件。除此之外,还有一个配置文件lwipopt.h,主要对LwIP进行功能配置。cc.h,sys_arch.h和sys_arch.c三个文件和lwipopt.h文件的修改内容如下:
3.2.1 cc.h
主要定义与编译器有关的宏,主要包括LwIP数据类型、调试输出宏、临界保护的宏、错误编码、字的高低位顺序等等。
3.2.2 sys_arch.h
主要定义与操作系统相关的一些结构体与宏,包括邮箱、信号量、线程ID等。
3.2.3 sys_arch.c
主要实现与操作系统封装层相关的一些函数,包括邮箱操作函数、信号量操作函数等等,主要实现以下几个函数:
(1)LwIP系统的初始化函数。LwIP提供了系统初始化函数void sys_init(void),用来给用户初始化一些必要的数据结构。在本系统当中,sys_init()函数主要使用μC/OS-Ⅱ的内存管理函数,分配LwIP邮箱所需的内存和初始化LwIP的定时事件表。
(2)LwIP信号量操作函数。由于μC/OS-Ⅱ中已经实现了信号量的各种操作,只需使用μC/OS-Ⅱ中的信号量处理函数对LwIP的信号量操作函数重新进行封装就可以了。
(3)LwIP邮箱操作函数。LwIP中的邮箱对应μC/OS-Ⅱ中的消息队列。根据sys_arch.h文件里面定义的邮箱数据结构,使用μC/OS-Ⅱ的消息队列函数封装成以下几个函数就可以实现LwIP的邮箱操作:
(4)LwIP的sys_arch_timeouts函数。在LwIP当中,每一个线程都有一个定时器链表来保存相关的定时信息,移植时要做的事情是为每一个定时器链表提供一个用来保存链表表头指针的结构变量sys_timeouts,并通过sys_arch_timeouts函数返回每个线程对应的sys_timeouts变量,并且保证在出错时也能返回一个可用的sys_timeouts变量。相关的数据结构和函数定义如下:
(5)LwIP线程的创建函数。LwIP需要实现线程的创建函数,但是由于μC/OS-Ⅱ中没有线程的概念,只有任务,所以LwIP中线程创建可以通过调用μC/OS-Ⅱ中的任务创建函数实现。
(6)LwIP获取系统时间函数。当LwIP使用PPP作为数据链路层协议时,必须通过sys_jifties()函数获得以ms为单位的系统时间。因此要使用LwIP的PPP协议时,一定要实现这个函数;没有使用PPP协议时,无需理会。由于在μC/OS-Ⅱ,无论时钟节拍何时发生,μC/OS-Ⅱ都会对一个32位的计数器加1。可以通过调用μC/OS-Ⅱ的系统函数OSTimeGet()来获得该计数器的当前值,再根据系统的时钟节拍频率就可以实现sys_jifties()函数。
3.2.4 修改配置文件lwipopt.h
LwIP提供了配置文件lwipopt.h,可以通过定义一系列宏来剪裁LwIP功能,适应不同的应用需要。例如可以设置是否支持PPP协议,是否支持ICMP协议,是否支持自动获取IP等等。由于本应用系统使用GPRS上网,所以设置支持PPP协议。
3.3 GPRS无线Modem驱动
无线Modem驱动完成MC39i的初始化、发送和接收PPP协议帧数据。
3.3.1 AT命令
驱动Modem是基于A T命令集实现的,微控斜器通过串行接口将AT命令发送给MC39i,从而完成对MC39i的控制。主要AT命令如下:
(1)设置错误返回信息。使用at+cmee=1命令,执行错误时,错误报告的格式均为ERROR。
(2)设置接入网关。使用at+cgdcont=1,“IP”,“CMNET”命令设置GPRS接入网关为移动梦网。
(3)激活GPRS功能。使用AT+CGACT=1,使GPRS模块附着到网络。如果命令返回O K,则GPRS连接成功;如果返回ERROR,则意味着GPRS连接失败。
(4)拨号。ATD * 99 * * * 1#。拨号成功后,微控制器通过串口传送PPP协议帧,与Modem进行数据通信。
3.3.2 LwIP与Modem接口函数
无线Modem使用串行接口与微控制器进行通信。而LwIP提供了几个标准的串行设备接口函数,在LwIP中的创建sio.c文件实现GPRS无线Modem驱动。该文件中主要实现下面几个函数:
4 结语
本文设计的无线手持磁条卡信息终端系统实现了轻量级TCP/IP协议栈LwIP在μC/OS-Ⅱ上的移植,并利用运营商的GPRS网络实现了与后台服务器的无线互联,其终端具有成本低,体积小和功耗低等优点,可应用于多种应用场合。