Tutorial Koneksi RFID RC522 dengan Arduino Uno dan MEGA 2560

Posted by IWAN MUTTAQIN Rabu, 17 September 2014 0 komentar
RFID atau Radio Frequency Identification, adalah suatu metode yang mana bisa digunakan untuk menyimpan atau menerima data secara jarak jauh dengan menggunakan suatu piranti yang bernama RFID tag atau transponder. Suatu RFID tag adalah sebuah benda kecil, misalnya berupa stiker adesif, dan dapat ditempelkan pada suatu barang atau produk. RFID tag berisi antena yang memungkinkan mereka untuk menerima dan merespon terhadap suatu query yang dipancarkan oleh suatu RFID transceiver.


Koneksinya:


Arduino Uno:

Uno   RC522
3.3V   VCC
GND    GND
5      RST

12     MISO
11     MOSI
13     SCK
10     NSS

Arduino MEGA 2560 :

Mega   RC522
3.3V   VCC
GND    GND
RESET  RST

50     MISO
51     MOSI
52     SCK
53     NSS / SDA

MOSI (Master In Slave Out):  Garis Master untuk mengirimkan data ke perangkat.
MISO(Master Out Slave In):  Garis Slave(Perangkat) untuk mengirim data ke master.
SCK (Serial Clock) :  Menyinkronkan transmisi data yang dihasilkan oleh master dan  khusus untuk setiap perangkat.
NSS/SDA (Slave Select) :  Pin pada setiap perangkat master dapat digunakan  untuk mengaktifkan dan menonaktifkan perangkat tertentu.




Source Codenya:

 //sensor berkomunikasi menggunakan SPI (Serial Peripheral Interface)
#include

#define    uchar    unsigned char
#define    uint    unsigned int

// Panjang maksimum dari array
#define MAX_LEN 16

/////////////////////////////////////////////////////////////////////
//set pinnya
/////////////////////////////////////////////////////////////////////
// Arduino Mega - pin = 53
// Arduino Uno  - pin = 10
const int chipSelectPin = 53;
const int NRSTPD = 5;

//MF522命令字
#define PCD_IDLE              0x00               // Membatalkan perintah saat ini
#define PCD_AUTHENT           0x0E               // Authentication Key
#define PCD_RECEIVE           0x08               // Menerima Data
#define PCD_TRANSMIT          0x04               // Mengirim data
#define PCD_TRANSCEIVE        0x0C               // Mengirim dan menerima data
#define PCD_RESETPHASE        0x0F               // Atur ulang
#define PCD_CALCCRC           0x03               // Menghitung CRC

// Prosedure perintah Kartu
#define PICC_REQIDL           0x26               // Ketika tidak menemukan Sinyal ke hibernasi
#define PICC_REQALL           0x52               // Aarea sinyal dengan semua kartu
#define PICC_ANTICOLL         0x93               // Antisipasi Tabrakan Data
#define PICC_SElECTTAG        0x93               // Memilih kartu
#define PICC_AUTHENT1A        0x60               // Sebuah verifikasi kunci A
#define PICC_AUTHENT1B        0x61               // Verifikasi kunci B
#define PICC_READ             0x30               // Baca Block
#define PICC_WRITE            0xA0               // Menulis Block
#define PICC_DECREMENT        0xC0               // Memasukan pengurangan
#define PICC_INCREMENT        0xC1               // Mengisi kembali
#define PICC_RESTORE          0xC2               // Mentransfer blok data ke buffer
#define PICC_TRANSFER         0xB0               // Disimpan dalam Buffer data
#define PICC_HALT             0x50              


// Kode kesalahan dikembalikan ketika MF522 melakukan komunikasi kembali.
#define MI_OK                 0
#define MI_NOTAGERR           1
#define MI_ERR                2


