alt rfid driver

This commit is contained in:
2021-10-27 22:07:48 +02:00
parent 2022eec0f1
commit f70b64b793
6 changed files with 113 additions and 76 deletions

View File

@@ -2,19 +2,22 @@
#include "SPI.h" #include "SPI.h"
// Write command to the CR95HF // Write command to the CR95HF
void CR95HF::writeCmd(unsigned short cmd, unsigned short dataLen) { void CR95HF::writeCmd(unsigned short cmd, unsigned short dataLen)
{
unsigned short i = 0; unsigned short i = 0;
digitalWrite(CS, LOW); digitalWrite(CS, LOW);
SPI.beginTransaction(SETTINGS); SPI.beginTransaction(SETTINGS);
SPI.transfer(0x00); // Send cmd to CR95HF SPI.transfer(0x00); // Send cmd to CR95HF
SPI.transfer(cmd); SPI.transfer(cmd);
SPI.transfer(dataLen); SPI.transfer(dataLen);
while (dataLen == 0) { while (dataLen == 0)
{
digitalWrite(CS, HIGH); digitalWrite(CS, HIGH);
break; break;
} }
for (i = 0; i < dataLen; i++) { for (i = 0; i < dataLen; i++)
{
SPI.transfer(sdata[i]); SPI.transfer(sdata[i]);
} }
SPI.endTransaction(); SPI.endTransaction();
@@ -22,10 +25,12 @@ void CR95HF::writeCmd(unsigned short cmd, unsigned short dataLen) {
} }
// Poll the CR95HF // Poll the CR95HF
void CR95HF::readCmd() { void CR95HF::readCmd()
{
unsigned short i = 0; unsigned short i = 0;
while (1) { while (1)
{
digitalWrite(CS, LOW); digitalWrite(CS, LOW);
SPI.beginTransaction(SETTINGS); SPI.beginTransaction(SETTINGS);
SPI.transfer(0x03); SPI.transfer(0x03);
@@ -33,7 +38,8 @@ void CR95HF::readCmd() {
SPI.endTransaction(); SPI.endTransaction();
digitalWrite(CS, HIGH); digitalWrite(CS, HIGH);
if ((res & 0x08) >> 3) { if ((res & 0x08) >> 3)
{
digitalWrite(CS, LOW); digitalWrite(CS, LOW);
SPI.beginTransaction(SETTINGS); SPI.beginTransaction(SETTINGS);
SPI.transfer(0x02); SPI.transfer(0x02);
@@ -52,7 +58,8 @@ void CR95HF::readCmd() {
} }
// Initialize MCU and peripherals // Initialize MCU and peripherals
void CR95HF::begin() { void CR95HF::begin()
{
// Configure GPIO pins // Configure GPIO pins
// if (SSI_0 != -1) // if (SSI_0 != -1)
// pinMode(SSI_0, OUTPUT); // pinMode(SSI_0, OUTPUT);
@@ -80,10 +87,11 @@ void CR95HF::begin() {
delay(1); delay(1);
Serial.println("RFID init: init SPI"); Serial.println("RFID init: init SPI");
SPI.begin(SCK,MISO, MOSI); SPI.begin(SCK, MISO, MOSI);
Serial.print("RFID init: Wait for response"); Serial.print("RFID init: Wait for response");
while (!EchoResponse()) { // Until CR95HF is detected while (!EchoResponse())
{ // Until CR95HF is detected
if (IRQ_IN != -1) if (IRQ_IN != -1)
digitalWrite(IRQ_IN, HIGH); digitalWrite(IRQ_IN, HIGH);
delay(10); delay(10);
@@ -93,7 +101,7 @@ void CR95HF::begin() {
Serial.print("."); Serial.print(".");
} }
Serial.println("ok"); Serial.println("ok");
Serial.printf("RFID init: Serial=%s\n", readSerial()); Serial.printf("RFID init: Serial=%s\n", readSerial());
Calibration(); Calibration();
IndexMod_Gain(); IndexMod_Gain();
@@ -102,40 +110,49 @@ void CR95HF::begin() {
} }
// Get Echo reponse from CR95HF // Get Echo reponse from CR95HF
char CR95HF::EchoResponse() { char CR95HF::EchoResponse()
{
digitalWrite(CS, LOW); digitalWrite(CS, LOW);
SPI.beginTransaction(SETTINGS); SPI.beginTransaction(SETTINGS);
SPI.transfer(0x00); // Send cmd to CR95HF SPI.transfer(0x00); // Send cmd to CR95HF
SPI.transfer(ECHO); SPI.transfer(ECHO);
SPI.endTransaction(); SPI.endTransaction();
digitalWrite(CS, HIGH); digitalWrite(CS, HIGH);
Serial.println("send echo");
while (1) { while (1)
{
digitalWrite(CS, LOW); digitalWrite(CS, LOW);
SPI.beginTransaction(SETTINGS); SPI.beginTransaction(SETTINGS);
SPI.transfer(0x03); SPI.transfer(0x03);
tmp = SPI.transfer(0); tmp = SPI.transfer(0);
SPI.endTransaction(); SPI.endTransaction();
digitalWrite(CS, HIGH); digitalWrite(CS, HIGH);
Serial.printf("rfid: received %x\n",tmp);
if ((tmp & 0x08) >> 3) { if ((tmp & 0x08) >> 3)
{
digitalWrite(CS, LOW); digitalWrite(CS, LOW);
SPI.beginTransaction(SETTINGS); SPI.beginTransaction(SETTINGS);
SPI.transfer(0x02); SPI.transfer(0x02);
tmp = SPI.transfer(0); tmp = SPI.transfer(0);
SPI.endTransaction(); SPI.endTransaction();
digitalWrite(CS, HIGH); digitalWrite(CS, HIGH);
if (tmp == ECHO) { if (tmp == ECHO)
{
Serial.println("receive echo");
return 1; return 1;
} }
Serial.printf("no echo, received %x\n",tmp);
return 0; return 0;
} }
} }
} }
// Calibrate CR95HF device // Calibrate CR95HF device
void CR95HF::Calibration() { void CR95HF::Calibration()
{
sdata[0] = 0x03; sdata[0] = 0x03;
sdata[1] = 0xA1; sdata[1] = 0xA1;
sdata[2] = 0x00; sdata[2] = 0x00;
@@ -274,45 +291,52 @@ void CR95HF::Calibration() {
} }
// Get CR95HF chip ID // Get CR95HF chip ID
char* CR95HF::readSerial() { char *CR95HF::readSerial()
{
writeCmd(IDN, 0); writeCmd(IDN, 0);
readCmd(); readCmd();
for (j = 0; j < dataNum; j++) { for (j = 0; j < dataNum; j++)
{
CR95HF_ID[j] = rdata[j]; CR95HF_ID[j] = rdata[j];
} }
return CR95HF_ID; return CR95HF_ID;
} }
// Select the RF communication protocol (ISO/IEC 14443-A) // Select the RF communication protocol (ISO/IEC 14443-A)
void CR95HF::Select_ISO_IEC_14443_A_Protocol() { void CR95HF::Select_ISO_IEC_14443_A_Protocol()
{
sdata[0] = 0x02; sdata[0] = 0x02;
sdata[1] = 0x00; sdata[1] = 0x00;
writeCmd(ProtocolSelect, 2); writeCmd(ProtocolSelect, 2);
readCmd(); readCmd();
// Clear read and write buffers // Clear read and write buffers
for (j = 0; j < 18; j++ ) { for (j = 0; j < 18; j++)
{
rdata[j] = 0; rdata[j] = 0;
sdata[j] = 0; sdata[j] = 0;
} }
} }
// Select the RF communication protocol (ISO/IEC 18092) // Select the RF communication protocol (ISO/IEC 18092)
void CR95HF::Select_ISO_IEC_18092_Protocol() { void CR95HF::Select_ISO_IEC_18092_Protocol()
{
sdata[0] = 0x04; sdata[0] = 0x04;
sdata[1] = 0x51; sdata[1] = 0x51;
writeCmd(ProtocolSelect, 2); writeCmd(ProtocolSelect, 2);
readCmd(); readCmd();
// Clear read and write buffers // Clear read and write buffers
for (j = 0; j < 18; j++ ) { for (j = 0; j < 18; j++)
{
rdata[j] = 0; rdata[j] = 0;
sdata[j] = 0; sdata[j] = 0;
} }
} }
// Configure IndexMod & Gain // Configure IndexMod & Gain
void CR95HF::IndexMod_Gain() { void CR95HF::IndexMod_Gain()
{
sdata[0] = 0x09; sdata[0] = 0x09;
sdata[1] = 0x04; sdata[1] = 0x04;
sdata[2] = 0x68; sdata[2] = 0x68;
@@ -324,7 +348,8 @@ void CR95HF::IndexMod_Gain() {
} }
// Configure Auto FDet // Configure Auto FDet
void CR95HF::AutoFDet() { void CR95HF::AutoFDet()
{
sdata[0] = 0x09; sdata[0] = 0x09;
sdata[1] = 0x04; sdata[1] = 0x04;
sdata[2] = 0x0A; sdata[2] = 0x0A;
@@ -336,32 +361,37 @@ void CR95HF::AutoFDet() {
} }
// Read the tag ID // Read the tag ID
void CR95HF::GetTagID() { void CR95HF::GetTagID()
{
sdata[0] = 0x26; sdata[0] = 0x26;
sdata[1] = 0x07; sdata[1] = 0x07;
writeCmd(SendRecv , 2); writeCmd(SendRecv, 2);
readCmd(); readCmd();
sdata[0] = 0x93; sdata[0] = 0x93;
sdata[1] = 0x20; sdata[1] = 0x20;
sdata[2] = 0x08; sdata[2] = 0x08;
writeCmd(SendRecv , 3); writeCmd(SendRecv, 3);
readCmd(); readCmd();
if (res == 0x80) { if (res == 0x80)
for (j = 1; j < dataNum - 3; j++) { {
for (j = 1; j < dataNum - 3; j++)
{
ID += String(rdata[j], HEX); ID += String(rdata[j], HEX);
} }
TAG_flag = 1; TAG_flag = 1;
} }
else { else
{
TAG_flag = 0; TAG_flag = 0;
Select_ISO_IEC_18092_Protocol(); Select_ISO_IEC_18092_Protocol();
} }
} }
// Read the NFC Forum tags // Read the NFC Forum tags
void CR95HF::GetNFCTag() { void CR95HF::GetNFCTag()
{
sdata[0] = 0x00; sdata[0] = 0x00;
sdata[1] = 0xFF; sdata[1] = 0xFF;
sdata[2] = 0xFF; sdata[2] = 0xFF;
@@ -370,39 +400,46 @@ void CR95HF::GetNFCTag() {
writeCmd(SendRecv, 5); writeCmd(SendRecv, 5);
readCmd(); readCmd();
if (res == 0x80) { if (res == 0x80)
for (j = 0; j < dataNum; j++) { {
for (j = 0; j < dataNum; j++)
{
ID += String(rdata[j], HEX); ID += String(rdata[j], HEX);
} }
NFC_flag = 1; NFC_flag = 1;
} }
else { else
{
NFC_flag = 0; NFC_flag = 0;
Select_ISO_IEC_14443_A_Protocol(); Select_ISO_IEC_14443_A_Protocol();
} }
} }
String CR95HF::getID() { String CR95HF::getID()
{
String id = ""; String id = "";
if (!TAG_flag) if (!TAG_flag)
GetNFCTag(); // Get NFC ID GetNFCTag(); // Get NFC ID
if (!NFC_flag) if (!NFC_flag)
GetTagID(); // Get Tag ID GetTagID(); // Get Tag ID
if (ID.c_str()[0] == 0) { // If there is no tag present if (ID.c_str()[0] == 0)
flag++; // Increment counter flag { // If there is no tag present
flag++; // Increment counter flag
} }
else { // If tag is present else
flag = 0; // Reset counter flag { // If tag is present
id = ID; // Set current ID as previous ID flag = 0; // Reset counter flag
id = ID; // Set current ID as previous ID
} }
ID = ""; // Terminate the ID string ID = ""; // Terminate the ID string
// Clear read and write buffers // Clear read and write buffers
for (j = 0; j < 18; j++) { for (j = 0; j < 18; j++)
{
rdata[j] = 0; rdata[j] = 0;
sdata[j] = 0; sdata[j] = 0;
} }

View File

@@ -11,7 +11,7 @@
#define BaudRate 0x0A #define BaudRate 0x0A
#define ECHO 0x55 #define ECHO 0x55
class CR95HF class CR95HF
{ {
public: public:

View File

@@ -79,22 +79,22 @@ void initAudio()
void handleAudio() void handleAudio()
{ {
if (hallIsIdle()) // if (hallIsIdle())
{ // {
if (mp3->isRunning()) // if (mp3->isRunning())
{ // {
Serial.println("Audio: stop playback"); // Serial.println("Audio: stop playback");
mp3->stop(); // mp3->stop();
audio_start = false; // audio_start = false;
} // }
} // }
else // else
{ // {
if(!audio_start) // if(!audio_start)
{ // {
playSong(audio_current_Song); // playSong(audio_current_Song);
audio_start = true; // audio_start = true;
} // }
if (mp3->isRunning()) if (mp3->isRunning())
{ {
@@ -104,5 +104,5 @@ void handleAudio()
playSong(audio_current_Song); playSong(audio_current_Song);
} }
} }
} //}
} }

View File

@@ -1,17 +1,17 @@
#pragma once #pragma once
#define I2S_BCLK 21 #define I2S_BCLK 19
#define I2S_WCLK 13 #define I2S_WCLK 21
#define I2S_DATA 14 #define I2S_DATA 18
#define DAC_SDMODE 27 #define DAC_SDMODE 23
#define NFC_SS 25 #define NFC_SS 27
#define NFC_SCK 18 #define NFC_SCK 25
#define NFC_MOSI 23 #define NFC_MOSI 26
#define NFC_MISO 19 #define NFC_MISO 14
#define NFC_RST 22 //not connectedx //#define NFC_RST 22 //not connectedx
#define NFC_IRQ 26 #define NFC_IRQ 13
#define PWR_HOLD 4 #define PWR_HOLD 4
#define PWR_BTN 9 #define PWR_BTN 9

View File

@@ -13,7 +13,7 @@
void setup() void setup()
{ {
initPower(); //initPower();
Serial.begin(115200); Serial.begin(115200);
delay(2000); delay(2000);
@@ -34,6 +34,6 @@ void loop()
handleAudio(); handleAudio();
handleRfid(); handleRfid();
//handleGame(); //handleGame();
handlePower(); //handlePower();
//handleOta(); //handleOta();
} }