HY502B RFID Module for PcDuino

by Linksprite in Circuits > Sensors

1808 Views, 19 Favorites, 0 Comments

HY502B RFID Module for PcDuino

HY502B_1.jpg
HY502B is a 14.3 Mhz Near Field RFID module.

For more details you please refer to http://linksprite.com/wiki/index.php5?title=RFID_Reader/Write_Module_B_(SPI_interface)

HY502B use SPI to communication with host. pcDuino provide the SPI API, so that we can use HY502B with pcDuino.

Connection Diagram

HY502B_1.jpg
1.  J1-1 (SCL)  of  HY502B -> D13 of pcDuino
2.  J1-2 (MISO) of  HY502B -> D12 of pcDuino
3.  J1-3 (MOSI) of HY502B -> D11 of pcDuino
4.  J1-4 (NSS) of HY502B -> D10 of pcDuino
5.  J-17 (SIG)  of HY502B -> D9 of pcDuino

Certainly, HY502B’s VCC and GND should be connected to pcDuino

We use a 1602 LCD with I2C interface to display the result.

The connection between LCD and pcDuino is as below:

1.  J1-1(SDA) —> SDA of pcDuino
 2. J1-1(SCL) —>  SCL of pcDuino

Some, LCD’s VCC and GND should be connected to pcDuino.

After connected, power on the pcDuino, we can see the LCD backlight is on, but there is no character display.

Get Arduino API for PcDuino

HY502B_11.jpg
We will use github to get Arduino API for pcDuino.

If your pcDuino do not install git before, we need install it first.

$sudo apt-get install git

Then, we use git to get Arduino API for pcDuino

ubuntu@ubuntu:~$ git clone http://www.github.com/pcduino/c_enviroment


Code

HY502B_11.jpg
HY502B ‘s read code
#include "core.h"
#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(2);
if((cSendByte & 0x80)==0x80) MOSI_1;
else MOSI_0;
cSendByte *= 2;
cRecByte |= (unsigned char)(MISO);
SCL_1;
delayMicroseconds(2);
}
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) ;
}
}
}

You can download the code here: HY502B

HY502B_1.jpg

Modify \test\Makefile:

LIBS=-L../../sample/core -larduino -lspi
INCS=-I../../sample/core/include
TARGET=../../sample/test
OBJS = io_test adc_test pwm_test spi_test adxl345_test HY502B
all: $(OBJS)
@mkdir -p $(TARGET)
@mv $(OBJS) $(TARGET)
io_test: io_test.c
$(CC) $(LIBS) $(INCS) < -o $@
HY502B: HY502B.c
$(CC) $(LIBS) $(INCS) < -o $@
adc_test: adc_test.c
$(CC) $(LIBS) $(INCS) < -o $@
pwm_test: pwm_test.c
$(CC) $(LIBS) $(INCS) < -o $@
spi_test: spi_test.c
$(CC) $(LIBS) $(INCS) < -o $@
adxl345_test: adxl345_test.c
$(CC) < -o $@
clean:
@for i in $(OBJS); do rm -f $(TARGET)/$$i; done


HY502B: HY502B.c is the new added

Open Terminal and compile the library

ubuntu@ubuntu:~$ cd c_enviroment

ubuntu@ubuntu:~/c_enviroment $ make

Run

HY502B_11.jpg

input ”$./HY502B” under test folder

 

Support Fourm:

http://www.pcduino.com/forum

http://linksprite.invisionzone.com

Support mail: support@linksprite.com