// ------------------ MFRC522 melakukan registrasi ---------------
//Page 0:Command and Status
#define     Reserved00            0x00   
#define     CommandReg            0x01   
#define     CommIEnReg            0x02   
#define     DivlEnReg             0x03   
#define     CommIrqReg            0x04   
#define     DivIrqReg             0x05
#define     ErrorReg              0x06   
#define     Status1Reg            0x07   
#define     Status2Reg            0x08   
#define     FIFODataReg           0x09
#define     FIFOLevelReg          0x0A
#define     WaterLevelReg         0x0B
#define     ControlReg            0x0C
#define     BitFramingReg         0x0D
#define     CollReg               0x0E
#define     Reserved01            0x0F
//Page 1:Command    
#define     Reserved10            0x10
#define     ModeReg               0x11
#define     TxModeReg             0x12
#define     RxModeReg             0x13
#define     TxControlReg          0x14
#define     TxAutoReg             0x15
#define     TxSelReg              0x16
#define     RxSelReg              0x17
#define     RxThresholdReg        0x18
#define     DemodReg              0x19
#define     Reserved11            0x1A
#define     Reserved12            0x1B
#define     MifareReg             0x1C
#define     Reserved13            0x1D
#define     Reserved14            0x1E
#define     SerialSpeedReg        0x1F
//Page 2:CFG   
#define     Reserved20            0x20 
#define     CRCResultRegM         0x21
#define     CRCResultRegL         0x22
#define     Reserved21            0x23
#define     ModWidthReg           0x24
#define     Reserved22            0x25
#define     RFCfgReg              0x26
#define     GsNReg                0x27
#define     CWGsPReg              0x28
#define     ModGsPReg             0x29
#define     TModeReg              0x2A
#define     TPrescalerReg         0x2B
#define     TReloadRegH           0x2C
#define     TReloadRegL           0x2D
#define     TCounterValueRegH     0x2E
#define     TCounterValueRegL     0x2F
//Page 3:TestRegister    
#define     Reserved30            0x30
#define     TestSel1Reg           0x31
#define     TestSel2Reg           0x32
#define     TestPinEnReg          0x33
#define     TestPinValueReg       0x34
#define     TestBusReg            0x35
#define     AutoTestReg           0x36
#define     VersionReg            0x37
#define     AnalogTestReg         0x38
#define     TestDAC1Reg           0x39 
#define     TestDAC2Reg           0x3A  
#define     TestADCReg            0x3B  
#define     Reserved31            0x3C  
#define     Reserved32            0x3D  
#define     Reserved33            0x3E  
#define     Reserved34              0x3F
//-----------------------------------------------

// Card 4 byte nomor seri, kelima byte checksum byte
uchar serNum[5];

uchar  writeData[16]={0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 100};  // Inisialisasi 100 dolar
uchar  moneyConsume = 18 ;  // Menghabiskan 18 yuan
uchar  moneyAdd = 10 ;  // Isi Ulang 10 yuan
// Sebuah sektor password, 16 sektor, masing-masing sandi 6 Byte
 uchar sectorKeyA[16][16] = {{0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF},
                             {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF},
                             //{0x19, 0x84, 0x07, 0x15, 0x76, 0x14},
                             {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF},
                            };
 uchar sectorNewKeyA[16][16] = {{0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF},
                                {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xff,0x07,0x80,0x69, 0x19,0x84,0x07,0x15,0x76,0x14},
                                 //you can set another ket , such as  " 0x19, 0x84, 0x07, 0x15, 0x76, 0x14 "
                                 //{0x19, 0x84, 0x07, 0x15, 0x76, 0x14, 0xff,0x07,0x80,0x69, 0x19,0x84,0x07,0x15,0x76,0x14},
                                 // but when loop, please set the  sectorKeyA, the same key, so that RFID module can read the card
                                {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xff,0x07,0x80,0x69, 0x19,0x33,0x07,0x15,0x34,0x14},
                               };

void setup() {               
   Serial.begin(9600);        // RFID reader SOUT pin connected to Serial RX pin at 2400bps
 // start SPI library:
  SPI.begin();
 
  pinMode(chipSelectPin,OUTPUT);             // Set digital pin 10 as OUTPUT to connect it to the RFID /ENABLE pin
    digitalWrite(chipSelectPin, LOW);          // Activate the RFID reader
  pinMode(NRSTPD,OUTPUT);               // Set digital pin 10 , Not Reset and Power-down
    digitalWrite(NRSTPD, HIGH);

  MFRC522_Init(); 
}

