RFID-RC522 模塊的讀寫操作【Arduino】


接線

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);
    }
}

————————————————


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM