下面是小编整理的用PIC单片机实现的IC卡读写器,本文共10篇,欢迎阅读分享,希望对大家有所帮助。本文原稿由网友“桃气包马小抱”提供。
篇1:用PIC单片机实现的IC卡读写器
用PIC单片机实现的IC卡读写器
摘要:详细介绍PIC单片机使用SPI方式与IC卡进行数据传输的原理和电路设计,以及使用USART方式与PC机进行串行异步通信的工作原理;介绍PIC单片机听SPI方式和USART方式的设置方法。关键词:PIC单片机 IC卡读写器 SPI方式 USART方式
引言
本设计的主要目的是介绍IC卡的数据存储技术和IC卡的数据通信,因而使用存储器卡。由于本设计中既可与IC卡进行串行同步通信,又要与上位机进行中行异步通信,因而需要选择一种同时具有这两种通信方式的单片机。因为PIC16F877不仅具有本设计所需要的两种通信方式,而且还具有运行速度快、低功耗、价格低等优点,所以选择PIC16F877单片机作为本设计的单片机。
图1是本设计的电路图,图中电源变换电路和发光二极管等指示电路没有画出。图中的二极管电路是单片机与IC卡通信数据线的保护电路。当数据线上的电压为负电压时,与地相连的二极管导通;当数据线上的电压大于+5V时,与+5V相连的二极管导通,从而保证数据线上的电压在0V~+5V之间,保护单片机和IC卡不受损坏。图中单片机的15脚和23脚分别与IC卡的输出引脚3和4相连。由于IC卡的输出电压为CMOS电平,而单片机能够正确的识别IC卡的输出信号,需要加上拉电阻。
1 SPI工作方式
串行外围设备接口SPI(Serial Peripheral Interface)总线技术是Motrola公司推出的一种同步串行接口。SPI总线是一种三线同步总线,因其硬件能力很强,与SPI有关的软件就相当简单,使CPU有更多的时间处理其它事务,因此得到广泛应用。
SPI模式允许8位数据同步发送和接收,支持SPI的.所有四种方式。SPI模式传输数据需要四根信号线:串行数据输出(SDO)线、串行数据输入(SDI)线、串行时钟(SCK)和从选择(SS)。其中,从选择线只用于从属模式。
1.1 SPI主模式
由于控制时钟SCK的输出,主模式可以在任何时候开始传输数据。主模式通过软件协议控制从模式的数据输出。
在主模式中,一旦SSPUF寄存器写入,数据就会发送或接收。在接收数据时,SSPSR寄存器按照时钟速率移位,一旦接收到一个字节,数据就传输到SSPBUF,同时中断标志位和状态标志位置位。
时钟的极性可以通过编程改变。在主模式中,时钟SCK的频率可以设置为:fosc/4(即Tcy)、fosc/16(即4Tcy)、fosc/64(即16Tcy)和定时器2(Timer2)输出的二分频等四种。在芯片时钟为20MHz时,SCK的最大频率为5.0MHz。
在本设计中,使用的就是SPI主模式,由单片机控制时钟SCK的输出。当向IC卡中写数据时,随时可以发送数据;当读IC卡内的数据时,先要发送任意一个数据(此时IC卡不处于写入状态,不会接收该数据), 给IC卡提供输出数据的时钟,然后再接收IC卡发出的数据。其时序如图2所示。(发送和接惦的数据均为6FH)
如果要连续发送数据,那么每次将数
[1] [2] [3] [4] [5]
篇2:用PIC单片机实现的IC卡读写器的论文
用PIC单片机实现的IC卡读写器的论文
摘要:详细介绍PIC单片机使用SPI方式与IC卡进行数据传输的原理和电路设计,以及使用USART方式与PC机进行串行异步通信的工作原理;介绍PIC单片机听SPI方式和USART方式的设置方法。
关键词:PIC单片机 IC卡读写器 SPI方式 USART方式
引言
本设计的主要目的是介绍IC卡的数据存储技术和IC卡的数据通信,因而使用存储器卡。由于本设计中既可与IC卡进行串行同步通信,又要与上位机进行中行异步通信,因而需要选择一种同时具有这两种通信方式的单片机。因为PIC16F877不仅具有本设计所需要的两种通信方式,而且还具有运行速度快、低功耗、价格低等优点,所以选择PIC16F877单片机作为本设计的单片机。
图1是本设计的电路图,图中电源变换电路和发光二极管等指示电路没有画出。图中的二极管电路是单片机与IC卡通信数据线的保护电路。当数据线上的电压为负电压时,与地相连的二极管导通;当数据线上的电压大于+5V时,与+5V相连的二极管导通,从而保证数据线上的电压在0V~+5V之间,保护单片机和IC卡不受损坏。图中单片机的15脚和23脚分别与IC卡的输出引脚3和4相连。由于IC卡的输出电压为CMOS电平,而单片机能够正确的识别IC卡的输出信号,需要加上拉电阻。
1 SPI工作方式
串行外围设备接口SPI(Serial Peripheral Interface)总线技术是Motrola公司推出的一种同步串行接口。SPI总线是一种三线同步总线,因其硬件能力很强,与SPI有关的`软件就相当简单,使CPU有更多的时间处理其它事务,因此得到广泛应用。
SPI模式允许8位数据同步发送和接收,支持SPI的所有四种方式。SPI模式传输数据需要四根信号线:串行数据输出(SDO)线、串行数据输入(SDI)线、串行时钟(SCK)和从选择(SS)。其中,从选择线只用于从属模式。
1.1 SPI主模式
由于控制时钟SCK的输出,主模式可以在任何时候开始传输数据。主模式通过软件协议控制从模式的数据输出。
在主模式中,一旦SSPUF寄存器写入,数据就会发送或接收。在接收数据时,SSPSR寄存器按照时钟速率移位,一旦接收到一个字节,数据就传输到SSPBUF,同时中断标志位和状态标志位置位。
时钟的极性可以通过编程改变。在主模式中,时钟SCK的频率可以设置为:fosc/4(即Tcy)、fosc/16(即4Tcy)、fosc/64(即16Tcy)和定时器2(Timer2)输出的二分频等四种。在芯片时钟为20MHz时,SCK的最大频率为5.0MHz。
在本设计中,使用的就是SPI主模式,由单片机控制时钟SCK的输出。当向IC卡中写数据时,随时可以发送数据;当读IC卡内的数据时,先要发送任意一个数据(此时IC卡不处于写入状态,不会接收该数据), 给IC卡提供输出数据的时钟,然后再接收IC卡发出的数据。其时序如图2所示。(发送和接惦的数据均为6FH)
如果要连续发送数据,那么每次将数据送到SSPBUF寄存器后,都要判断是否已经发送完该数据,即判断PIR1寄存器的SSPIF位是否为1。如果SSPIF位为1,则表明数据已经发送完毕,可以继续发送下一个数据。但此时还不能立即发送下一个数据,因为SSPIF位必须在程序中由软件清零,只有将SSPIF位软件清零后,才能继续发送下一个数据。
1.2 SPI从模式
在SPI从模式,数据的发送和接收领先SCK引脚上输入的外时钟脉冲,当最后一位被锁存后,中断标志位SSPIF(PIR1的D3)位。在休眠模式,从模式仍可发送和接收数据,一旦接收到数据,芯片就从休眠中唤醒。如果采用SS控制的从模式,当SS引脚接到VDD时,SPI模式复位;如果 彩CKE=1控制的从模式,必须开放SS引脚控制。
在本设计中,由于IC卡是存储器卡,不能提供时钟信号,因此不能采用从模式,只能采用主模式,由单片机控制时钟信号。
单片机的SPI方式初始化程序如下:
MOVLW20H ;将20H送到累加器
MOVWF SSPCON ;将累加器中的数送到SSPCON寄存器
BSF STATUS,RP0 ;将定RAM区的第1页
BCF SSPSTAT,SMP ;将SSPSTAT寄存器的SMP位置0
BSF SSPSTAT,CKE ;将SSPSTAT寄存器的CLK位置1
BCF TRISC,3 ;将端口C的第3位设置为输出
BCF TRISC,5 ;将端口C的第5位设置为输出
其中,上述第1、2行程序是配置控制寄存器,将SPI方式配置为主控模式,时钟频率为单片机时钟频率的1/4,并将时钟的高电平设置为空闲状态。第3行程序为换页指令,将指针转到第1页。因为PIC16F877单片机的数据存储器是分页的,而所要操作的寄存器在第1页,因此要用换页指令将指针到第1页。第4、5行程序是配置状态寄存器,将SPI方式设置为数据输出时钟的中间采样,时钟SCK的上升沿触发。第6、7行程序则是将RC口的RC3和RC5设置为输出。
2 USART方式
通用同步异步接收发送模块(USART)是两个串行通信接口之一,USART又称为SCI(Serial Communication Interface)。USART可以设置为全双工异步串行通信系统,这种方式可以与个人计算机PC或串行接口CRT等外围设备进行串行通信:也可以设置为半双工异步串行通信系统,与串行接口的A/D或D/A集成电路、串行EEPROM等器件连接。USART是二线制串行通信接口,它可以被定义如下三种工作方式:全双工异步方式、半双工同步主控方式、半双工同步从动方式。
为了把RC6和RC7分别设置成串行通信接口的发送/时钟(TX/CK)线和接收/数据(TX/DT)线,必须首先把SPEN位(TCSTAT的RD7)和方向寄存器TRISC的D7:D6置1。
USART功能模块含有两个8位可读/写的状态/控制寄存器,它们是发送状态/控制寄存器TXSTA和接收状态/控制寄存器TCSTA。
USART带有一个8位波特率发生器BRG(Baud Rato Generator),这个BRG支持USART的同步和异步工作方式。用SPBRG寄存器控制一个独立的8位定时器的周期。在异步方式下,发送状态/控制寄存器TXSTA的BRGH位(即D2)也被用来控制波特率(在同步方式下忽略BRGH位)。
向波特率寄存器SPBRG写入一个新的初值时,都会使BRG定时器复位清零,由此可以保证BRG不需要等到定时器溢出后就可以输出新的波特率。
对USART方式进行初始化的程序如下:
BSF STATUS,RP0 ;将指针指向数据存储器的第1页
MOVLW 0x19
MOVWF SPBRG ;设置波特率为9600
BCF STATUS
,RP0 ;将指针指向数据存储器的第0页
CLRF RCSTA ;将接收控制和状态寄存器清零
BSF RCSTA,SPEN ;串口允许
CLRF PIR1 ;清除中断标志
BSF STATUS,RP0 ;将指针指向数据存储器的第1页
CLRF TXSTA ;将发送控制和状态寄存器清零
BSF TXSTA,BRGH ;设置为异步、高速波特率
BSF TXSTA,TXEN ;允许发送
BCF STATUS,RP0 ;将指针指向数据存储器的第0页
BSF RCSTA,CREN ;允许接收
初始化完成后,即可发送或接收数据。在发送或接收数据时,通过查询发送/接收中断标志位即可判断是否发送完一个数据/接收到一个数据。发送/接收中断标地不需要也不有用软件复位。
在异步串行发送的过程中,只要TXREG寄存器为空,中断标志TXIF就置位。因此,TXIF为1并不是发送完毕的标志,但仍可以用TXIF标志来判断。因此当TXREG为空时,将数据送入后,数据会保留在TXREG寄存器中,直到前一个数据从发送移位寄存器中移出,即前一个数据发送完。
3 IC卡
IC卡是集成电路卡(Integrated Circuit Card)的简称,有些国家和地址称其为智能卡(Smart Card)、芯片卡(Chip Card)。国际标准化组织(ISO)在ISO7816标准中规定,IC卡是指在由聚氯乙烯(PVC)或聚氯乙烯酸脂(PVCA)材料制成的塑料卡内嵌入式处理器和存储器等IC芯片的数据卡。近年来,由于导半体技术的进步,集成化程度和存储器容量有了很大提高,并使CPU和存储器集成在一个芯片上,从而提高了数据的安全性。
在本设计中,IC卡采用的是AT45DB041B-SC芯片,该芯片的特点如一下:
*单一的2.7V~3.6V电源;
*串行接口结构;
*页面编程操作,单一的循环重复编程(擦除和编程,2048页(每页264字节)主存;
*两个264字节的SRAM数据缓存,允许在重编程非易失性存储器时接收数据;
*内置的编程和控制定时器;
*低功耗,4mA有源读取电流,2μA CMOS备用电流;
*15MHz的最大时钟频率;
*串行外围接口方式(SPI)――模式0和3;
*CMOS的TTL兼容的输入和输出;
*5.0V可承受的输入,SI、SCK、CS(低电平有效)、RESET(低电平有效)。
在本设计的调试过程中,曾测试过IC卡的输入输出电平,结果证明这种IC卡的输入电平与TTL兼容,而输出电平与TTL不兼容。
4 IC卡的电源提供电路
在本设计中,由于IC卡的电源电压范围为+2.7~+3.6V,而PIC单片机需要的电源为+5V,而且稳压源提供的电压也是+5V,因此,要设计一个稳压模块,给IC卡提供+3V左右的电压。设计电路如图3所示。
该电路的主要元件为LM317芯片,它是三端可调集成稳压器,输出电压为1.25~37V范围内可调。当其Vin端的输入电压在2~40V范围内变化时,电路均能正常工作,输出端Vout和调整端ADJ间的电压等于基准电压1.25V。该芯片内的基电路的工作电流IREF很小,约为50μA,由一个恒流性很好的恒流源提供,所以它的大小不受供电电压的影响,非常稳定。在图3中,B点为电压输出端,为IC卡提供电压。A点为控制端,与单片机的一个端口引脚相连,当该引脚为低电平时,三极管Q1不工作,B点输出电压约为3.15V;当该引脚为高电平时,三极管Q1工作,B点输出电压约为1.25V。在程序中查询IC卡插座中是否有IC卡,当有IC卡时,将A点所连的单片机引脚设置为低电平,从而为IC卡提供电源;当没有IC卡或对IC卡的操作结束时,将A点连的单片机引脚设置为高电平,从而不给IC卡提供电源。
IC卡的上电和下电程序如下。
IC卡上电子程序 IC卡下电子程序
POWERON POWEROOF
BSF STATUS,RP0 BSFSTATUS,RP0
BCF TRISE,0 BCF TRISE,0
BCF RTISE,1 BCF TRISE,1
BCF STATUS,RP0 BCF STATUS,RP0
BCF PORTE,0 BSF PORTE,0
BCF PORTE,1 BSF PORTE,1
CALL DLYTIM CALL DLYTIM
RETURN RETURN
在本设计中,单片机与IC卡通信的主程序流程图如图4所示。
5 与PC机的通信
在本设计中,有PIC单片机与PC机串行通信的功能。由于本设计所用的单片机PIC16F877有USART方式,该方式可将C口的RC5和RC7设置成异步串行通信模式,因而在本设计中,与PC机的通信模块电路就比较简单。将单片机C口的RC6和RC7设置为异步串行通信模式,经过MAX232A芯片进行电平转换后,将TTL电平转换为RS232电平,再与DB9接口相连,即可实现通信。在PC机端,可以用VC等编程工具根据通信协议编写软件来控制对IC卡的读写操作。
6 结论
经过调试,本设计能够在脱离在线仿真器的情况下,上电后独立的运行程序,并能在PC机软件的控制下,实现对IC卡中任意位置的读写,其中读写的起始地址、读写数据的个数以及数据内容可以在PC机端输入或选择。
本设计已在实际应用中测试过,具有实用价值。由于本设计中所使用的PIC单片机的程序存储器较大(8KB),因而可以编写较大的程序,实现多合一该卡器并由PC机控制读写哪种芯片的IC卡。另外,由于本设计所使用单片机的程序存储器是Flash存储器,因而可以方便地实现程序的下载和升级。
篇3:网络计算机中IC卡读写器子系统设计
网络计算机中IC卡读写器子系统设计
摘要:针对网络计算机安全问题,提出了一种完整的智能IC卡读写器子系统设计方案。此方案讨论了基于单片机的IC卡读写器硬件和软件设计、基于PC/SC行业规范的读写器驱动程序设计和IC卡的软硬件选取。关键词:网络计算机 安全 单片机 智能IC卡 IC卡读写器 PC/SC ISO7816
随着网络的飞速发展和计算机技术的不断进步,计算机应用模式正发生着巨大的变革。网络计算机(NC)的出现标志着计算机体系结构的革新,代表着未来计算机系统的发展方向。由于网络计算机可以采用开放源码操作系统,为发展带有自主知识产权的核心技术创造了有利条件。在开放源代码的操作系统中,Linux是一种较好的选择。它源代码公开,可以根据要求自行剪裁并且稳定,对资源要求低,有大量应用软件支持。按照网络电脑的特定需求,可以开发出具有自主智能产权的CPU,从而提高网络电脑的安全。网络电脑走的是一种网络服务器集中式管理的道路,具有成本低廉、管理费用低的优势。
为此,国家863计算机软硬件技术主题发展规划提出了以下要求:组织优势力量,研究网络计算机系统的关键技术,研制网络计算机系列产品,选择若干典型应用领域的进行应用示范,以此推动国产微处理器芯片和系统软件的发展,促进我国电子政务、网络教育、金融、社区服务、企业管理等方面的信息化建设。
随着计算机网络的迅速发展,网络计算机的安全问题显得非常突出。尤其在某些特殊领域,如电子政务等,安全问题显得极端重要。目前,在计算机安全方面,有各种不同的方法,但效果都不太好。本文提出的智能IC卡技术,在网络计算机是一种全新的方法,能够很好地实现网络计算机的安全。智能IC卡(Smart IC)具有较高的安全性,以前主要用在金融、电信等领域,笔者把此技术推广应用到网络计算机,以提高安全性。智能IC卡本身含有自行研制的COS(Chip OS)和加密算法,并采用多密钥、多加密算法体系,对所有的敏感数据文件加密保护。如图1所示。
(本网网收集整理)
IC卡子系统是整个网络计算机系统网络安全的核心,它保存了加密算法所需要的私有密钥,供加密算法对网络上传输的数据加密使用。
1 IC卡读写器硬件开发方案
IC卡作为一种信息技术可以广泛应用于许多行业领域,如金融、电信等,不同领域均有各自不同的应用特点、应用环境和应用要求。IC卡在某一领域的应用,必须适应该领域的特点。国际上有关组织及部分针对各个领域的不同要求,制定了IC卡在某一领域应用所应参考或遵循的应用标准。不过所有智能IC卡都必须符合国际标准化组织的ISO/IEC 7816国际标准。读写器的硬件也必须遵循ISO/IEC 7816国际标准。
ISO/IEC 7816标准要求IC卡与IC卡读写器使用串行通信,时序要求非常严格。常用的MCS51系列单片机速度较慢,每个指令周期需要12个机器周期,较难达到该标准所要求的严格时序。Microchip公司的PIC系列单片机采用RISC结构,每个指令周期为4个时钟周期,并且除转移指令外,所有指令都可以在一个指令周期内完成,速度较快,能够满足该标准对时序的严格要求。所以采用一片PIC16C73单片机作为IC卡读写器的控制器。
读写器与IC卡的通信,采用半双工的ISO 7916-3字符帧协议标准。3.57MHz的晶振为IC卡和读写器提供时钟。在缺省工作方式下,IC卡和读写器的通信速率为9600bps。即时钟频率为3.57MHz,每372个时钟输入或输出一个比特位。在未来需要较高通信速度时,可以在对程序作较小改动的前提下,提高晶振频率,如采用2×3.57MHz的晶振。
IC卡读写器与NC之间的通信,可以采用USB接口、并口、串口、PS/2口等多种方案。采用USB接口可以实现即插即用和热拔插等功能。但使用USB接口,电路和协议都很复杂,并且增加USB接口器件会较大地增加系统成本。并口有较高的通信速度,但通信线路较多,硬件比较复杂,可靠性不好,且IC卡读写器并不需要太高的通信速度,故使用并口也不是理想的方案。而PS/2口一般固定给键盘和鼠标等标准外设使用,使用PS/2口就会占用这些标准外设的接口,故也不在考虑范围之内。使用串口通信虽然速度慢,但却具有硬件成本低、软件实现简单、运行可靠等优点。而通信速度完全可以满足IC卡读写器的要求。所以IC卡读写器采用了RS232串口与NC主机通信的方案。
整个系统使用5V电压供电。IC卡读写器采用低功耗设计,系统电源从RS232接口的信号线上获得。RS232接口的电压为±12V,经过电源稳压器件LP2950将12V电压变为+5V,给IC卡读写器所有器件提供电源。
IC卡读写器硬件的原理框图如图2所示。
IC卡各引脚接到单片机I/O口上,由单片机对IC卡进行读写。由于PC(NC)机的RS232接口电平与单片机的逻辑电平不同,所以需要对串口信号进行电平转换。图2中
使用了电平转换器件。它把单片机的TTL逻辑电平转化为RS232接口的±12V电平,实现单片机与RS232的透明传输。转换后的信号直接接在RS232接口上。
2 IC卡读写器软件开发方案
IC卡读写器驱动程序由读写器与IC卡通信的通信程序、读写器与NC或PC通信的通信程序以及NC与读写器通信的驱动程序三部分组成。其中,NC与IC卡读写器通信的程序符合PC/SC规范,它与PC/SC规范的中间件结合,向应用程序提供符合PC/SC规范的API函数。
2.1 读写器与IC卡通信的通信程序
该通信程序采用ISO 7816-3字节协议标准编制。使用T=0,即字符协议,主要实现与IC卡的通信。由于选用的时钟为3.57MHz,在IC卡I/O口默认的9600bps通信速度下,每隔372个系统时钟脉冲,I/O状态可能变化一次。所以,为了准确读取IC卡I/O状态,在IC卡输出的每一位脉冲中间,即I/O启动186个时钟周期后,读取I/O状态。为了排除可能的干扰,在186个时钟周期的两侧再采样两点,共取样三点。三个采样点之间每两个点间隔24个时钟周期。如果三点取样值都为1,则输出为1;如果三点取样值都为0,则输出为0;如果三点取样值中有两点为1,一点为0,则输出为1;如果三点取样值中两点为0,一点为1,则输出为0。如图3所示。
2.2 读写器与NC的通信的通信程序
读写器与NC的通信程序采用异步串行口协议,双方通信先握手取得同步,然后再进行串行口通信。读写器通过串口接收NC发来的命令,并将执行结果通过串口发回。读写器与NC的通信在不影响读写器与IC卡通信的前提下完成。
2.3 NC的驱动程序
NC通信程序驻留于NC,它与读写器的通信程序通信。这个程序符合PC/SC规范。规范规定的分层模块结构见图4。
图4中的ICC就是Integrated Circuit Card,即IC卡。IFD就是Interface Devices,即IC卡读写器。IC卡插入读写器后,通过IC卡读写器IFD与NC驱动程序的IFD Handler层通信。ICC Resource Manager层管理各种不同的IC卡读写器和IC卡资源。每一种IC卡读写器通过各自的IFD Handler接口函数与ICC Resource Manager层通信,ICC Resource Manager层根据上层软件的要求,将上层软件发来的命令分别发到相应的IFD Handler,再通过它发给IC卡读写器和IC卡。而ICC-Aware Applications层对上层应用软件提供一个通用的API接口,以满足不同的应用程序对不同的IC卡和读写器的编程要求。Service Provider层介于ICC-Aware Applications层和ICC Resource Manager层之间,要吧提供文件的存取控制和驱动程序的加密通信功能。当然,在不使用加密通信功能时,也可以不用这一层。
NC的驱动程序根据规范要求,提供符合标准的IFD Handler层接口函数,其余各部分由符合规范的中间件提供。应用程序调用间件提供的API函数发送命令。中间件把应用程序发来的命令编译成动态链接库的IFD Handler接口函数发给IC卡读写器,最终发给IC卡。最后,IC卡将返回结果通过一系列相反的过程返回给应用程序。
3 Smart IC卡开发方案
IC卡芯片具有写入数据和存储数据的能力,IC卡存储器的内容根据需要可以有条件地由外部读取,以供内部信息处理的判定。根据卡中所嵌入的集成电路的`不同可以分成三类:
(1)存储器卡,卡中的集成电路为EEPROM(可以用电擦除的可编程只读存储器);
(2)逻辑加密卡,卡中的集成电路具有加密逻辑和EEPROM;
(3)CPU卡,卡中的集成电路包括中央处理器CPU、EEPROM、随机存储器RAM以及固化在只读存储器ROM中的片内操作系统COS(Chip Operating System)。
除此之外,IC卡根据读写方式不同,可分为接触式IC卡和非接触式IC卡两种。由于网络安全要求,IC卡在使用时必须一直插在读写器内。非接触IC卡由于其读写器没有专用卡座,尽管有寿命长等优点,但不适用于网络安全应用。
同时,由于CPU卡计算能力强,可以使用自己的COS操作系统,甚至使用硬件完成加密算法。而IC存储卡仅具有存储功能,安全性不如CPU卡好,的怪SNCS(Smart Network Computer System)的IC卡子系统采用接触式CPU卡。
网络计算机安全系统的IC卡设计满足标准化(国际标准)和智能化,既有安全性又有易维护性。它由硬件和软件两部分组成。
(1)硬件
采用CPU卡,它含有CPU及RAM、ROM等。具有优秀的安全性能,可能有效防止黑客对IC卡解密。
(2)软件
・通信程序
IC卡软件即COS(Chip Operating Systarm),它是智能卡芯片内的一个监控软件,用于接收和处理外界发给智能卡的各种信息,管理卡内的存储器,并给出相应的应答信息。它有IC卡与读写器的通信程序。该通信程序完成与读写设备之间的通信,必须满足7816-3字符帧协议。该协议含有T=0字符传送协议和T=1数据块传送协议。
・安全文件系统
COS文件系统与普通文件系统不同,它着重强调文件系统的安全性,除提供通常的字符流文件操作外,还提供记录文件的读写操作等。对每种不同的文件操作进行不同的访问权限保护。COS中的文件系统与上层应用软件的用户权限管理相结合,共同完成对IC卡文件的访问。由于IC卡的文件存储介质采用EEPROM,每次写文件操作时,必须对要写入的介质先进行擦除操作。
・安全机制
安全机制用于身份鉴别和IC卡与读写设备双方的认证工作及各种数据的加密、数据完整性检查等操作。每个用户IC卡上都有用户的一个私钥,服务器把用公钥加密后的数据经IC瞳用自己的私钥解密后将正确的信息通过网络送给服务器,由服务器根据解密的信息完成对用户权限的鉴别。
・加解密算法
加解密算法,用于对传入IC卡的数据进行加、解密,此外它还提供扩展接口,方便用户增加新的加密算法。
・命令解译
命令解译是COS的上层软件,它实现ISO7816-4的各种命令和CA命令。
根据串口窃电IC卡读写器设计技术思想,IC卡读写器采用低功耗元器件(PIC16C73B低功耗单片机和74LV125A等),同时采用分离元件取代MAX系列的RS232接口电路,实现了无需外接电源的串口IC卡读写器。经实验测试,整个电路功耗低于10mA,完全可以由串口提供电源。
本项目实现的串口IC卡读写器完全符合ISO7816-1/2/3标准以及PC/SC规范;软件实现采用分层结构,实现了T=0的字符传输协议。
经实验测试,读写器稳定可靠地实现IC卡复位应答、读IC卡读写器件状态字、读一个随机数据、读取IC卡序列号以及选择一个文件等操作;在计算机与IC卡之间,可以实现数据的透明传输。此IC卡子系统既可以工作在Linux平台上,也可以工作在Windows系列平台上。
篇4:网络计算机中IC卡读写器子系统设计
网络计算机中IC卡读写器子系统设计
摘要:针对网络计算机安全问题,提出了一种完整的智能IC卡读写器子系统设计方案。此方案讨论了基于单片机的IC卡读写器硬件和软件设计、基于PC/SC行业规范的读写器驱动程序设计和IC卡的软硬件选取。关键词:网络计算机 安全 单片机 智能IC卡 IC卡读写器 PC/SC ISO7816
随着网络的飞速发展和计算机技术的不断进步,计算机应用模式正发生着巨大的变革。网络计算机(NC)的出现标志着计算机体系结构的革新,代表着未来计算机系统的发展方向。由于网络计算机可以采用开放源码操作系统,为发展带有自主知识产权的核心技术创造了有利条件。在开放源代码的操作系统中,Linux是一种较好的选择。它源代码公开,可以根据要求自行剪裁并且稳定,对资源要求低,有大量应用软件支持。按照网络电脑的特定需求,可以开发出具有自主智能产权的CPU,从而提高网络电脑的安全。网络电脑走的是一种网络服务器集中式管理的道路,具有成本低廉、管理费用低的优势。
为此,国家863计算机软硬件技术主题发展规划提出了以下要求:组织优势力量,研究网络计算机系统的关键技术,研制网络计算机系列产品,选择若干典型应用领域的进行应用示范,以此推动国产微处理器芯片和系统软件的发展,促进我国电子政务、网络教育(www.xfhttp.com-雪风网络xfhttp教育网)、金融、社区服务、企业管理等方面的'信息化建设。
随着计算机网络的迅速发展,网络计算机的安全问题显得非常突出。尤其在某些特殊领域,如电子政务等,安全问题显得极端重要。目前,在计算机安全方面,有各种不同的方法,但效果都不太好。本文提出的智能IC卡技术,在网络计算机是一种全新的方法,能够很好地实现网络计算机的安全。智能IC卡(Smart IC)具有较高的安全性,以前主要用在金融、电信等领域,笔者把此技术推广应用到网络计算机,以提高安全性。智能IC卡本身含有自行研制的COS(Chip OS)和加密算法,并采用多密钥、多加密算法体系,对所有的敏感数据文件加密保护。如图1所示。
IC卡子系统是整个网络计
[1] [2] [3] [4] [5]
篇5:IC卡接口芯片TDA8007的读写器设计
摘要:阐述T=0传输协议,给出IC卡读写器中使用的IC卡APDU指令流程和原理框图;重点介绍其中的IC卡接口芯片Philips的TDA8007,给出通过TDA8007对CPU IC卡上下电过程、具体程序及TDA8007使用中应注意的问题。
关键词:CPU IC卡 TDA8007 ISO7816
IC卡(Integrated Circuit card)即集成电路卡,是将一个集成电路芯片镶嵌于朔料基片中,封装成卡的形式,外形与常用的覆盖磁条的磁卡相似。IC卡芯片具有写入和存储数据的能力。IC卡存储器中的内容根据需要可以有条件地供外部读取,或供内部信息处理和判定。根据卡中所镶嵌的集成电路的不同,可以分成存储器卡、逻辑加密卡、CPU卡三类。其中CPU卡即为由中央处理器CPU、EEPROM、随机存储器RAM以及固化在只读存储器ROM中的片内操作系统COS(Chip Operation System)组成的IC卡。IC卡按与外界数据传送的形式来分,有接触式和非接触式两种。
图1 T=0的CPU卡APDU指令实现流程
1 CPU IC卡T=0的协议介绍
目前大多数CPU IC卡采用T=0模式。所谓T=0,即CPU IC卡与接口设备(即读写器)中数据传输方式为异步半双工字符传输模式。
从T=0协议的功能出发,该协议的实现可以分为物理层、数据链路层、终端传输层和应用层。其中物理层和数据链路层可以具体参看ISO7816标准。在T=0协议应用,终端传输层和应用层实际上是不易分割来说明的,下面简单说明。
终端传输层根据卡片返回的过程字符和状态字节执行相应的操作,使读写器对数据的处理过程明朗清晰。卡片返回的过程字节和状态字节跟应用层发送给卡的APDU(Application Protocol Data Unit,应用协议数据单元)和VPP使用等有关。表1为VPP未用时的终端传输层中返回的过程字节。
表1
字 节值结 果
ACKINSVPP空闲,所有其余的数据字节相继续被传送INS+'FF'VPP空闲,下一个数据字节随后被传送SW1SW2VPP空闲,接口设备等待SW2字节应用层即为由CLA、INS、P1、P2、P3作为命令头组成的命令消息体的APDU响应和应答处理层。其中CLA为指令类别,INS为指令码,P1、P2为参数,P3为根据APDU的不同格式为发送给卡的数据长度或期望响应的数据长度。APDU的几种情况如表2所列。
表2
命令头发送数据长度发送的数据期望应答的数据长度通用APDUCLA INS P1 PLCDataLE情况一CLA INS P1 P 情况二CLA INS P1 P LE情况三CLA INS P1 PLCData 情况四CLA INS P1 P2LCDataLECPU卡对接口设备(即读写器)的应答APDU情况如表3所列。
表3
体尾数据DataSW1 SW2其中体中的数据字节数由命令APDU中的LE指出;SW1、SW2是必备的,可以指明命令APDU执行正确或执行出错的错误类型。
2 基于T=0传输协议的CPU IC的APDU指令流程
根据目前CPU卡的常用T=0协议、自带编程升压电路的应用情况,以及本读写器接收IC卡数据报文直接发送PC机处理的特点,本读写器可行的APDU命令和响应的处理流程如图1所示。
3 读写器的硬件组成
读写器的硬件部分主要由IC接口管理芯片TDA8007、MCUAT89C52、外部数据存储器W24257S、串口电平转换芯片MAX3226、安全IC卡座(即SAM卡座)、应用IC卡座、键盘口供电的串口通信线及其它相关元器件组成。
图2所示为通过PC机控制管理的外置于PC机的接触式CPU IC卡读写器。通过定制的数据线,该读写器的5V直流电源可直接由键盘口提供,同时数据线还负责PC机与读写器的串行数据交换。在大部分IC卡读写应用中,都涉及到IC卡的认证和数据读写的国解密问题,所以本读写器除了提供一个供用户使用的IC卡接口卡座外,还内置了一个SAM卡,即安全IC卡卡座,以方便安装SAM卡,保证应用IC卡读写时的数据安全,保护用户的利益。
(本网网收集整理)
硬件的其它组成部分,如处理器,目前采用Atmel的89C52。其4KB的Flash程序存储器可以满足读写器的程序空间需要。由于PC机与89C52、89C52与TDA8007的数据交换要求的暂存数据空间比较大,89C52提供的256字节不够,需外加一片数据存储器。本读写器中使用的是华邦的W24257S。其有32KB存储容量,IC接口部分的主要芯片为Philips的TDA8007。
篇6:IC卡接口芯片TDA8007的读写器设计
下面介绍一下TDA8007及其应用。TDA8007的原理结构如图3所示。
TDA8007芯片能够提供两个能同时满足ISO7816标准及EMV和GSM11-11标准的IC卡读写接口。在本读写器中,一个用于与应用IC通信,另一个用于与安全IC卡通信。与上文CPU卡的触点图相对应,CLKi、RSTi、VCCi、I/Oi、GNDCi、PRESi、C4i、C8i(其中i=1,2;C4i、C8i未用;PRESi可用于检测IC卡是否插入。具体应用可参看TDA8007的技术文档)都直接由TDA8007提供给IC卡接口相连,MCU只需通过其接口控制并行通信来管理TDA8007,便可实现对IC卡的上电、下电及读写数据处理。其中,微处理器既可以通过总线复用把TDA8007内部的所有寄存器作为外部存储器,用MOVX寻址,也可以通过非总线复用方式访问,此时TDA8007用AD0~AD3来区分内部各寄存器。另外,TDA8007的片选信号和外部中断信号线可以方便读写器处理多个IC卡头。TDA8007的特别硬件ESD处理、接口短路处理、电源出错处理等也给IC卡和IC卡读写器提供了比较高的安全保护;同时,TDA8007内部集成的电源管理功能允许TDA8007的供电范围可达2.7~6.0V,并且TDA8007通过电源管理可以给IC卡提供5.0V、3.0V及1.8V的电源,以适合不同工作电压的IC卡应用。
图3 IC卡接口芯片TDA8007的原理框图
本读写器是通过总线复用对TDA8007的寄存器进行控制的。其中MCU的P1.5为TDA8007的片选,P0口为与之通信的8位数据线,TDA8007的各寄存器预先被宏定义的成微处理器的一个外部数据单元(下面电程序处的定义),从而方便MCU访问。下面结合TDA8007寄存器的定义和位分配,给出应用TDA8007接口芯片对IC卡进行上电激活和下电的程序。TDA8007的寄存器主要三类。第一类,通用寄存器:①卡槽选择CSR;②硬件状态HSR;③定时器TOR1、TOR2、TOR3。第二类,ISO7816串行处理寄存器:①串行状态USR;②混合状态MSR;③串行发送UTR;④串行接收URR;⑤队列控制FCR。第三类,卡专属寄存器:①可编程分频PDR;②保护时间GTR;③串行控制UCR1、UCR2;④时钟配置CCR;⑤上电控制PCR。注意:对于卡专属的寄存器,即卡接口1、卡接口2分别对应的寄存器,逻辑上具有相同的名及访问地址,因而,对不同的瞳操作,需要通过CSR选择对应的卡槽来切换卡专卡属寄存器的映射的物理空间。所以,接口设备每次从一个卡的上下电或读写转向另一卡,都需要访CSR设定对应的卡槽。对于每个寄存器的位定义不再多述,主动性者可参看TDA8007的.技术文档。
5 上下电过程及具体程序
图4为IC卡的上电时序图。要实现之,需对PCR进行写操作。其中START=PCR.0,RSTIN=PCR.2,VUP上升表示激活了TDA8007中的电压转换电路。当START置高时,只要能检测到选定卡槽中的IC卡存在,且没有TDA8007能检测到并在HSR中指示的硬件错误出现,则对应IC卡接口的VCC1或VCC2将能被提供响应的电平(5V、3V或1.8V)。随后对应卡的I/O数据线被置成高状态(Z状态),给IC卡提供设定的时钟信号,常用为3.5712MHz。大约在START置高108ETU后,RSTIN置高。因为RST为RSTIN的拷贝,则对应卡的RST被置高。然后,用TDA8007提供的定时器TOR3、TOR2设定对ATR(Answer To Request)即复位应答首字节的最大等待时间120ETU(Element Time Unit),TOC设定定时器工作方式,便开始等待ATR首字节到来后做相应处理。至此,IC卡上电激活工作完成,随后可以根据ATR字节的要求的工作方式对IC卡进行相应的读写处理。具体见上电程序。
图4 TDA8007产生满足ISO 7816标准诉IC卡上电激活时序
TDA8007寄存器访问的预定义
#include
#define XXX XBYTE[0x8000]//XXX表示CSR等各寄存器上电程序如下:
P1.5=0; //片选TDA8007
CSR&=0xf8;
CSR|=ncard; //选择卡,ncard=1,2
CSR&=0xf7;
CSR|=0xf7;
CSR|=0x08; //复位UART的寄存器
UCR2&=0xf7; //异步模式,SAN=0
CCR&=0xdf; //时钟停止于低电平
UCR2|=0x60; //关闭附加中断及收发中断
GTR=0xff; //保持时间12ETU
If(v==1) //v为函数变量
PCR|=0x08; //1.8V卡用
else if(v==3)
PCR|=0x02; //3V卡用
Else
PCR&=0xfd; //5V卡用
UCR2&=0xfc; //CKU=PSC=0,--31
FCR=0x00; //1奇偶校验1FIFO
PDR=0x0c; //Divider=12
CCR=0x00; //不分频
PCR&=0xfb; //RSTIN=0
UCR2|=0x04; //不自动转换
UCR1=0x01; //正向约定
UCR1&=0xf7; //接收模式
flag3=0; //复位定时标志
flagatr=0; //接收ATR首字节定时标志
PCR|=0x01; //激活
TOR2=0x6c;
TOR3=0x00;
TOC=0x61; //RST拉高前等待108ETU
while(flag3==0); //定时时间到,在中断中设置flag3=1
TOC=0x00; //关闭定时器
PCR|=0x04; //给复位拉高
TOR2=0x78;
TOR3=0x00;
TOC=0x61; //RST拉高前等待
flagatr=1;
ATR; //复位应答处理函数
图5为IC卡的下电时序图。相对于上电时序,下电过程对时间的要求不是很严格,只要设计者控制TDA8007按照一定的顺序置低START、RSTIN和停止CLK即可,然后TDA8007会自动逐步释放RST、I/O、Vcc及VUP。具体处理见下电程序。
下电程序:
P15=0;
PCR&=0xfe; //START=0;下电
PCR&=0xfb; //卡的复位脚保持0
CCR&=0xdf; //停止时钟于低
CCR|=0x10; //停止时钟
P15=1;
6 使用TDA8007应当注意的问题
TDA8007对于Vcc、RST出错,芯片过热(如图IC卡为电源短路卡或金属片),或IC卡插入拔出时都会产生中断输出。每次中断处理结束,应注意把HSR中的值读入一个临时地址,以便清楚HSR中的标志。
每次发送数据到IC前,即接收IC卡的最后一个数据之前,应设置寄存器UCR1中的LCT位,以便接收完IC卡的数据后,自动切换成发送状态。
对TDA8007部分布线时应注意,时钟信号线与其它线的隔离:最好被地线包围。
对于电路板上TDA8007部分的电容应尽量靠近TDA8007,其中电容Cap、Cbp、Cup尤其如此,并最好不要在这些电容连向TDA8007引脚过程中使用过孔;同时,Cap、Cup、Cbp电容的ESR要尽量小。
对TDA8007处理的两个IC卡座中的任何一个执行上电、下电、读写卡操作之前,必须执行选择卡座的操作函数,以便选中具体的IC卡进行处理。
对IC卡操作中上电时序中的定时,读写卡字节间等待定时等都可使用TDA8007中的定时器及定时控制器操作,注意其定时器为向下计数方式。
结语
本文主要从CPU IC卡的T=0的协议出发,介绍此类IC读写器设计的一些技术问题。值得指出的是,T=0协议仅仅是IC卡与外界数据交换的一种传输协议,只要在软件上适当修改并利用接口芯片TDA8007突出的处理能力,本读写器完全可以实现对其它ISO7816卡、EMV、GSM`11-11卡的读写。
篇7:用CPLD实现单片机读写模块
用CPLD实现单片机读写模块
摘要:介绍实现单片机与Xilinx公司XC9500系列可编程逻辑器件的读写逻辑功能模块的接口设计,以及Xilinx公司的XC9500系列可编程逻辑器件的开发流程。关键词:复杂可编程逻辑电路微处理器在系统编程现场可编程门阵列
1概述
CPLD(复杂可编程逻辑电路)是一种具有丰富的可编程I/O引脚的可编程逻辑器件,具有在系统可编程、使用方便灵活的特点;不但可实现常规的逻辑器件功能,还可实现复杂的时序逻辑功能。把CPLD应用于嵌入式应用系统,同单片机结合起来,更能体现其在系统可编程、使用方便灵活的特点。CPLD同单片机接口,可以作为单片机的一个外设,实现单片机所要求的功能。例如,实现常用的地址译码、锁存器、8255等功能;也可实现加密、解密及扩展串行口等单片机所要求的特殊功能。实现嵌入式应用系统的灵活性,也提高了嵌入式应用系统的性能。
CPLD(复杂可编程逻辑电路)是一种具有丰富的可编程I/O引脚的可编程逻辑器件,具有在系统可编程、使用方便灵活的特点;不但可实现常规的逻辑器件功能,还可实现复杂的时序逻辑功能。把CPLD应用于嵌入式应用系统,同单片机结合起来,更能体现其在系统可编程、使用方便灵活的特点。CPLD同单片机接口,可以作为单片机的一个外设,实现单片机所要求的功能。例如,实现常用的地址译码、锁存器、8255等功能;也可实现加密、解密及扩展串行口等单片机所要求的特殊功能。实现了嵌入式应用系统的灵活性,也提高了嵌入式应用系统的性能。
2Xilinx公司的可编程逻辑器件
Xilinx公司的XC9500系列可编程逻辑器件是一款高性能、有特点的可编程逻辑器件。它的系统结构如图1所示。从结构上看,它包含三种单元:宏单元、可编程I/O单元和可编程的.内部连线。它的主要特点是:
①高性能。在所有可编程引脚之间pin-pin延时5ns;系统的时钟速度可达到100MHz。
②容量范围大。Xilinx公司的XC9500系列可编程逻辑器件的容量范围为36~288个宏单元;可用系统门为800~6400个。
③5V在系统可编程。可以编程10000次。
④具有强大的强脚锁定能力。
⑤每个宏单元都有可编程低功耗模式。
⑥没有用的引脚有编程接地能力。
Xilinx的XC9500系列可编程逻辑器件的主要性能如表1所列。
3CPLD同单片机接口设计
CPLD同单片机接口原理如图2所示。
CPLD同单片机接口设计中,单片机采用Atmel公司的AT89C52,CPLD采用Xilinx公司的XC95216。该CPLD芯片结构及性能见图1和表1。AT89C52通过ALE、CS、RD、WE、P0口(数据地址复用)同XC95216芯片相连接。
表1XilinxXC9500t系列器件
项目XC9536XC9572XC95108XC95144XC95216XC95288寄存器/个3672108144216288可用门数/个8001600240038006400宏单元数/个3672108144216288fPD/ns57.57.57.51010tSU/ns3.54.54.54.56.06.0tCO/ns4.04.54.54.56.06.0fCNT/MHz100125125125111.1111.1fSYSTEM/MHz10083.383.383.366.766.7
注:fCNT=16位计数器最高工作频率;fSYSTEM=整个系统的最高工作效率。
ALE:地址锁存信号。
CS:片选信号。
RD:读信号。
WR:写信号。
AD0~AD7:数据地址复用信号。
本例的设计思想是,在XC95216设置两个控制寄存器,通过单片机对两个控制寄存器的读写来完成对其它过程的控制。
XC95216设置的两个控制寄存器,可以作内部寄存器,也可以直接是映射为I/O口。
图2XC9516同单片机接口原理图
4CPLD同单片机接口设置结果
本例中,使用Xilinx公司提供的FundationISE4.2i+Modelsim5.5f软件实现设计。实现设计的源文件模块如下:
/**************************
//MCU和XC95216接口程序
//目的:MCU读写XC95216
/**************************/
modulemcurw(MCU_DATA,ALE,CS,RD,WE,CONREG1,CONREG2);
inout[7:0]MCU_DATA;//单片机的地址数据复用信号
output[7:0]CONREG1,CONREG2;//内部控制寄存器
inputALE;//单片机的地址锁存信号
inputCS;//单片机的片选信号
inputRD;//单片机的读信号
inputWE;//单片机的写信号
reg[7:0]LAMCU_DATA;//内部控制寄存器
reg[7:0]ADDRESSREG;//内部地址锁存寄存器
reg[7:0]CONREG1;//内部控制寄存器
reg[7:0]CONREG2;//内部控制寄存器
assignMCU_DATA=RD?8'bzzzzzzzz:LAMCU_DATA;
initial//寄存器初始化
begin
LAMCU_DATA<=0;
ADDRESSREG<=0;
CONREG1<=0;
CONREG2<=0;
end
always@(negedge ALE
begin
ADDRESSREG<=MCU_DATA;//地址锁存
End
always@(posedge WE
begin
if(!CS&&ADDRESSREG[0]==0))LAMCU_DATA
<=CONREG1;//从地址为0的CONREG1寄存器读数据
elseif(!CS&&(ADDRESSREG[0]==1))LAMCU_DATA<=CONREG2;
//从地址为1的CONREG2寄存器读数据
elseLAMCU_DATA<=8'bzzzzzzzz;
end
else
LAMCU_DATA<=8'bzzzzzzzz;
End
Endmodule
使用Modelsim5.5f仿真结果如图3和图4所示。图中ALE、CS、RD、WE、MCU_DATA是测试激励源信号,代表AT89C52接口信号;CONREG1和CONREG2的内部寄存器;ADDRESSREG是内部地址锁存寄存器。
图3CONREG1写过程图4CONREG1读过程
图3是CONREG1写过程。首先,在ALE信号的下降沿,锁存MCU_DATA的数据到ADDRESSREG内部地址锁存寄存器。然后,在WE信号的上升沿,把MCU_DATA(0XAA)的数据锁存到寄存器CONREG1。
图4是CONREG1读过程。首先,在ALE信号的下降沿,锁存MCU_DATA(0X00)的数据到ADDRESSREG内部地址锁存寄存器。然后,在RD信号的低电平期间,把MCU_DATA(0XAA)的数据锁存到寄存器CONREG1。
从图3和图4可以看出,对CONREG1寄存器的读、写过程完全满足进序要求,CONREG2的读写过程同CONREG1一样,也完全满足时序要求,实现了期望的功能。
结语
本文实现CPLD与单片机接口设计是笔者设计的高速采样设备的一部分,经实际验证完全正确。简单地修改该模块,笔者已成功地将其应用于多个CPLD或FPGA与单片机接口的项目中。
篇8:用PIC单片机控制DDS芯片AD9852实现雷达跳频系统
用PIC单片机控制DDS芯片AD9852实现雷达跳频系统
摘要:DDS具有分辨率高、转换速度快的优点。在一些需要高频分辨率、设置转换度的应用场合,尤其是雷达及通信系统中的跳频信号源中,DDS技术具有其它频率合成方法无法比拟的优势,是一种很有发展前途的技术。介绍了DDS的基本原理及DDS芯片功能特点以及DDS芯片AD9852的结构、特点,并采用PIC单片机控制AD9852,实现了跳频频率合成器。关键词:DDS频率分辨率转换速度频率合成PIC单片机
在研制雷达系统时,常常需要应用频率合成技术来实现跳频信号源。频率合成是指从一个高稳定的参考频率,经过各种技术处理,生成一系列稳定的频率输出。现在应用最广的是锁相环(PLL)频率合成技术,它是通过变化PLL中的分频比N来实现输出频率的跳频的,但无法避免缩短环路锁定时间与提高频率分辨率的矛盾,因此很难同时满足高速和高精确度的要求。直接数字式频率合成(DDS)是近年发展起来的一种新的频率合成技术。它将先进的数据处理理论与方法引入频率合成领域,是继直接频率合成(DS)和间接频率合成(IS)之后的第三代频率合成技术。DDS的优点是:相对带宽很宽,频率转换时间极短(ns级),频率分辨率很高(可达μHz),全数字化结构便于集成,输出相位连续,频率、相位和幅度均可实现程控。因此能够与计算机紧密结合在一起,充分发挥软件的作用。在实际应用中,可以采用单片机来代替计算机对DDS芯片进行控制,实现合成频率的输出。因此在很短的时间内,DDS得到了飞速的发展和广泛的应用。
1DDS的基本原理
DDS技术是一种把一系列数字量形式的信号通过DAC转换成模拟量形式的信号的合成技术。正弦输出的DDS的原理框图如图1所示。相位累加器在A位频率控制字FCW的控制下,以参考时钟频率fc为采样率,产生待合成信号相位的数字线性序列。将其高P位作为地址码,通过查询正弦表ROM,产生S位对应信号波形的数字序列S(n),再由数/模转换器(DAC)将其转化为阶梯模拟电压波形S(t),最后由低通滤波器LPF平滑为正弦波输出。
频率控制字FCW和时钟频率fc共同决定了DDS输出信号的频率f0,它们之间的关系满足:
f0=(FCW/2A)・fc(1)
所以,在DDS结构及fc确定的前提下,通过FCW的控制就可以方便地控制输出频率f0。其频率分辨率为:
f=f0min=fc/2N(2)
按照Naquist准则,最高输出频率可达0.5fc。但考虑到实际低通滤波器的限制,最高输出频率一般为0.4fc。
由于DAC非线性作用的存在,使得查表所得的幅度序列从DAC的输入到输出要经过一个非线性过程。于就会产生输出信号f0的谐波分量。又因为DDS是一个采样系统,所以这些谐波会fc为周期搬移,即:
f=μfc±vf0(3)
其中,u、v为任意整数。它们落到Nyquist带宽内就形成了有害的杂散频率,频率的位置可以确定,但幅度难以确定。所以在工程设计过程中要充分考虑输出频带,注意避免上述杂散分量落入其中,以此来获得较好的杂散指标。
2DDS芯片介绍
DDS的诸多优点使它得到了非常广泛的应用。在数字调制方面,它可以用来实现FSK、QPSK、8PSK等调制。在转达频率源方面,它可以实现多点、窄步长、高相噪的点频输出的频率源以及线性调频输出频率源。在扩频通信方面,它可实现CDMA工作方式以及多种规律的跳频模式。
现在国外已经有非常成熟的DDS芯片。Qualcomm公司推出了DDS系列Q2220、Q2230、Q2334、Q2240、Q2368,其中Q2368的时钟频率为130MHz,分辨率为0.03Hz,杂散控制为-76dBc,变频时间为0.1μs;美国AD公司也相继推出了他们的DDS系列:AD9850、AD9851、可以实现线性调频的AD9852、两路正交输出的AD9854以及以DDS为核心的QPSK调制器AD9853、数字上变频器AD9856和AD9857。AD公司的产品全部内置了D/A变换器,称为Complete-DDS。其中,AD9852时钟频率为300MHz,近端杂散抑制优于-80dBc,远端优于-48dBc,相位噪声为148dBc/Hz@10kHz,频率跳变速度为130ns,频率分辨率为1μHz。
AD9852主要由48位的频率寄存器、48位相位累加
器、正(余)弦查询表(带正交输出)、幅度调制寄存器、乘法器和12位D/A转换器构成。
AD9852可以实现单频、FSK、Chirp、FMChirp、BPSK等多种输出形式。用其中的Chirp模式和FSK模式可以方便地实现跳频功能,满足雷达跳频系统的要求。使用时只要初始化DDS,设定跳频持续时间和跳频间隔时间即可实现自动跳频。这比以往的DDS芯片如AD9850要方便得多。
AD9852的管脚分为三部分:(1)数据及控制端口;(2)电源部分;(3)参考及输出部分。
由于AD9852是目前市场上性价比较高的DDS器件之一,而且AD9852具有线性调频功能,可以方便实现频率的跳变。所以在雷达跳频系统中最终采用了AD9852芯片。下面就该芯片的应用设计做一简要介绍。
3频率合成器的设计
要让AD9852工作,需要按下列流程初始化:
(1)数据在WR信号控制下从并行输入口D0~D1写入48位并行寄存器,或在SCLK控制下从串行输入口SDATA写入48位串行寄存器。
(2)对S/PSELECT置1或置0以决定输入数据是并行还是串行。1为并行,0为串行。
(3)AD9852芯片内部不带带通滤波器,所以外围电路中应该实际工作需要外接带通滤波器,滤除不需要的频率分量。
利用一片AD9852及简单的外围电路实现频率合成器的结构框图如图2所示。
根据我在设计过程中的实际经验,有以下几个问题需要注意。
3.1单片机的选择
因为AD9852是3.3V系统,所以必须选择可以工作在3.3V的单片机。设计之初,忽略了这个问题,选用了普通51系列芯片,因为其输出电平只能为5V,高于3.3V,DDS芯片因此被损坏。所打算采用51系列,但因为其在市场上很难买到,所以最终采用了Microchip公司的PIC系列单片机PIC16F874。该单片机可以工作在2.2~5.5V的范围内。又考虑到设计要求的高速控制,PIC16F874单片机的速度是51系列的3倍,所以PIC16F874单片机满足设计要求。
3.2单片机的外围电路
DDS的工作电压是3.3V,而PIC的掉电复位电压是4.5V,所以PIC单片机的外围电路需要使用上电复位模式。
3.3要避开DDS杂散较大的输出频点
在实际应用中,还有一些点的杂散信号很大,而且离主频很近,无法去除。所以应该避免输出这些频点。这些频点为靠近fc/3、fc/4、fc/5、fc/6……的频点。
3.4去耦
在一个电子系统中,通常多个器件共用一个电源。而电源线给交流信号提供了一个通路,使得交流信号通过电源线在器件之间传输,形成了干扰。所以必须在器件之间和电源到器件之间的电源线上加入滤波部分,滤掉交流干扰,称为去耦。电源的去耦通常用几个并联电容和串联电感来实现,如图3所示。
3.5接地
接地可以分为单点接地和多点接地。一般认为,连线长度大于信号波长的二十分之一时,应采用多点接地;反之,则采用单点接地。
实现多点接地就要在PCB板上布出一个面积较大地接地面,此接地面又与接大地的屏蔽外壳大面积接触。这样整个地的阻抗很小,电位可以认为是一致的,各器件就近接地,就避免了在线上形成干扰。
在数模混和的电路中,由于数字部分干扰源很多,所以模拟部分易受影响。因此要注意把模拟地和数字地分开。一般的方法是用一根线来连接数字地和模拟地,而且只在一处相连,这样就可以较好地切断数字部分的干扰源。
图4频率合成器的原理图
3.6充分利用DDS的sweetpots
如前所述,在DDS中,其相位累加器的'位数为A,但用来查询正弦表的位数只有其高P位,剩下的就四舍王入丢弃了,这样做会产生一种相位截断误差。但是如果相位累加器中的A-P位恰好为0,其输出频点的特性就会比较好,这就是所谓的“sweetpots”。所以在DDS单点输出时,使DDS尽量在sweetpots频点输出,可以达到优化输出特性的目的。
3.7DDS参考信号输入端的注意事项
由于采用了参考信号单端输入的方式,所以REFCLKB端应该接地或电源;参考信号输入端REFCLK要跟电源相连接。因为DDS的参考信号要求有1.6V的直流电平,在参考信号输入到REFCLK端的端点处,应接一个5.1kΩ的电阻到3.3V直流电源,同时接一个0~10kΩ的可变电阻
(此处取5kΩ)到100Ω的电阻,经过电阻分压,REFCLK端就有1.6V的直流电压。这个0~10kΩ的可调电阻同时用来微调REFCLK端对地的电阻,以调节REFCLK的直流电位,具体情况请参看图4。图4中的II形滤波部分是为了滤除电源对REFCLK端的干扰。该频率合成器原理图如图4所示。
检验证明,利用AD9852设计的频率合成器具有跳频速度快、频率分辨率高、体积小、系统工作稳定、使用方便等优点。因此它有很强的实用价值。
DDS除了用于跳频系统中外,还可以用于任意波形产生、信号调制等。随着高速集成电路的飞速发展,DDS必将开拓更多新的应用领域。
篇9:单片机实现对CF卡的读写
单片机实现对CF卡的读写
摘要:CF卡是一种包含了控制和大容量Flash存储器的标准器件,具有容量大、体积小、高性能、携带方便等优点,已广泛应用在数据采集系统和许多消息类电子产品中。本文详细介绍CF卡在单片机系统中的硬件接口电路,以及单片机对CF卡进行标准文件读写的实现,且写入的文件能被Windows操作系统读写。关键词:CF卡 单片机 FAT文件格式
引言
由于CF卡(Compact Flash Card)具有容量大、体积小、高性能、携带方便等优点,而且读写速度快,可与多种电脑操作系统平台兼容,因此在数据采集系统中的数据记录或与PC机之间的数据转存多采用CF卡。为了在PC机中能方便地进行数据处理,在下位机端必须采用一种标准的格式组织数据,即将数据按照Windows标准文件格式写入,在PC机端通过读卡器将写入CF的内容以标准文件形式读出。Windows标准文件格式有FAT、FAT32和NTFS。考虑到广泛使用的Windows 98系统的CF卡的容量等因素,通常采用FAT(File Allocation Table)文件系统。单片机系统对CF卡的读写,就是从底层对它进行直接操作,包括寻址、创建文件和读写等。(本网网收集整理)
1 CF卡简介
CF卡内集成了控制器、Flash Memory阵列和读写缓冲区,如图1所示。内置的智能控制器,使外围电路设计大大简化,而且完全符合PC机内存卡的国际联合会PCMCIA(Personal Computer Memory Card International Association)和ATA(Advanced Technology Attachment)接口规范。实际上,控制器起到了一种协议转换的作用,即将对Flash Memory的读写转化成了对控制器的访问,这样不同的CF卡都可以用单一的机构来读写,而不用担心兼容性问题。CF卡的缓冲区结构,使得外部设备与CF卡通信的同时,CF卡的片内控制器可以对Flash进行读写。这种设计可以增加CF卡数据读写的可靠性,同时提高数据传输速率。
CF卡支持多种接口访问模式,有符合PCMCIA规范的Memory Mapped模式、I/O Card模式和符合ATA规范的True IDE模式。上电时,OE(9脚)为低电平,CF卡进入True IDE模式,此时引脚OE也叫ATA SEL;上电时,OE(9脚)为高电平,CF卡进入PCMCIA模式,即Memory Mapped模式或I/O Card模式,此时可通过修改配置选项寄存器进入相应的模式。
配置选项寄存器格式如下:
SRESETLevelREQconf5conf4conf3conf2conf1conf0SRESET―软复位信号;
Level REQ―中断模式选择(电平或边沿触发)。
例如,要加入Memory mapped模式,只需要在上电时保证OE为高电平,因为配置选项寄存器的conf5~conf0位的初始化值为“00000”;而要进入I/O Card模式,除了上电时保证OE为高电平外,还要进一步设置conf5~conf0,如表1所列。但是对于具体型号的CF卡而言,下面三种情况也是被CFA(CF card Association)所允许的:①上电时进入True IDE模式,工作过程中,只要监测到OE变为高,就退出True IDE模式;②允许卡在复位时重新配置;③上电时进入PCMCIA模式,允许过程中,只要监测到OE变为低,就进入True IDE模式。
表1 模式选择
conf5conf4conf3conf2conf1conf0模 式000000Memory map000001I/O Mapped,对应16位系统000010I/O,对应1F0h-1F7h/3F6h-3F3h000011I/O,对应170h-177h/376h-377h2 CF卡与51单片机的接口
CF卡在PC Memory方式与51芯片的接口电路如图2所示。由于采用CF卡上电后自动进入的Memory模式,而且不存在对特性寄存器的读写,故可将REG接高电平。片选信号CE1和CE2组合可选择数据位宽度,如表2所列。图2中CE2接VCC,选用的是8位(D7~D0)数据宽度。
表2 数据宽度选择
8位(D7~D0)8位(D15~D8)16位高 阻 CE10101CE21001为了实现即插即用的功能,CE卡上提供了两个用来检测卡是否存在的引脚(CD1、CD2),由卡内部接地。当主机检测到与其相连的CD1和CD2两个引脚同时为低电平时,可判断出卡与主机相连;否则,卡未与主机相连。
由于I/O口紧张,RDY/BSY引脚悬空不用,通过查询状态寄存器能判断CF卡是否准备就绪。在实际应用中,由于一次至少要读写一个扇区512字节,所以要扩充一块RAM。我们选用的是62256,容量为32KB,这样便可以支持大到2GB的CF卡(参见下文),增加了其扩展性。
3 FAT文件系统
FAT文件系统是基于DOS的文件系统。常说的FAT有12位的FAT12和16位的FAT16,另外就是32位的FAT32。考虑到CF卡的容量有限,宜选用FAT16。这里只对FAT文件系统作一简单介绍,更详细的内容请见参考文献。
磁盘的寻址方式有两种:物理寻址C/H/S(柱面/磁头/扇区)方式和逻辑块LBA(Logical Block Addressing)寻址方式。二者之间的转换关系为:
LBA地址=(柱面号×磁头数+磁头号)×扇区数+扇区数-1
采用LBA寻址方式,没有磁头和磁道的转换操作,在访问连续的扇区时,操作速度比物理寻址方式要快,而且也简化了对磁盘的访问。
硬盘的结构布局分为MBR(主引导扇区)和最多4个逻辑分区(含DOS分区或非DOS分区),而在DOS逻辑分区中的磁盘组织如下:
引导扇区FAT1FAT2根目标区数据区引导扇区DBR(DOS Boot Record):位于LBA 0扇区,包含跳转指令、厂商标识和DOS版本号、BPB(BIOS Parameter Block,BIOS参数块)、DOS引导程序、结束标志字AA55。其中BPB包含每扇区字节数、每簇扇区数、每个FAT扇区数、扇区总线、根目录项数等等参数。
FAT是给每个文件分配磁盘物理空间的表格。FAT16簇数的上限是2 16,即65536个,每簇扇区数的上限是64个,因此其分区空间的上限为2G。FAT1位于逻辑1扇区。FAT簇映射中,0000表示空簇,FFF0~FFF6备用,FFF8~FFFF表示簇链结束,FFF7表示坏簇,其余值表示其后续簇的簇号。图3所示的文件起始簇号为2,结束簇号为4,共占用2、3、4三个簇。
簇是存储文件的最小单位,可以包含多个扇区。当文件本身或文件的最后一簇哪怕只有1个字节,也要占去1簇。这样,当这种文件很多时,空间的浪费是很可观的。
文件目录表FDT(File Directory Table)是操作系统寻找文件的入口,其内容是每一个文件的目录。FDT中的每一个目录项由32个字节组成。前8个字节是文件名,不足时用空格填满。紧跟着的3个字节是文件扩展名,接下来是10个字节的系统保留字。然后是文件产生的时刻和日期占8个字节,再后的2个字节是文件首簇号,最后4个字节是文件大小。FDT的起始扇区可由FAT的大小计算出,而FAT的大小可在DBR中读出。
4 软件实现
按照FAT16方式存储文件,是一个通用的`解决方案。因为这样可以得到现有的DOS和Windows系统的支持,但是代价是浪费一部分空间,也就是说存储效率下降了。为了改善这一情况,采用了改进的存储方法。就是先创建一个空文件,并根据需要为其分配一个大的存储空间,写入动作只是从尾部追加数据。这样就避免了很多小文件的产生,既可以充分利用存储空间,又可以使地址连续。
CF卡的读写是通过卡内的缓冲区进行的,不支持直接读写存储区域。缓冲区为一个FIFO结构,读写顺序进行,不支持随机存取,系统只能一次性地按顺序读完或写完所有一个或多个扇区。
设计时使用LBA方式访问CF卡比较方便,读写时只需要先在相应的寄存器写入LBA地址即可。要设定LBA方式,需访问驱动器/磁头寄存器。内存模式下部分寄存器译码如表3所列。
表3 内存模式下部分寄存器译码
REGA10A9~A4A3~A0offsetOE=0WE=010X00000偶字节读侧字节写10X00011错误寄存器特性寄存器10X00102扇区数扇区数10X00113扇区号(LBA7~0)扇区号(LBA7~0)10X01004低柱面号(LBA15~8)低柱面号(LBA15~8)10X01015高柱面号(LBA23~16高柱面号(LBA23~16)10X01106驱动器/磁头(LBA27~24)驱动器/磁头(LBA27~24)10X01117状态寄存器命令寄存器驱动器/磁头寄存器结构如下:
1LBA1DRVHS3HS2HS1HS0LBA―1为LBA方式,0为C/H/S(柱面/磁头/扇区)方式;DRV―选择驱动器0或驱动器1;HS3~HS0―LBA27~24,或为C/H/S方式的磁头号。
文件创建过程也就是针对FAT和FDT的读写过程。首先在FDT中申请表项,创建文件名称、属性、起始簇号、文件大小等,然后修改FAT,分配数据空间,备份FAT。文件存储就是要先从FDT和FAT中获得文件的起始簇号和簇号链,即LBA地址。然后,将此地址送给寄存器3、4、5、6(表3中的offset3、4、5、6),向扇区数寄存器填写读写数据所占的扇区个数,再向CF卡的命令寄存器写入操作的命令字,写操作30H,读操作20H。当写入命令或写入数据后要查询状态寄存器的状态,以判定CF卡是否准备就绪或写入成功。状态寄存器结构如下:
BUSYRDYDWFDSCDRQCORR0ERR各位的值为1时含义如下:
BUSY―CF卡记,此时不能接受其它命令;
RDY―卡可以接受命令;
DWF―写错误;
DSC―卡准备就绪;
DRQ―CF卡请求数据传送;
CORR―数据错误但被修正,不会终止多扇区读操作;
ERR―在上一命令以某种错误结束,可以在错误寄存器中查看错误类型。
下面以向CF卡写一个扇区数据为例,给出图4所示流程和C程序代码。
bit flag_1,flag_2;
void cfwr
{
unsigned char status;
cfwr_comm(0xe0,0x00,0x00,0x6c);
//写参数命令,指向逻辑6c扇区
do{status=PBYTE[0x07]; //读状态寄存器
if((status & 0x01)==0x01)
flag_1=1; //若ERR=1,置出错标志,做相应处理
while(status!=0x58);
cfwr_dat(); //写入数据
do{status=PBYTE[0x07]; //读状态寄存器
if((status & 0x20)==0x20)
flag_2=1; //若DWF=1时,置出错标志,做相应处理
while(status!=0x50);
}
void cfwr_comm(unsigned char lba27,lba23,la15,lba7) //写参数命令函数
{PBYTE[0x02] 扇区数为1
PBYTE[0x03]=lba7;
PBYTE[0x04]=la15;
PBYTE[0x05]=lba23;
PBYTE[0x06]=lba27; //设定LBA方式
PBYTE[0x07]=0x30; //送写入命令30H
}
void cfwr_dat() //写数据函数
{unsigned int i,temp;
unsigned char xdata dat[512]; //dat[]存放一个扇区的数据
for (i=0;i<512;i++) //连续写512字节
{P1=P1 & 0xf8; //选中外部RAM
temp=dat[i];
P1++; //根据实际电路选择中CF卡
PBYTE[0x00]=temp;}
}
5 结论
笔者在湿度检测仪中,根据本文所介绍的方法,用CF卡向计算机转存数据,可以非常方便地对数据进行维护。
篇10:用PICC编译器开发PIC系列单片机的代码
用PICC编译器开发PIC系列单片机的代码
摘要:介绍PIC系列单片机C语言的发展;以HI-TECH Software公司的HI-TECH PICC为例,介绍PICC编译器的特点和用其开发PIC系列单片机时应注意的一些问题。关键词:PIC PICC编译器 C语言/汇编语言 Hi-Tech
引言
目前,在市场上应用最广泛的应该属于8位单片机,Microchip Technoloogy公司推出的8位PIC系列单片机,目前在国内市场上深受用户欢迎,已经逐渐成为单片机应用的新潮流;但遗憾的是,目前国内介绍它的C语言开发工具的书籍和文章却比较少,而且用的人也不多,广大的程序员在用其开发的过程中都在慢慢摸索,可能会走一些弯路。笔者最近在用PIC的C语言时就遇到了好些问题,在这里想和最近一段时间用PIC的C语言的一些经验和广大的底层软件程序员做一下交流和介绍希望本文对用PICC开发PIC系列单片机的人有所帮助。
目前,在国内用得比较多的是Hi-Tech的Hi-Tech PICC编译器,而且目前市场上一些国内的PIC单片机仿真器也开始支持Hi-Tech PICC编译格式;因此,本文主要以Hi-Tech的PICC为基础,介绍一下PIC的C语言的基本特点。
1 Hi-Tech PICC的C语言开发工具的语言特点
PICC的C语言按ANSI C来定义,并进行了C语言的扩展。PICC和ANSI C有一个根本的区别就是,PICC不支持函数的递归调用。这是因为PIC单片机的堆栈大小是由硬件决定的,资源有限,所以不支持递归调用。它的数据也遵从标准C的数据结构,PICC的数据结构是以数据类型的形式出现的。PICC编译器支持的数据类型有位类型(bit)、无符号字符(unsigned char)、有符号字符(signed char)、无符号整型(unsigned int)、有符号整形(signed int)、无符号长整型(unsigned long)、有符号长整型(signed long)、浮点(float)和指针类型等。需要注意的是,PICC支持的多字节数据都采用低字节在前,高字节在后的原则。即一个多字节数,比如int型,在内存单元中存储顺序为低位字节存储在地址低的存储单元。高位字节存储在地址高的存储单元中,程序员在用union定义变量时一定要注意这一特点。
PIC的C语言变量分为局部变量和全局变量,所有变量在使用前必须先定义后使用。全局变量是在任何函数之外说明的、可被任意模块使用的、在整个程序执行期间都保持有效的变量。局部变量在函数内部说明。局部变量有两种:自动变量和静态变量。缺省类型为自动变量,除非明确将其声明为静态变量。而且,所有的自动变量都被分配在寄存器页0,所以bank限定词不能用于自动变量,便可以用于静态的局部变量。当程序退出时,自动变量占用的空间释放,自动变量也就失去意义。静态变量是一种局部变量,只在声明它的函数内部有效;但它占用固定的存储单元,而这个存储单元不会被别的函数使用,因此其它函数可以通过指针访问或修改静态变量的值。静态变量在程序开始只初始化一次,因此若只在某函数内部使用一变量,而又希望其值在2次函数调用期间保持不变,为实现程序模块化,则可将其声明为静态变量。例如以下声明中,有些为合法,有些为非法:
void max(void)
unsigned char var1; //合法声明
unsigned char bank1 var2; //非法声明
static unsigned char bank1 ver3; //合法声明
unsigned char var4=0x02; //合法声明,每次调用都初始化
static unsigned char bank1 var5=0x02; //合法声明,但只初始化一次
…………
}
PICC编译器对局部变量及传递参数使用RAM覆盖技术。编译时,连接器会自动把一些不可能被同时调用的函数的自动变量区重叠在一起,以达到内存的高效利用,因此其内部RAM的利用效率非常高。
2 函数调用时参数的传递
PICC函数参数的传递是根据被传参数的长度,用W、被调函数的自动变量区域或被调函数的参数区域传递,传递代码比较高效。传递给函数的参数可以通过一个由问号“?”、下划线“_”及函数名加一个偏移量构成的标号获取。下面为一调用求和子程序的源泉代码:
Unsigned char add_function(unsigned char augend,unsigned char addend);
Void main(void)
{
unsigned char temp1,temp2,temp3;
tem3=add_function(temp1,temp2);
}
unsigned char add_function(unsigned char augend,unsigned char addend)
{
return(augend + addend);
}
编译后生成的汇编程序为:
_main
; _temp2 assigned to?a_main+0
;_temp3 assigned to ?a_main+1
; _temp1 assigned to ?a_main+2
bcf status,5
bcf status,6
movf (((?a_main+0))),w
movwf(((?_add_function)))
movf (((?a_main+2))),w
fcall (_add_function)
movwf(((?a_main+1)))
_add_function
; _augend assigned to ?a_add_function+0
; _augend stored from w
bcf status,5
bcf status,6
movwf(((?a_add_function+0)))
movf (((?a_add_function+0))),w
addwf (((?_add_function+0))),w
return
3 PICC语言和汇编语言的混合编程
一般情况下,主程序都是用C语言编写的。C语言与汇编语言最大的区别在于,汇编程序执行效率较高,因为,C语言首先要用C编译器生成汇编代码,在不少情况下,C编译器生成的'汇编代码不如用手工生成的汇编代码效率高。在PICC中,可以用两种方法在C程序中调用汇编程序。一种方法是使用#asm,#endasm及asm()在C语言中直接嵌入汇编代码,#asm和#endasm指令分别用于标示嵌入汇编程序块的开头和结属;asm()用于将单条汇编指令嵌入到编译器生成的代码中,如下所示:
void func1(void){
asm(“NOP”);
#asm
nop
rlf_var,f
#endasm
asm(“rlf_var,f”);
}
需要注意的是,嵌入汇编不是完整意义上的汇编,是一种伪汇编指令,使用时必须注意它们与编译器生成代码之间的互相影响。
另一种方法是将汇编作为一个独立的模块,用汇编编译器(ASPIC)生成目标文件,然后用链接器和C语言生成的其它模块的目标文件链接在一起。如果变量要公用时,则在另一个模块中说明为外部类型,并允许使用形式参数和返回值。
例如,如果在C模块中使用汇编模块中的函数,那么在C中可知下声明:
extern char rotate_left(char);
本声明说明了要调用的这个外部函数有一个char型形式参数,并返回一个char型的值。而rotate_left()函数的真正函数体在外部可以被ASPIC编译的汇编模块(文件名后缀.as)中,具体代码可以如下编写:
processor16C84
PSECT text0,class=CODE,local,delta=2
GLOBAL _rotate_left
SIGNAT _rotate_4201
_rotate_left
movwf?a_rotate_le
ft
rlf?a_rotate_left,w
return
FNSIZE _rotate_left,1,0
GLOBAL?a_rotate_left
END
需要注意的是,以C模块中声明的函数名称,在汇编模块中是以下划线开头的。GLOBAL定义了一个全局变量,也等同于C模块中的extern,SIGNAL强制链接器在链接各个目标文件模块时进行类型匹配检查,FNSIZE定义局部变量和形式参数的内存分配。
这种方法比较麻烦,如果对某一模块的执行效率要求较高时,可以采取这种办法;但是,为了保证汇编程序能正常运行,必须严格遵守函数参数传递和返回规则。当然,为避免这些规则带来的麻烦,一般情况下,可以先用C语言大致编写一个类似功能的函数,预先定义好各种变量,采用PICC-S选项对程序进行编译,然后手工优化编译器产生的汇编代码后将其作为独立的模块就可以了。
4 注意事项
使用PICC时,为了更有效地利用资源,应注意以下几点:
①尽量使用无符号数和字节变量。
②在寄存器资源允许的情况下,对某些执行效率要求较高的平级元相互调用函数中用到的内部变量,可将其定义为全局临时变量,编程时覆盖使用,这样可减少很多编译代码。而对于中断函数内部用到的变量,可用全局变量。
③对于有一定汇编经验的人在开始使用PICC时,应多注意观看编译后产生的汇编源代码,并经常观看经正确编译链接后产生的映像文件(.MAP文件)。在该文件中,详细列出了分配给变量和代码的地址和生成代码的大小等信息。使用者可了解代码是否优化,变量分配是否合理,堆栈是否溢出等,从而写出高效简洁的C源代码。
④在很多情况下,PICC不支持类型强制转换。即在类型不匹配时须查验编译后的汇编代码,看是否正确,尤其是对指针操作的时候一定要注意。
⑤对某位变量自操作时,比如求反,不可以直接简写,例如:!flag;编译后不能正确产生代码,而须写成:“flag=!flag;”
⑥尽量选择全局优化编译选项。为保证寄存器页(包括程序存储期页面和RAM寄存器页)的正确转换,PICC的编译代码中有大量的变换寄存器页的代码,选择全局优化PICC会优化去大量有关RP0、RP1、PCLAPH所增加的变换代码,从而加快程序执行速度,并节省大量的程序空间。
⑦若有某一代码很短的函数被多个函数经常调用,最好将其定义为宏。因为若函数代码很短时,由于被调函数和调用函数不在同一代码页所产生的附加代码可能都会超过函数代码本身的长度。
5 结论
PICC编译器产生的代码在有些时候虽然比较繁琐,但结构和逻辑性很强,开发效率大大提高,调试与维护都很方便。不论是从程序的开发速度、软件质量还是从程序的可维护性和可移植性上讲,PICC的优点绝非汇编语言所能比拟的。
用VC++6.0实现PC机与单片机之间串行通信的方法.net