void loop()
{
      uchar i,tmp;
    uchar status;
        uchar str[MAX_LEN];
        uchar RC_size;
        uchar blockAddr;    // Pilih alamat blok operasi 0-63
        String mynum = "";


        // Cari kartu, kembali jenis kartu   
        status = MFRC522_Request(PICC_REQIDL, str);   
        if (status == MI_OK)
        {
            Serial.println("Card detected");
            Serial.print(str[0],BIN);
            Serial.print(" , ");
            Serial.print(str[1],BIN);
            Serial.println(" ");
        }

        // Anti-tabrakan, mengembalikan kartu nomor seri 4 byte
        status = MFRC522_Anticoll(str);
        memcpy(serNum, str, 5);
        if (status == MI_OK)
        {

                        Serial.println("Karu terdeteksi  : ");
            Serial.print(serNum[0]);
            Serial.print(" , ");
            Serial.print(serNum[1],BIN);
            Serial.print(" , ");
            Serial.print(serNum[2],BIN);
            Serial.print(" , ");
            Serial.print(serNum[3],BIN);
            Serial.print(" , ");
            Serial.print(serNum[4],BIN);
            Serial.println(" ");
                       
                        // Should really check all pairs, but for now we'll just use the first
                    
                        if(serNum[0] == 181)  { //Sesuaikan dengan Kartu yang terdeteksi
                          Serial.println("Kartu Satu  Terdeteksi Sebagai Iwan Cilibur ");
                        } else if(serNum[0] == 105) {
                          Serial.println("Kartu Dua Terdeteksi Sebagai Orang Ganteng");
                        }
                        delay(1000);
        }
                //Serial.println(" ");
        MFRC522_Halt();            // Kartu perintah ke Sleep                     
         
}

/*
  * Nama Fungsi: Write_MFRC5200
  * Keterangan: MFRC522 register untuk menulis byte data
  * Masukan: - mendaftarkan alamat addr; val - nilai yang akan ditulis
  * Kembali Nilai: Tidak ada
  */

