PcDuino上測試HY502B讀卡功能

      HY502B模塊前面已經作過簡單介紹,能在Arduino下成功讀取S50卡的ID信息。如今作更進一步的討論,把程序代碼移植到pcDuino上,經過pcDuino鏈接HY502B模塊看可否實現讀卡功能。 git

接線方法相似與Arduino oop

圖片1

YHY502B使用SPI接口: ui

J1-1(SCL)  —-> pcduino D13 spa

J1-2(MISO) —-> pcduino D12 code

J1-3(MOSI) —-> pcduinoD11 blog

J1-4(NSS)  —-> pcduino D10 接口

J1-7(SIG)  —-> pcduino D9 圖片

 

串口屏使用IIC接口: get

J1-1(SDA) —-> pcduino SDA string

J1-1(SCL) —-> pcduino SCL

鏈接好以後能夠看到串口屏已經亮了,說明電源正常,此時沒有顯示文字信息。

 

1、打開LXTerminal進入代碼目錄

圖片2

2、編譯代碼生成可執行文件

圖片3

3、運行可執行文件

圖片4

4、運行成功以後串口屏上會出現上圖文字信息。拿一張S50卡靠近HY502B,能夠看到串口屏上出現了卡得ID信息,因此pcDuino鏈接HY502B實現讀卡功能了!

圖片5

程序代碼:

#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) ;
}
}
}
相關文章
相關標籤/搜索