DIY编程器网

 找回密码
 注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 335|回复: 0
打印 上一主题 下一主题

如何用DSP的GPIO管脚实现与IC卡通信

[复制链接]
跳转到指定楼层
楼主
发表于 2012-1-27 20:16:09 | 只看该作者 回帖奖励 |正序浏览 |阅读模式

  
         
    IC卡可以分为接触式的和非接触式(射频卡),本文主要讨论存储卡和智能卡(CPU卡)这两种接触式IC卡的结构特点和读写操作,详细叙述如何使用DSP的GPIO(通用输入输出)管脚实现与各种IC卡进行通信,并给出了DSP函数实现。

常见与IC卡连接的都是基于单片机的系统,但是某些应用要求IC卡读写终端具有较强的实时运算和控制能力,这时DSP就是最好的选择。以TI公司的C5409为例,它的8根HPI管脚(HD0~HD7)可以配置成GPIO使用,配置方法是在复位时将HPI16管脚置高或者HPIENA管脚置低,这样就可以通过配置DSP内部GPIOCR和GPIOSR两个寄存器来控制这8根GPIO管脚的输出和输入。GPIOCR寄存器的低8位用来控制每个GPIO管脚的方向,若管脚为输出则对应位设为“1”,若为输入则设为“0”(DSP复位后GPIOCR缺省值为“0”,即GPIO管脚默认为输入)。GPIOSR寄存器的低8位用来控制每个GPIO管脚的值,若为输出,向对应位写“1”,则该管脚输出高,写“0”则该管脚输出低;若为输入,则对应位的值为管脚上输入的值,向其写操作无效。



下面给出了控制GPIO的函数(控制低两位GPIO管脚,即HD0和HD1):

#define gpio_dir *(short *)0x3c

#define gpio_val *(short *)0x3d //定义两个寄存器的地址

void gpio_setval(short i,short j) //设置GPIO的输出

{

if(i==0) //控制HD0管脚

gpio_val=gpio_val&0xfffe; //设为0

else if(i==1)

gpio_val=gpio_val|0x0001; //设为1

if(j==0) //控制HD1管脚

gpio_val=gpio_val&0xfffd;

else if(j==1)

gpio_val=gpio_val|0x0002;

wait();

}

void gpio_setdir(short i) //控制GPIO的方向

{

if(i==1)

gpio_dir=gpio_dir|0x0001; //设为输出



else if(i==0)

gpio_dir=gpio_dir&0xfffe; //设为输入

}

short gpio_getval(short i) //读入GPIO的值

{

short j;

if(i==0) j=gpio_val&0x0001;

else if(i==1) j=(gpio_val&0x0002)>>1;

return j;

}

常见的接触式IC卡可以分为存储卡和智能卡(又叫作CPU卡),下面分别介绍DSP如何与这两种卡进行连接通信。
[1] [2] [3] [4]  下一页
         
          [/td]
        [/tr]
      
  
         
   

DSP和存储卡的连接

存储卡只具有简单存储功能,实际上是一片串行EEPROM的IC卡模式,以Atmel公司的AT24C16SC为例,它实质上就是两线串行EEPROM AT24C16,两者接口时序基本一样。存储卡的管脚如图1所示。AT24C16SC同时支持3V和5V,访问速度分别可以达到100Kbps(3V)和400Kbps(5V);内部容量为16Kb,分为128页,每页16字节;双向数据线(SDA)为OD(Open-Drain)驱动,需要加上拉电阻才能正常通信。

存储卡的访问时序为I2C标准时序。首先,正常通信中只有在时钟线(SCL)为低时SDA才可变化,即在SCL为高时,SDA必须保持状态(数据有效期),而在SCL为高时,SDA的变化表示下面两种控制状态:
开始状态:当SCL为高时,SDA由高变低表示一个开始状态,通常任何操作前均需要一个开始状态;
停止状态:当SCL为高时,SDA由低变高表示一个停止状态,通常跟在每个操作后,从而将卡置于等待模式。

