自己做毕业设计,遇到问题,急呀?(有图)

[复制链接]
 楼主| mhjerry 发表于 2011-5-19 14:43 | 显示全部楼层 |阅读模式
本帖最后由 mhjerry 于 2011-5-19 14:47 编辑

我做的是基于SLE4442卡的读写器设计,但我电路程序搞好后,单片机感觉就是读不出来卡里面的数据?下面有图,我写的主程序是想如果读卡不成功,显示TEST数组,成功显示RecBuf数组,我插入卡后,显示的是RecBuf数组,但竟然是我设定的初始值:aa  bb cc dd,根本不是卡里 的数据,我不知道为什么?
未插入卡时:

插入后:

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
 楼主| mhjerry 发表于 2011-5-19 14:47 | 显示全部楼层

  1. /下面为读例子程序
  2. main()
  3. {
  4. unsigned char code RecBuf[4]={0xdd,0xcc,0xbb,0xaa};  //接收缓冲区,初始化数据
  5. unsigned char ret;          //函数返回值
  6. unsigned char test[4]={0x51,0x80,0x51,0x80};   //读卡不成功,显示数据
  7. do
  8. {
  9.   ret = ReadCm(0x32,4,RecBuf);      //从0地址开始读4个字节
  10.   //读成功返加0,失败返回1
  11.   if(ret==0)           //请在此设置断点查看是否读成功以及读到的数据
  12.   {
  13.   
  14.    Display(RecBuf);
  15.   }
  16.   else
  17.   {
  18.    Display(test);
  19.   }
  20. }while(1);
  21. }

  22. /***************************************************************
  23. 函数名称:ReadCm
  24. 功    能:从主存储器中读出数据块并存入ReadBuf中
  25. 输   入:unsigned char StarAddr --- 开始地址(0 - 255)
  26.     unsigned char ByteNum  --- 要读出的字节数(1 - 256)
  27.     unsigned char *RecBuf  --- 接收数据缓冲区
  28. 输   出: 0 --- 读成功
  29.     1 --- 表示无效卡或者卡损坏
  30. ****************************************************************/
  31. unsigned char ReadCm(unsigned char StarAddr,unsigned char ByteNum,unsigned char *RecBuf)
  32. {
  33. unsigned char i = 0;
  34. if (RstCard() == 1)      /* 使卡复位*/
  35.   return 1;       /* 如果复位失败返回1 */
  36.   
  37. SendCommand(0x30,StarAddr,0x00);  /* 发送读主存命令 */
  38. for(i = 0; i < ByteNum; i++)
  39. {
  40.   *RecBuf = Readchar();       /* 从主存中读出ByteNum个字节并存入RecBuf中 */
  41.   RecBuf++;
  42. }
  43.   return 0;
  44. }

  45. /***************************************************************
  46. 函数名称:Readchar
  47. 功   能:读一个字节
  48. 输   入: 无
  49. 输   出:所得的字节的值
  50. ****************************************************************/
  51. unsigned char Readchar(void)
  52. {
  53. CLK = 0; Delay5Us(); mybit0 = IO; CLK = 1; Delay5Us(); //一个脉冲接收1 bit
  54. CLK = 0; Delay5Us(); mybit1 = IO; CLK = 1; Delay5Us(); //一个脉冲接收1 bit
  55. CLK = 0; Delay5Us(); mybit2 = IO; CLK = 1; Delay5Us(); //一个脉冲接收1 bit
  56. CLK = 0; Delay5Us(); mybit3 = IO; CLK = 1; Delay5Us(); //一个脉冲接收1 bit
  57. CLK = 0; Delay5Us(); mybit4 = IO; CLK = 1; Delay5Us(); //一个脉冲接收1 bit
  58. CLK = 0; Delay5Us(); mybit5 = IO; CLK = 1; Delay5Us(); //一个脉冲接收1 bit
  59. CLK = 0; Delay5Us(); mybit6 = IO; CLK = 1; Delay5Us(); //一个脉冲接收1 bit
  60. CLK = 0; Delay5Us(); mybit7 = IO; CLK = 1; Delay5Us(); //一个脉冲接收1 bit

  61. return(ibase);  //返回读得的一个字节
  62. }

  63. /***********************************************************
  64. 函数名称:RstCard
  65. 功    能:使IC卡SLE4442复位
  66. 输   入:无
  67. 输   出:0 --- 复位成功
  68.        1 --- 复位失败,卡为无效卡或卡已损坏
  69. ************************************************************/
  70. unsigned char RstCard(void)
  71. {
  72. unsigned char i;
  73. unsigned char ReadBuf[4];
  74. IO  = 1;    //IO  引脚置高电平   
  75. RST = 0;    //RST 引脚置低电平
  76. CLK = 0;    //CLK 引脚置低电平
  77. Delay10Us();   //下面在一个RST脉冲期间产生一个CLK脉冲
  78. RST = 1;
  79. Delay5Us();
  80. CLK = 1;
  81. Delay5Us();
  82. CLK = 0;
  83. Delay5Us();
  84. RST = 0;
  85.        //接收复位响应值
  86. for(i = 0; i < 4; i++)
  87. {
  88.   ReadBuf = Readchar();
  89. }
  90. CLK = 1;
  91. Delay5Us();  
  92. CLK = 0;  
  93. IO  = 1;     //置CLK和IO为复位时序图复位完成时的状态  

  94. if ((ReadBuf[0] == IDENTIFY1) && (ReadBuf[1] == IDENTIFY2) &&
  95.      (ReadBuf[2] == IDENTIFY3) && (ReadBuf[3] == IDENTIFY4))
  96. {
  97.   return 0;   //复位值正确,返回复位成功
  98. }
  99. else
  100. {
  101.   return 1;   //复位值错误,返回复位失败
  102. }  
  103. }

  104. /************************************************************
  105. 函数名:SendCommand
  106. 功  能:根据不同的参数把命令字发给IC卡
  107. 参  数:unsigned char command  --- 命令字;
  108.   unsigned char Address  --- 地址;
  109.   unsigned char senddata --- 数据
  110. 返回值:无
  111. *************************************************************/
  112. void SendCommand(unsigned char command,unsigned char Address,unsigned char senddata)
  113. {
  114. IO  = 1;   /*产生开始状态*/
  115. CLK = 0;
  116. Delay5Us();
  117. CLK = 1;
  118. Delay10Us();
  119. IO = 0;
  120. Delay10Us();
  121. CLK = 0;
  122.       /*发送命令*/
  123. SendByte(command);
  124. SendByte(Address);
  125. SendByte(senddata);
  126.       /*产生停止状态*/
  127. CLK = 0;
  128.   IO  = 0;
  129. Delay5Us();
  130. CLK = 1;
  131. Delay5Us();
  132. IO  = 1;
  133. Delay5Us();
  134. }
