接線
Arduino Uno <—> RFID-RC522
10 <—> SDA
13 <—> SCK
11 <—> MOSI
12 <—> MISO
null <—> IRQ
GND <—> GND
9 <—> RST
3.3V <—> 3.3V
#include <SPI.h>
#include <MFRC522.h>
#define RST_PIN 9 // 配置針腳
#define SS_PIN 10
MFRC522 mfrc522(SS_PIN, RST_PIN); // 創建新的RFID實例
MFRC522::MIFARE_Key key;
void setup() {
Serial.begin(9600); // 設置串口波特率為9600
while (!Serial); // 如果串口沒有打開,則死循環下去不進行下面的操作
SPI.begin(); // SPI開始
mfrc522.PCD_Init(); // Init MFRC522 card
for (byte i = 0; i < 6; i++) {
key.keyByte[i] = 0xFF;
}
Serial.println(F("掃描卡開始進行讀或者寫"));
Serial.print(F("使用A和B作為鍵"));
dump_byte_array(key.keyByte, MFRC522::MF_KEY_SIZE);
Serial.println();
Serial.println(F("注意,會把數據寫入到卡在#1"));
}
void loop() {
// 尋找新卡
if ( ! mfrc522.PICC_IsNewCardPresent())
return;
// 選擇一張卡
if ( ! mfrc522.PICC_ReadCardSerial())
return;
// 顯示卡片的詳細信息
Serial.print(F("卡片 UID:"));
dump_byte_array(mfrc522.uid.uidByte, mfrc522.uid.size);
Serial.println();
Serial.print(F("卡片類型: "));
MFRC522::PICC_Type piccType = mfrc522.PICC_GetType(mfrc522.uid.sak);
Serial.println(mfrc522.PICC_GetTypeName(piccType));
// 檢查兼容性
if ( piccType != MFRC522::PICC_TYPE_MIFARE_MINI
&& piccType != MFRC522::PICC_TYPE_MIFARE_1K
&& piccType != MFRC522::PICC_TYPE_MIFARE_4K) {
Serial.println(F("僅僅適合Mifare Classic卡的讀寫"));
return;
}
// 我們只使用第二個扇區
// 覆蓋扇區4
byte sector = 1;
byte blockAddr = 4;
byte dataBlock[] = {
0x01, 0x02, 0x03, 0x04, // 1, 2, 3, 4,
0x05, 0x06, 0x07, 0x08, // 5, 6, 7, 8,
0x00, 0x00, 0x00, 0x00, // 0,0,0,0
0x00, 0x00, 0x00, 0x00 // 0,0,0,0
};//寫入的數據定義
byte trailerBlock = 7;
MFRC522::StatusCode status;
byte buffer[18];
byte size = sizeof(buffer);
// 原來的數據
Serial.println(F("顯示原本的數據..."));
status = (MFRC522::StatusCode) mfrc522.PCD_Authenticate(MFRC522::PICC_CMD_MF_AUTH_KEY_A, trailerBlock, &key, &(mfrc522.uid));
if (status != MFRC522::STATUS_OK) {
Serial.print(F("身份驗證失敗?或者是卡鏈接失敗"));
Serial.println(mfrc522.GetStatusCodeName(status));
return;
}
// 顯示整個扇區
Serial.println(F("顯示所有扇區的數據"));
mfrc522.PICC_DumpMifareClassicSectorToSerial(&(mfrc522.uid), &key, sector);
Serial.println();
// 從塊兒讀取數據
Serial.print(F("讀取塊兒的數據在:")); Serial.print(blockAddr);
Serial.println(F("塊 ..."));
status = (MFRC522::StatusCode) mfrc522.MIFARE_Read(blockAddr, buffer, &size);
if (status != MFRC522::STATUS_OK) {
Serial.print(F("讀卡失敗,沒有連接上 "));
Serial.println(mfrc522.GetStatusCodeName(status));
}
Serial.print(F("數據內容在第 ")); Serial.print(blockAddr); Serial.println(F(" 塊:"));
dump_byte_array(buffer, 16); Serial.println();
Serial.println();
//開始進行寫入准備
Serial.println(F("開始進行寫入的准備..."));
status = (MFRC522::StatusCode) mfrc522.PCD_Authenticate(MFRC522::PICC_CMD_MF_AUTH_KEY_B, trailerBlock, &key, &(mfrc522.uid));
if (status != MFRC522::STATUS_OK) {
Serial.print(F("寫入失敗,沒有連接上或者沒有權限 "));
Serial.println(mfrc522.GetStatusCodeName(status));
return;
}
// Write data to the block
Serial.print(F("在第: ")); Serial.print(blockAddr);
Serial.println(F(" 塊中寫入數據..."));
dump_byte_array(dataBlock, 16); Serial.println();
status = (MFRC522::StatusCode) mfrc522.MIFARE_Write(blockAddr, dataBlock, 16);
if (status != MFRC522::STATUS_OK) {
Serial.print(F("寫入失敗... "));
Serial.println(mfrc522.GetStatusCodeName(status));
}
Serial.println();
// 再次讀取卡中數據,這次是寫入之后的數據
Serial.print(F("讀取寫入后第")); Serial.print(blockAddr);
Serial.println(F(" 塊的數據 ..."));
status = (MFRC522::StatusCode) mfrc522.MIFARE_Read(blockAddr, buffer, &size);
if (status != MFRC522::STATUS_OK) {
Serial.print(F("讀取失敗... "));
Serial.println(mfrc522.GetStatusCodeName(status));
}
Serial.print(F("塊 ")); Serial.print(blockAddr); Serial.println(F("數據為 :"));
dump_byte_array(buffer, 16); Serial.println();
// 驗證一下數據,要保證寫入前后數據是相等的
// 通過計算塊中的字節數量
Serial.println(F("等待驗證結果..."));
byte count = 0;
for (byte i = 0; i < 16; i++) {
// 比較一下緩存中的數據(我們讀出來的數據) = (我們剛剛寫的數據)
if (buffer[i] == dataBlock[i])
count++;
}
Serial.print(F("匹配的字節數量 = ")); Serial.println(count);
if (count == 16) {
Serial.println(F("驗證成功 :"));
} else {
Serial.println(F("失敗,數據不匹配"));
Serial.println(F("也許寫入的內容不恰當"));
}
Serial.println();
// 轉儲扇區數據
Serial.println(F("寫入后的數據內容為::"));
mfrc522.PICC_DumpMifareClassicSectorToSerial(&(mfrc522.uid), &key, sector);
Serial.println();
// 停止 PICC
mfrc522.PICC_HaltA();
//停止加密PCD
mfrc522.PCD_StopCrypto1();
}
/**
* 將字節數組轉儲為串行的十六進制值
*/
void dump_byte_array(byte *buffer, byte bufferSize) {
for (byte i = 0; i < bufferSize; i++) {
Serial.print(buffer[i] < 0x10 ? " 0" : " ");
Serial.print(buffer[i], HEX);
}
}
————————————————