void Write_MFRC522(uchar addr, uchar val)
{
    digitalWrite(chipSelectPin, LOW);

    // Format Alamat:0XXXXXX0
    SPI.transfer((addr<<1 amp="" br="" nbsp="" x7e="">    SPI.transfer(val);
   
    digitalWrite(chipSelectPin, HIGH);
}


/*
  * Nama Fungsi: Read_MFRC522
  * Keterangan: Membaca satu byte data dari MFRC522  kemudian mendaftarkan
  * Masukan Parameter: addr - mendaftarkan alamat
  * Mengembalikan nilai: Mengembalikan byte data dibaca
  */

uchar Read_MFRC522(uchar addr)
{
    uchar val;

    digitalWrite(chipSelectPin, LOW);

    //地址格式:1XXXXXX0
    SPI.transfer(((addr<<1 0x80="" amp="" br="" nbsp="" x7e="">    val =SPI.transfer(0x00);
   
    digitalWrite(chipSelectPin, HIGH);
   
    return val;   
}

/*
  * Nama Fungsi: SetBitMask
  * Keterangan: Set RC522 mendaftar bit
  * Parameter input: reg - mendaftarkan alamat; mask - set nilai
  * Kembali Nilai: Tidak ada
  */

void SetBitMask(uchar reg, uchar mask) 
{
    uchar tmp;
    tmp = Read_MFRC522(reg);
    Write_MFRC522(reg, tmp | mask);  // set bit mask
}


/*
  * Nama Fungsi: ClearBitMask
  * Keterangan: Clear bit RC522 mendaftar
  * Parameter input: reg - mendaftarkan alamat; mask - nilai bit yang jelas
  * Kembali Nilai: Tidak ada
  */

void ClearBitMask(uchar reg, uchar mask) 
{
    uchar tmp;
    tmp = Read_MFRC522(reg);
    Write_MFRC522(reg, tmp & (~mask));  // clear bit mask
}


/*
 * Nama Fungsi: AntennaOn
 * Keterangan: Sinyal akan terbuka /mendeteksi  kartu setiap kali memulai  tap setidaknya 1ms Interval .
  * Masukan: Tidak ada
  * Kembali Nilai: Tidak ada
*/

void AntennaOn(void)
{
    uchar temp;

    temp = Read_MFRC522(TxControlReg);
    if (!(temp & 0x03))
    {
        SetBitMask(TxControlReg, 0x03);
    }
}


/*
  * Nama Fungsi: AntennaOff
  * Keterangan: Sinyal akan tertutup /tidak mendeksi   kartu setiap kali memulai  tap setidaknya 1ms Interval .
  * Masukan: Tidak ada
  * Kembali Nilai: Tidak ada
*/

void AntennaOff(void)
{
    ClearBitMask(TxControlReg, 0x03);
}


/*
 * Nama Fungsi: ResetMFRC522
 * Keterangan: Ganti RC522
 * Masukan: Tidak ada
 * Kembali Nilai: Tidak ada
 */

void MFRC522_Reset(void)
{
    Write_MFRC522(CommandReg, PCD_RESETPHASE);
}


/*
 * Nama Fungsi: InitMFRC522
  * Keterangan: Initialize RC522
  * Masukan: Tidak ada
  * Kembali Nilai: Tidak ada
 */

void MFRC522_Init(void)
{
    digitalWrite(NRSTPD,HIGH);

    MFRC522_Reset();
        
    //Timer: TPrescaler*TreloadVal/6.78MHz = 24ms
    Write_MFRC522(TModeReg, 0x8D);        //Tauto=1; f(Timer) = 6.78MHz/TPreScaler
    Write_MFRC522(TPrescalerReg, 0x3E);    //TModeReg[3..0] + TPrescalerReg
    Write_MFRC522(TReloadRegL, 30);          
    Write_MFRC522(TReloadRegH, 0);
   
    Write_MFRC522(TxAutoReg, 0x40);        //100%ASK
    Write_MFRC522(ModeReg, 0x3D);        //CRC初始值0x6363    ???

    //ClearBitMask(Status2Reg, 0x08);        //MFCrypto1On=0
    //Write_MFRC522(RxSelReg, 0x86);        //RxWait = RxSelReg[5..0]
    //Write_MFRC522(RFCfgReg, 0x7F);           //RxGain = 48dB

    AntennaOn();        //打开天线
}


/*
  * Nama Fungsi: MFRC522_Request
  * Description: Mencari kartu, membaca nomor jenis kartu
  * Parameter input: reqMode - menemukan kartu dengan cara TagType - Card Kembali Type
 *                 0x4400 = Mifare_UltraLight
 *                0x0400 = Mifare_One(S50)
 *                0x0200 = Mifare_One(S70)
 *                0x0800 = Mifare_Pro(X)
 *                0x4403 = Mifare_DESFire
 * Mengembalikan nilai: kembali sukses MI_OK
 */
uchar MFRC522_Request(uchar reqMode, uchar *TagType)
{
    uchar status; 
    uint backBits;            // Bit data yang diterima

    Write_MFRC522(BitFramingReg, 0x07);        //TxLastBists = BitFramingReg[2..0]    ???
   
    TagType[0] = reqMode;
    status = MFRC522_ToCard(PCD_TRANSCEIVE, TagType, 1, TagType, &backBits);

    if ((status != MI_OK) || (backBits != 0x10))
    {   
        status = MI_ERR;
    }
  
    return status;
}


/*
  * Nama Fungsi: MFRC522_ToCard
  * Keterangan: RC522 dan kartu ISO14443 komunikasi
  * Parameter input: Perintah - perintah kata MF522,
  * SendData - data yang dikirim ke kartu melalui RC522,
  * SendLen - panjang data yang dikirim
  * Fxtrader Backdata - menerima data kartu kembali,
  * BackLen - kembali panjang data bit
  * Mengembalikan nilai: kembali sukses MI_OK
  */

uchar MFRC522_ToCard(uchar command, uchar *sendData, uchar sendLen, uchar *backData, uint *backLen)
{
    uchar status = MI_ERR;
    uchar irqEn = 0x00;
    uchar waitIRq = 0x00;
    uchar lastBits;
    uchar n;
    uint i;

    switch (command)
    {
        case PCD_AUTHENT:        // Saat Kartu didekatkan
        {
            irqEn = 0x12;
            waitIRq = 0x10;
            break;
        }
        case PCD_TRANSCEIVE:    // Mengirimkan data FIFO
        {
            irqEn = 0x77;
            waitIRq = 0x30;
            break;
        }
        default:
            break;
    }
  
    Write_MFRC522(CommIEnReg, irqEn|0x80);    // Permintaan interupsi
    ClearBitMask(CommIrqReg, 0x80);        // Hapus semua interrupt request bit
    SetBitMask(FIFOLevelReg, 0x80);        // FlushBuffer = 1, FIFO inisialisasi 
    Write_MFRC522(CommandReg, PCD_IDLE);    // NO tindakan; membatalkan perintah sesaat    ???

// Menulis data ke FIFO
    for (i=0; i    {  
        Write_MFRC522(FIFODataReg, sendData[i]);   
    }

    //执行命令
    Write_MFRC522(CommandReg, command);
    if (command == PCD_TRANSCEIVE)
    {   
        SetBitMask(BitFramingReg, 0x80);        //StartSend=1,transmission of data starts 
    }  
   
    // Menunggu untuk menerima data untuk diproses
    i = 2000;    //i  sesuai dengan penyesuaian frekuensi delay, kartu operasi M1 maksimum menunggu waktu 25ms???
    do
    {
        //CommIrqReg[7..0]
        //Set1 TxIRq RxIRq IdleIRq HiAlerIRq LoAlertIRq ErrIRq TimerIRq
        n = Read_MFRC522(CommIrqReg);
        i--;
    }
    while ((i!=0) && !(n&0x01) && !(n&waitIRq));

    ClearBitMask(BitFramingReg, 0x80);            //StartSend=0
   
    if (i != 0)
    {   
        if(!(Read_MFRC522(ErrorReg) & 0x1B))    //BufferOvfl Collerr CRCErr ProtecolErr
        {
            status = MI_OK;
            if (n & irqEn & 0x01)
            {  
                status = MI_NOTAGERR;            //??  
            }

            if (command == PCD_TRANSCEIVE)
            {
                   n = Read_MFRC522(FIFOLevelReg);
                  lastBits = Read_MFRC522(ControlReg) & 0x07;
                if (lastBits)
                {  
                    *backLen = (n-1)*8 + lastBits;  
                }
                else
                {  
                    *backLen = n*8;  
                }

                if (n == 0)
                {  
                    n = 1;   
                }
                if (n > MAX_LEN)
                {  
                    n = MAX_LEN;  
                }
               
                // Membaca FIFO data yang diterima
                for (i=0; i                {  
                    backData[i] = Read_MFRC522(FIFODataReg);   
                }
            }
        }
        else
        {  
            status = MI_ERR; 
        }
       
    }
   
    //SetBitMask(ControlReg,0x80);           //timer stops
    //Write_MFRC522(CommandReg, PCD_IDLE);

    return status;
}


/*
  * Nama Fungsi: MFRC522_Anticoll
  * Keterangan: deteksi Anti-tabrakan, untuk membaca nomor seri kartu /cek kartu
  * Parameter input: serNum - kembali  4 byte kartu nomor seri, kelima byte checksum byte
  * Mengembalikan nilai: kembali sukses MI_OK
  */

uchar MFRC522_Anticoll(uchar *serNum)
{
    uchar status;
    uchar i;
    uchar serNumCheck=0;
    uint unLen;
   

    //ClearBitMask(Status2Reg, 0x08);        //TempSensclear
    //ClearBitMask(CollReg,0x80);            //ValuesAfterColl
    Write_MFRC522(BitFramingReg, 0x00);        //TxLastBists = BitFramingReg[2..0]

    serNum[0] = PICC_ANTICOLL;
    serNum[1] = 0x20;
    status = MFRC522_ToCard(PCD_TRANSCEIVE, serNum, 2, serNum, &unLen);

    if (status == MI_OK)
    {
        // Periksa kartu nomor seri
        for (i=0; i<4 br="" i="">        {  
             serNumCheck ^= serNum[i];
        }
        if (serNumCheck != serNum[i])
        {  
            status = MI_ERR;   
        }
    }

    //SetBitMask(CollReg, 0x80);        //ValuesAfterColl=1

    return status;
}


/*
  * Nama Fungsi: CalulateCRC
  * Keterangan: CRC dihitung dengan MF522
  * Parameter input: pIn data - untuk membaca data CRC, len - panjang data, pOutData - hasil perhitungan CRC
  * Kembali Nilai: Tidak ada
  */

void CalulateCRC(uchar *pIndata, uchar len, uchar *pOutData)
{
    uchar i, n;

    ClearBitMask(DivIrqReg, 0x04);            //CRCIrq = 0
    SetBitMask(FIFOLevelReg, 0x80);            //清FIFO指针
    //Write_MFRC522(CommandReg, PCD_IDLE);

    // Menulis data ke FIFO       
    for (i=0; i    {  
        Write_MFRC522(FIFODataReg, *(pIndata+i));  
    }
    Write_MFRC522(CommandReg, PCD_CALCCRC);

    // Tunggu perhitungan CRC selesai
    i = 0xFF;
    do
    {
        n = Read_MFRC522(DivIrqReg);
        i--;
    }
    while ((i!=0) && !(n&0x04));            //CRCIrq = 1

    //读取CRC计算结果
    pOutData[0] = Read_MFRC522(CRCResultRegL);
    pOutData[1] = Read_MFRC522(CRCResultRegM);
}


/*
  * Nama Fungsi: MFRC522_SelectTag
  * Keterangan: Kartu yang dipilih, baca kapasitas memory card
  * Masukan parameter: serNum - kartu masuk nomor seri
  * Mengembalikan nilai:  sukses kapasitas kartu
  */
uchar MFRC522_SelectTag(uchar *serNum)
{
    uchar i;
    uchar status;
    uchar size;
    uint recvBits;
    uchar buffer[9];

    //ClearBitMask(Status2Reg, 0x08);            //MFCrypto1On=0

    buffer[0] = PICC_SElECTTAG;
    buffer[1] = 0x70;
    for (i=0; i<5 br="" i="">    {
        buffer[i+2] = *(serNum+i);
    }
    CalulateCRC(buffer, 7, &buffer[7]);        //??
    status = MFRC522_ToCard(PCD_TRANSCEIVE, buffer, 9, buffer, &recvBits);
   
    if ((status == MI_OK) && (recvBits == 0x18))
    {  
        size = buffer[0];
    }
    else
    {  
        size = 0;   
    }

    return size;
}


/*
  * Nama Fungsi: MFRC522_Auth
  * Keterangan: Ulangi password kartu
  * Parameter input: authMode - modus otentikasi password
                  0x60 = A verifikasi kunci
                  0x61 = verifikasi kunci B
              BlockAddr - blok alamat
              Sandi Sektor - Sectorkey
              serNum - kartu nomor seri, 4 byte
  * Mengembalikan nilai: kembali sukses MI_OK
  */

uchar MFRC522_Auth(uchar authMode, uchar BlockAddr, uchar *Sectorkey, uchar *serNum)
{
    uchar status;
    uint recvBits;
    uchar i;
    uchar buff[12];

    // Verifikasi instruksi blok alamat + sektor + password + kartu nomor seri
    buff[0] = authMode;
    buff[1] = BlockAddr;
    for (i=0; i<6 br="" i="">    {   
        buff[i+2] = *(Sectorkey+i);  
    }
    for (i=0; i<4 br="" i="">    {   
        buff[i+8] = *(serNum+i);  
    }
    status = MFRC522_ToCard(PCD_AUTHENT, buff, 12, buff, &recvBits);

    if ((status != MI_OK) || (!(Read_MFRC522(Status2Reg) & 0x08)))
    {  
        status = MI_ERR;  
    }
   
    return status;
}

/*
  * Nama Fungsi: MFRC522_Read
  * Keterangan: Membaca data blok
  * Parameter input: blockAddr - blok alamat; recvData - blok data dibacakan
  * Mengembalikan nilai: kembali sukses MI_OK
  */

uchar MFRC522_Read(uchar blockAddr, uchar *recvData)
{
    uchar status;
    uint unLen;

    recvData[0] = PICC_READ;
    recvData[1] = blockAddr;
    CalulateCRC(recvData,2, &recvData[2]);
    status = MFRC522_ToCard(PCD_TRANSCEIVE, recvData, 4, recvData, &unLen);

    if ((status != MI_OK) || (unLen != 0x90))
    {
        status = MI_ERR;
    }
   
    return status;
}


/*
  * Nama Fungsi: MFRC522_Write
  * Keterangan: Menulis data blok
  * Parameter input: blockAddr - blok alamat; WriteData - untuk blok data 16-byte yang ditulis
  * Mengembalikan nilai: kembali sukses MI_OK
  */

uchar MFRC522_Write(uchar blockAddr, uchar *writeData)
{
    uchar status;
    uint recvBits;
    uchar i;
    uchar buff[18];
   
    buff[0] = PICC_WRITE;
    buff[1] = blockAddr;
    CalulateCRC(buff, 2, &buff[2]);
    status = MFRC522_ToCard(PCD_TRANSCEIVE, buff, 4, buff, &recvBits);

    if ((status != MI_OK) || (recvBits != 4) || ((buff[0] & 0x0F) != 0x0A))
    {  
        status = MI_ERR;  
    }
       
    if (status == MI_OK)
    {
        for (i=0; i<16 16byte="" br="" data="" fifo="" i="" ke="" menulis="" nbsp="">        {   
            buff[i] = *(writeData+i);  
        }
        CalulateCRC(buff, 16, &buff[16]);
        status = MFRC522_ToCard(PCD_TRANSCEIVE, buff, 18, buff, &recvBits);
       
        if ((status != MI_OK) || (recvBits != 4) || ((buff[0] & 0x0F) != 0x0A))
        {  
            status = MI_ERR;  
        }
    }
   
    return status;
}


/*
  * Nama Fungsi: MFRC522_Halt
  * Keterangan: Kartu Command ke hibernasi
  * Masukan: Tidak ada
  * Kembali Nilai: Tidak ada
  */
void MFRC522_Halt(void)
{
    uchar status;
    uint unLen;
    uchar buff[4];

    buff[0] = PICC_HALT;
    buff[1] = 0;
    CalulateCRC(buff, 2, &buff[2]);

    status = MFRC522_ToCard(PCD_TRANSCEIVE, buff, 4, buff,&unLen);
}
Terimakasih Atas Kunjungan Sahabat Cilibur Inspirasi
Judul: Tutorial Koneksi RFID RC522 dengan Arduino Uno dan MEGA 2560
Ditulis oleh IWAN MUTTAQIN
Rating Blog 5 dari 5
Semoga artikel ini bermanfaat bagi Saahabat Cilibur Inspirasi, Jika Sahabat Cilibur ingin mengutip, baik itu sebagian atau keseluruhan dari isi artikel ini harap menyertakan link dofollow ke http://ciliburkerajan.blogspot.com/2014/09/tutorial-koneksi-rfid-rc522-dengan-arduino-uno-dan-mega-2560.html. Terima kasih sudah singgah membaca artikel ini. Salam Sahabat Cilibur Inspirasi dan Sukses Selalau

0 komentar:

Posting Komentar

Commanlah dengan Bahasa yang Sopan dan baik

By: Cilibur Inspirasi
FB:Facebook
TWET: Twiiter

QR Code Cilibur Inspirasi

QR Code Cilibur Inspirasi
Iwan Cilibur support Terbitkan Puisimu - Modify by Cilibur Inspirasi | Copyright of CILIBUR INSPIRASI.

Logo Cilibur inspirasi

Klik cek this out !
Ganti Ukurannya agar sesuai dengan Blog sahabat (width:150px; height:150px)

Mengenai Saya

Foto saya
Nama saya Iwan Muttaqin. Saya terjun di dunia Blogging sejak 20 Mei 2010 sampai sekarang. Maksud dan tujuan

Followers