HY502B模块支持SPI接口,数字电路具有双电压工作模式(TTL和COMS),主要在一些计费系统和身份识别读卡器系统中应用,该系列模块功耗低,工作电压范围2.7v—5.5v。
现在简单介绍下Arduino接HY502B读卡在串口屏上显示ID信息的应用。
HY502B
接线方法:
YHY502B使用SPI接口
J1-1(SCL) —-> Arduino D13
J1-2(MISO) —-> Arduino D12
J1-3(MOSI) —-> Arduino D11
J1-4(NSS) —-> Arduino D10
J1-7(SIG) —-> Arduino D9
串口屏使用IIC接口
J1-1(SDA) —-> Arduino A4
J1-1(SCL) —-> Arduino A5
线路连接好之后,拿一张S50卡贴近HY502B感应区,就会看到串口屏上显示该卡的ID信息了
程序代码如下:
- #include "Wire.h"
- #include "LiquidCrystal.h"
- #include "string.h"
- #define uchar unsigned char
- #define uint unsigned int
- LiquidCrystal lcd(0);
-
- //SPI Bus state definitions
- #define SPI_RDY 0xF0 // ready
- #define spibusy 0xaa // busy
- #define spiread 0xbb // write
- #define spiwrite 0xcc // read
-
- #define SCL_0 digitalWrite(13,LOW)
- #define SCL_1 digitalWrite(13,HIGH)
- #define MISO digitalRead(12)
- #define MOSI_0 digitalWrite(11,LOW)
- #define MOSI_1 digitalWrite(11,HIGH)
- #define NSS_0 digitalWrite(10,LOW)
- #define NSS_1 digitalWrite(10,HIGH)
- #define SIG digitalRead(9)
-
- #define SUCCESS 0
- #define FAILURE 1
- uchar g_cReceBuf[10];
- uchar ComPWRdwn[] = {0x02, 0x03};
- uchar ComAutoSearchCard[] = {0x03, 0x13, 0x01};
- uchar ComGetCardSn[] = {0x02, 0x20};
- uchar ComHaltCard[] = {0x02, 0x12};
-
- void port_init()
- {
- pinMode(13,OUTPUT);
- pinMode(12,INPUT);
- pinMode(11,OUTPUT);
- pinMode(10,OUTPUT);
- pinMode(9,INPUT);
- }
-
- unsigned char SPIRWByte(unsigned char cSendByte)
- {
- unsigned char i = 8;
- unsigned char cRecByte;
- while (i--)
- {
- cRecByte *= 2;
- SCL_0;
- delayMicroseconds(10);
- if((cSendByte & 0x80)==0x80) MOSI_1;
- else MOSI_0;
- cSendByte *= 2;
- cRecByte |= (unsigned char)(MISO);
- SCL_1;
- delayMicroseconds(10);
- }
- SCL_1;
- return cRecByte;
- }
-
- unsigned char spi_cStatus(void)
- {
- unsigned char cStatus;
- NSS_0;
- cStatus=SPIRWByte(spibusy);
- cStatus=SPIRWByte(0xFF);
- NSS_1;
- return cStatus;
- }
-
- unsigned char SPI_Read(unsigned char *cP)
- {
- unsigned char cCnt,cStatus;
- unsigned char cCheckSum = 0;
- for (cCnt=0; cCnt<100; cCnt++)
- {
- cStatus=spi_cStatus();
- if(cStatus==0xF0)
- {
- cCnt=253;
- }
- delay(10);
- }
-
- if(cCnt==254)
- {
- NSS_0;
- cCnt=SPIRWByte(spiread);
- cP[0]=0x01;
- for (cCnt=0; cCnt<cP[0]; cCnt++)
- {
- cP[cCnt] = SPIRWByte(0xFF);
- cCheckSum ^= cP[cCnt];
- if(cP[0]>32)
- {
- NSS_1;
- return FAILURE;
- }
- }
- cP[cCnt] = SPIRWByte(0xFF);
- NSS_1;
- if (cCheckSum == cP[cCnt])
- {
- return SUCCESS;
- }
- }
- return FAILURE;
- }
-
- unsigned char SPI_Write(unsigned char *cP)
- {
- unsigned char i,cStatus;
- unsigned char cCheckSum = 0;
- NSS_0;
- cStatus=SPIRWByte(spiwrite);
- for(i=0; i<cP[0]; i++)
- {
- cCheckSum ^= cP[i];
- cStatus=SPIRWByte(cP[i]);
- }
- cStatus=SPIRWByte(cCheckSum);
- NSS_1;
- return cStatus;
- }
-
- void setup()
- {
- lcd.begin(16, 2);
- lcd.clear();
- lcd.print("read card id:");
- lcd.setBacklight(HIGH);
- port_init();
- }
-
- void loop()
- {
- uchar cStatus,i;
- uchar *cPa;
- while (1)
- {
- lcd.setCursor(0,0);
- lcd.print("read card id:");
- lcd.setCursor(0,1);
- lcd.print("no card,waiting.");
- if(SIG==LOW)
- {
- delay(100);
- cPa = ComGetCardSn;
- SPI_Write(cPa);
- delay(100);
- cStatus = SPI_Read(g_cReceBuf);
- //SPI_Write(ComHaltCard);
- lcd.setCursor(0,1);
- lcd.print("card ID:");
- for(i=2;i<6;i++)
- lcd.print(g_cReceBuf[i],HEX);
- while(!SIG) ;
- lcd.clear();
- }
- }
- }