查看: 6612|回复: 5

Pcduino测试HY502B读卡应用

[复制链接]
  • TA的每日心情
    郁闷
    2013-6-3 09:22
  • 签到天数: 29 天

    连续签到: 1 天

    [LV.4]偶尔看看III

    发表于 2013-4-26 13:17:56 | 显示全部楼层 |阅读模式
    分享到:
    HY502B模块支持SPI接口,数字电路具有双电压工作模式(TTLCOMS),主要在一些计费系统和身份识别读卡器系统中应用,该系列模块功耗低,工作电压范围2.7v5.5v,能在Arduino下成功读取S50卡的ID信息。现在做更进一步的讨论,把程序代码移植到pcDuino上,通过pcDuino连接HY502B模块看能否实现读卡功能。

    接线方法:

    YHY502B使用SPI接口:
    J1-1(SCL)  —-> pcduino D13
    J1-2(MISO) —-> pcduino D12
    J1-3(MOSI) —-> pcduinoD11
    J1-4(NSS)  —-> pcduino D10
    J1-7(SIG)  —-> pcduino D9

    串口屏使用IIC接口:
    J1-1(SDA) —-> pcduino SDA
    J1-1(SCL) —-> pcduino SCL
    连接好之后可以看到串口屏已经亮了,说明电源正常,此时没有显示文字信息。

    1、打开LXTerminal进入代码目录


    2、编译代码生成可执行文件


    3、运行可执行文件


    4、运行成功之后串口屏上会出现上图文字信息。拿一张S50卡靠近HY502B,可以看到串口屏上出现了卡得ID信息,所以pcDuino连接HY502B实现读卡功能了!


    程序代码:
    1. #include "core.h"
    2. #include "Wire.h"
    3. #include "LiquidCrystal.h"
    4. #include "string.h"
    5. #define uchar unsigned char
    6. #define uint unsigned int
    7. LiquidCrystal lcd(0);

    8. //SPI Bus state definitions
    9. #define SPI_RDY 0xF0 // ready
    10. #define spibusy 0xaa // busy
    11. #define spiread 0xbb // write
    12. #define spiwrite 0xcc // read

    13. #define SCL_0 digitalWrite(13,LOW)
    14. #define SCL_1 digitalWrite(13,HIGH)
    15. #define MISO digitalRead(12)
    16. #define MOSI_0 digitalWrite(11,LOW)
    17. #define MOSI_1 digitalWrite(11,HIGH)
    18. #define NSS_0 digitalWrite(10,LOW)
    19. #define NSS_1 digitalWrite(10,HIGH)
    20. #define SIG digitalRead(9)

    21. #define SUCCESS 0
    22. #define FAILURE 1
    23. uchar g_cReceBuf[10];
    24. uchar ComPWRdwn[] = {0x02, 0x03};
    25. uchar ComAutoSearchCard[] = {0x03, 0x13, 0x01};
    26. uchar ComGetCardSn[] = {0x02, 0x20};
    27. uchar ComHaltCard[] = {0x02, 0x12};

    28. void port_init()
    29. {
    30. pinMode(13,OUTPUT);
    31. pinMode(12,INPUT);
    32. pinMode(11,OUTPUT);
    33. pinMode(10,OUTPUT);
    34. pinMode(9,INPUT);
    35. }

    36. unsigned char SPIRWByte(unsigned char cSendByte)
    37. {
    38. unsigned char i = 8;
    39. unsigned char cRecByte;
    40. while (i--)
    41. {
    42. cRecByte *= 2;
    43. SCL_0;
    44. delayMicroseconds(2);
    45. if((cSendByte & 0x80)==0x80) MOSI_1;
    46. else MOSI_0;
    47. cSendByte *= 2;
    48. cRecByte |= (unsigned char)(MISO);
    49. SCL_1;
    50. delayMicroseconds(2);
    51. }
    52. SCL_1;
    53. return cRecByte;
    54. }

    55. unsigned char spi_cStatus(void)
    56. {
    57. unsigned char cStatus;
    58. NSS_0;
    59. cStatus=SPIRWByte(spibusy);
    60. cStatus=SPIRWByte(0xFF);
    61. NSS_1;
    62. return cStatus;
    63. }

    64. unsigned char SPI_Read(unsigned char *cP)
    65. {
    66. unsigned char cCnt,cStatus;
    67. unsigned char cCheckSum = 0;
    68. for (cCnt=0; cCnt<100; cCnt++)
    69. {
    70. cStatus=spi_cStatus();
    71. if(cStatus==0xF0)
    72. {
    73. cCnt=253;
    74. }
    75. delay(10);
    76. }

    77. if(cCnt==254)
    78. {
    79. NSS_0;
    80. cCnt=SPIRWByte(spiread);
    81. cP[0]=0x01;
    82. for (cCnt=0; cCnt<cP[0]; cCnt++)
    83. {
    84. cP[cCnt] = SPIRWByte(0xFF);
    85. cCheckSum ^= cP[cCnt];
    86. if(cP[0]>32)
    87. {
    88. NSS_1;
    89. return FAILURE;
    90. }
    91. }
    92. cP[cCnt] = SPIRWByte(0xFF);
    93. NSS_1;
    94. if (cCheckSum == cP[cCnt])
    95. {
    96. return SUCCESS;
    97. }
    98. }
    99. return FAILURE;
    100. }

    101. unsigned char SPI_Write(unsigned char *cP)
    102. {
    103. unsigned char i,cStatus;
    104. unsigned char cCheckSum = 0;
    105. NSS_0;
    106. cStatus=SPIRWByte(spiwrite);
    107. for(i=0; i<cP[0]; i++)
    108. {
    109. cCheckSum ^= cP[i];
    110. cStatus=SPIRWByte(cP[i]);
    111. }
    112. cStatus=SPIRWByte(cCheckSum);
    113. NSS_1;
    114. return cStatus;
    115. }

    116. void setup()
    117. {
    118. lcd.begin(16, 2);
    119. lcd.clear();
    120. lcd.print("read card id:");
    121. lcd.setBacklight(HIGH);
    122. port_init();
    123. }

    124. void loop()
    125. {
    126. uchar cStatus,i;
    127. uchar *cPa;
    128. while (1)
    129. {
    130. lcd.setCursor(0,0);
    131. lcd.print("read card id:");
    132. lcd.setCursor(0,1);
    133. lcd.print("no card,waiting.");
    134. if(SIG==LOW)
    135. {
    136. delay(100);
    137. cPa = ComGetCardSn;
    138. SPI_Write(cPa);
    139. delay(100);
    140. cStatus = SPI_Read(g_cReceBuf);
    141. //SPI_Write(ComHaltCard);
    142. lcd.setCursor(0,1);
    143. lcd.print("card ID:");
    144. for(i=2;i<6;i++)
    145. lcd.print(g_cReceBuf[i],HEX);
    146. while(!SIG) ;
    147. }
    148. }
    149. }
    复制代码
    回复

    使用道具 举报

  • TA的每日心情
    奋斗
    2015-9-10 09:01
  • 签到天数: 188 天

    连续签到: 1 天

    [LV.7]常住居民III

    发表于 2013-4-26 13:49:32 | 显示全部楼层
    不错! 支持啊{:soso_e179:}
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2016-8-15 09:30
  • 签到天数: 162 天

    连续签到: 1 天

    [LV.7]常住居民III

    发表于 2013-4-26 14:31:06 | 显示全部楼层
    powerdruy 发表于 2013-4-26 13:50
    我很早之前就实现了

    你用的什么实现的?已经买了pcDuino了吗?还是树莓啊?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    郁闷
    2013-6-3 09:22
  • 签到天数: 29 天

    连续签到: 1 天

    [LV.4]偶尔看看III

     楼主| 发表于 2013-4-26 15:13:23 | 显示全部楼层
    powerdruy 发表于 2013-4-26 13:50
    我很早之前就实现了

    有好的应用告诉大家呀
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    郁闷
    2013-6-3 09:22
  • 签到天数: 29 天

    连续签到: 1 天

    [LV.4]偶尔看看III

     楼主| 发表于 2013-4-26 15:14:31 | 显示全部楼层
    mawenran 发表于 2013-4-26 13:49
    不错! 支持啊

    多多支持
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2015-11-4 08:32
  • 签到天数: 773 天

    连续签到: 1 天

    [LV.10]以坛为家III

    发表于 2013-4-27 08:38:33 | 显示全部楼层
    不错,支持分亨。
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /5 下一条

    手机版|小黑屋|与非网

    GMT+8, 2024-12-20 16:55 , Processed in 0.161403 second(s), 24 queries , MemCache On.

    ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

    苏公网安备 32059002001037号

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.