huangqi412 发表于 2011-5-19 16:46 | 显示全部楼层
看图片难道是IIC接口的那种老式电话卡,如果是的话,
以前读过。
LZ去网上找找,有相关资料的。
 楼主| mhjerry 发表于 2011-5-19 18:25 | 显示全部楼层
3# huangqi412
是的,是接触式IC卡~我的研究了快一个月了,就这个读写程序感觉比较靠谱,但不知为啥主程序显示读卡成功了,但数组里就是没有卡里的值呀?
 楼主| mhjerry 发表于 2011-5-20 16:43 | 显示全部楼层
程序感觉没问题呀?有没有高手做过这个卡的?求解释呀!这个调试不过,我论文不好朝下写了,现在不知怎么办了!找老师,老师来了句:“自己动手,不提供技术指导,失败再尝试。。。”
abin0415 发表于 2011-5-20 18:45 | 显示全部楼层
估计老师也不太会吧
funfactory 发表于 2011-5-21 02:21 | 显示全部楼层
楼主,你在二楼的文字效果是怎么做出来的啊!!
比我以前直接复制黏贴帅多啦!!!
分享一下啊!!、
 楼主| mhjerry 发表于 2011-5-21 10:33 | 显示全部楼层
点击插入代码即可!
 楼主| mhjerry 发表于 2011-5-22 19:17 | 显示全部楼层
终于可以读出数据啦:lol 程序里一个细节自己没注意,嗨,让我郁闷了几天,不过还好,让我对卡的读写时序又研究了一遍~

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
zgy_1218 发表于 2012-6-4 14:11 | 显示全部楼层
读卡不成功,不知道为什么
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:本人回复,均代表个人观点。 个人经验不错,如有错误,敬请指教!

0

主题

103

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部