打印

FM1702sl怎么不能多卡激活的呀

[复制链接]
5219|24
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 天道酬勤dw 于 2012-8-10 19:39 编辑

最近用复旦微电子的FM1702做射频识别,不知道怎么可以让它支持多卡操作,我加入了防冲撞算法,但是始终读出来的都是同一张卡,我昨天看了ISO1443协议,我看到WAKE-UP命令才能读取HALT状态的卡,而REQA只能读取IDEL状态的卡。我用FM1702把操作完的卡设置到HALT状态,我发现用REQA还是能读,求指点,难道是芯片不支持吗

相关帖子

沙发
天道酬勤dw|  楼主 | 2012-8-10 14:40 | 只看该作者
大家帮帮忙呀

使用特权

评论回复
板凳
天道酬勤dw|  楼主 | 2012-8-11 15:09 | 只看该作者
有没人帮忙呀

使用特权

评论回复
地板
qq65411253| | 2012-8-12 09:42 | 只看该作者
1、可能是你的halt命令用错了,比如省掉了假地址。导致卡没有真正的执行halt。
2、发送halt命令后要留一点时间给卡运行halt过程,大概0.1ms足够。另外发送命令给卡也是需要时间的,2*8bit/106k=0.15ms。

使用特权

评论回复
5
天道酬勤dw|  楼主 | 2012-8-12 11:25 | 只看该作者
4# qq65411253
uchar MIF_Halt(void)
{
uchar temp;
uint i;
SPIWrite(CRCPresetLSB,0x63);
SPIWrite(CWConductance,0x3f);
SPIWrite(ChannelRedundancy,0x03);
*RevBuffer = RF_CMD_HALT;
*(RevBuffer + 1) = 0x00;
temp = Command_Send(2, RevBuffer, Transmit);
if(temp == TRUE)
{
  for(i = 0; i < 0x50; i++)
  {
   _nop_();
  }
  return FM1702_OK;
}
else
{
  temp = SPIRead(ErrorFlag);
  if((temp & 0x02) == 0x02)
  {
   return(FM1702_PARITYERR);
  }
  if((temp & 0x04) == 0x04)
  {
   return(FM1702_FRAMINGERR);
  }
  return(FM1702_NOTAGERR);
}
}
返回值是正确的,但我发现用REQA0x26还是能读,帮我看看HALR命令有没错

使用特权

评论回复
6
qq65411253| | 2012-8-12 20:01 | 只看该作者
发送命令前必须先检查fm1702的空闲状态以防止前面的命令没有执行完,而且还要清空fifo。这个是执行每个命令前都要先做的。你的函数看不到这个过程。另外这个地方:SPIWrite(ChannelRedundancy,0x03);的0x03要改为0x07。前提是你的芯片如标题所说是fm1702sl而不是其他型号。
如果你改了0x07后程序正常,最好还是加上上述两个过程以减少bug。
虽然你的返回值正确,但是只能说明你的函数执行正常。halt命令是无法确认的。一般来说只要halt序列执行正确就一定会halt。

使用特权

评论回复
7
qq65411253| | 2012-8-12 20:03 | 只看该作者
另外,这个地方: for(i = 0; i < 0x50; i++)
  {
   _nop_();
  }
延时时间无法确定,你得保证足够让卡能完成halt。

使用特权

评论回复
8
天道酬勤dw|  楼主 | 2012-8-13 10:51 | 只看该作者
7# qq65411253
我改了0x07还是不行,HALR函数前后都加了延时,还是不行,每次值行命令都有清空FIFO,我把整个程序打包到附件,帮我看看哪里有问题好吗,谢谢! slave.zip (86.45 KB)

使用特权

评论回复
9
qq65411253| | 2012-8-13 12:57 | 只看该作者
你的main函数当中没有寻卡、选卡、认证这个过程,直接halt是不行的。
如果你已经完成上述过程了还不能halt,可能是你的restore命令和transfer命令没有配对。有些卡要求两个命令配对使用,否则无法halt(特别是达华的卡)。
fm1702的编程手册有很多问题,虽然能工作,但往往会埋下一些很难察觉的bug。要修改了才能用,切忌照搬。

使用特权

评论回复
10
天道酬勤dw|  楼主 | 2012-8-13 16:39 | 只看该作者
9# qq65411253

开始我没有使用restore命令和transfer命令,后来我加了,还是不行。读卡写卡都没问题,就是不能HALT,就没办法让他读多张卡出来。程序我已经打包在上面了,能帮我看看吗?

使用特权

评论回复
11
qq65411253| | 2012-8-13 16:51 | 只看该作者
程序我看了,你的程序没有寻卡、选卡、认证这个过程,直接就halt了。这个是行不通的。

使用特权

评论回复
12
天道酬勤dw|  楼主 | 2012-8-13 19:05 | 只看该作者
11# qq65411253
有的,HL_Read(RevBuffer,8);这个函数里就包含了寻卡、选卡、认证加读卡。这个函数在FM1702.c这个文件中。1702所的底层函数都在里面

使用特权

评论回复
13
qq65411253| | 2012-8-13 19:40 | 只看该作者
你的HL_Read(RevBuffer,8)函数最前面两句如下。
uchar        temp;
temp = HL_Active(Block_Adr);

而你的HL_Active(Block_Adr);最前面几句如下。
uchar        status,Sector;
Sector = Block_Adr / 4;
status=MIF_Halt();        /* Halt */

根本没有寻卡过程,直接就halt了。

使用特权

评论回复
14
天道酬勤dw|  楼主 | 2012-8-13 19:54 | 只看该作者
13# qq65411253 注释掉那个,在主函数HALT也是不行的

使用特权

评论回复
15
qq65411253| | 2012-8-13 20:26 | 只看该作者
我想,你可以检查HL_Read(RevBuffer,8)的返回值,看看是不是fm1702_ok。如果不是的话,估计你的卡没有通过认证。或者看看每一个函数是否都正确的执行了。关键是认证这一步,过了认证就能halt。我估计你认证没过。

使用特权

评论回复
16
qq65411253| | 2012-8-13 20:28 | 只看该作者
另外,HL_Active(Block_Adr);里面的第一个halt最好去掉。由main来控制。人家那是用来防止重复寻卡的。

使用特权

评论回复
17
天道酬勤dw|  楼主 | 2012-8-13 20:42 | 只看该作者
15# qq65411253
返回值都正确,写入数据读出数据我都测试过啦,都正常

使用特权

评论回复
18
qq65411253| | 2012-8-13 21:03 | 只看该作者
认证也OK?我很怀疑你认证没过。如果肯定每一步的返回值都正确,那我就无计可施了。

使用特权

评论回复
19
天道酬勤dw|  楼主 | 2012-8-13 21:16 | 只看该作者
18# qq65411253
我写数据进出,然后读数据出来,都是正确的。读出来的数据跟写进出的都一样的,这样还不算认证成功吗,

使用特权

评论回复
20
qq65411253| | 2012-8-13 22:00 | 只看该作者
如果你读写的数据每次都不一样,而且都成功了。那就肯定是认证成功了。如果还是不能halt,我真的想不出来问题会出在哪里。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

51

帖子

0

粉丝