在读写中,地址和数据都是按照8位的大小进行传输,接收的一方需要返回一个ACK信号表示确认,这个ACK信号是在第9位的位置返回一个“0”来表示。如在读卡的时候,DSP在收到8位后,在第9个时钟应向卡发送“0”表示收到了正确的数据,同时要求卡继续发送下一个8位数据,如果没有这个ACK信号,则将会中止当前读操作返回等待模式。写卡的时候,卡在收到DSP发送的地址和数据后也应该返回ACK信号以表示收到了正确的命令。开始和停止状态、确认信号时序如图2所示。

一个读写操作的开始需要先发送一个器件地址(device

address)字节,该字节的高4位是“1010”,接着3位是卡的高位地址,如AT24C16SC需要有11位地址(2K字节的大小),高3位地址就是这里来指示,最后1位是读写控制位,若为“1”,则表示后面进行一个读操作,若为“0”,则表示后面进行一个写操作。

写卡操作分为字写和页写。字写时,当发送完器件地址字节(最后1位为“0”指明写操作)后,接着再发送一个字地址(word address)字节,即为卡的低8位地址,然后就可送入一个字节的数据,最后发送停止状态。对于页写时,可以连续发送16个字节后再发送停止状态,需要注意的是,当页写时,低4位地址在卡内部自动递增,当到达页末地址时会自动返回页首地址,所以要正确发送停止状态,否则继续写入的字节就会覆盖原来的数据。

读卡操作分为读当前地址、读任意地址和顺序读几种方式。几种方式大同小异,下面主要介绍读任意地址的操作,另两种方式都较简单。读任意地址时,在发送完器件地址字节(最后1位为“1”指明读操作)后,发送字地址字节,这一过程是装载要读的地址,下面再发送一个器件地址字节(同样最后1位为“1”指明读操作),然后便可从卡读到一个连续8位数据,然后DSP发送停止状态(而不是ACK信号)结束读操作。

通过以上介绍可以看出,DSP与存储卡连接的关键就是如何做出SCL和SDA的时序,也就是I2C时序。用DSP的两根GPIO分别连接存储卡的SCL和SDA,然后同时设置两者的高低关系并且正确改变连接SDA那根GPIO的输入和输出方向,我们就可以解决这个问题。例如,对于图3这个数据有效期的时序,我们可以将两根GPIO依次设置为:“01”、“11”、“01”,需要注意的是,改变状态之间需要插入等待周期,因为DSP的工作时钟很高,其GPIO的改变远高于I2C时序的要求。
上一页  [1] [2] [3] [4]  下一页
         
          [/td]
        [/tr]
      
  
         
   

下面给出一个写卡函数:

short write_ic(short page,short addr,short length,short *buff)

//page-要访的问高3位地址,addr-要访问的低8位地址,length-要写入的数据长度,通常为16,buff-要写入的数据

{

short device_address,ack,i,loop=0;



if(loop>10000)

return 0;

}while(ack!=0);


for(i=0;i=0;i--)

{

temp=10 && bitcount<9)

{

if((tempbit&0x18)!=0)

tempbyte=tempbyte+(1<<(bitcount-1));

bitcount++;

} //组成一个字节

else if(bitcount==9)

{

if((tempbit&0x18)!=0)

parry=1;

else parry=0;

bitcount++;

} //读入校验位

else if(bitcount==10) bitcount++; //保护时间

}

buff[j]=tempbyte;

}

}

shorterrupt void tshort() //定时器中断

{

if(ready==0)

{

if(rw==0)

simdata=gpio_getval();

ready=1;

}

}

上面的程序实现了智能卡的读写协议,余下的就是对卡发送命令即可,关于命令的结构和定义本文不作阐述。上一页  [1] [2] [3] [4]
         
          [/td]
        [/tr]
      
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友 微信微信
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|文字版|手机版|DIY编程器网 ( 桂ICP备14005565号-1 )

GMT+8, 2025-7-27 07:37 , 耗时 0.119268 秒, 19 个查询请求 , Gzip 开启.

各位嘉宾言论仅代表个人观点,非属DIY编程器网立场。

桂公网安备 45031202000115号

DIY编程器群(超员):41210778 DIY编程器

DIY编程器群1(满员):3044634 DIY编程器1

diy编程器群2:551025008 diy编程器群2

QQ:28000622;Email:libyoufer@sina.com

本站由桂林市临桂区技兴电子商务经营部独家赞助。旨在技术交流,请自觉遵守国家法律法规,一旦发现将做封号删号处理。

快速回复 返回顶部 返回列表