rc522 rfid hakkında

Başlatan görkem, 23 Ağustos 2017, 12:12:52

görkem

haberleştirdim rc522 yi. kartın id sini okuyabiliyorum fakat karta veri yazıp okumak istiyorum datasheet de anlayamadım tam olarak nasıl veri yazılıp okunacağını karta veri yazıp okuyan arkadaş varmı mantığını anlatabilecek ?

MrDarK

Picproje Eğitim Gönüllüleri ~ MrDarK

görkem

@MrDarK  hocam o yazınızı okudum ve araştırıyorum da data bloklarına ulaşmak için key A ve access bitleri isteniyor fakat key A 6 byte access bitleri 4 byte  key A ve access bitleriyle ilgili detaylı açıklama bulamadım o yüzden data bloklarına ulaşamıyorum.

görkem

#18
Arkadaşlar hiç bilgisi olan yokmu kartta veri yazıp okuyabilmekle ilgili günlerdir uğraşıyorum key A access bitleri ve key B gönderip onay almakta sıkıntı çekiyorum arduino kodlarınıda inceledim

kullandığım kod bloğu şu şekilde
ilk değişkene  0x60   key A  adres bilgisini yazıyorum 2. değişken e hangi sektor e erişeceğimi 3. değişken e 6 byte 0xff key bilgisini ve son olarak kartın id sini yazıyorum ama dönüşü hataya düşüyor sektör izni alamıyorum

M_MFRC522_Status_t TM_MFRC522_Auth(uint8_t authMode, uint8_t BlockAddr, uint8_t* Sectorkey, uint8_t* serNum) {
   TM_MFRC522_Status_t status;
   uint16_t recvBits;
   uint8_t i;
   uint8_t buff[12]; 

   //Verify the command block address + sector + password + card serial number
   buff[0] = authMode;
   buff[1] = BlockAddr;
   for (i = 0; i < 6; i++) {    
      buff[i+2] = *(Sectorkey+i);   
   }
   for (i=0; i<4; i++) {    
      buff[i+8] = *(serNum+i);   
   }
   status = TM_MFRC522_ToCard(PCD_AUTHENT, buff, 12, buff, &recvBits);

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


karta veri yazan fonksiyon aşağıda

TM_MFRC522_Status_t TM_MFRC522_ToCard(uint8_t command, uint8_t* sendData, uint8_t sendLen, uint8_t* backData, uint16_t* backLen) {
   TM_MFRC522_Status_t status = MI_ERR;
   uint8_t irqEn = 0x00;
   uint8_t waitIRq = 0x00;
   uint8_t lastBits;
   uint8_t n;
   uint16_t i;

   switch (command) {
      case PCD_AUTHENT: {
         irqEn = 0x12;
         waitIRq = 0x10;
         break;
      }
      case PCD_TRANSCEIVE: {
         irqEn = 0x77;
         waitIRq = 0x30;
         break;
      }
      default:
         break;
   }

   TM_MFRC522_WriteRegister(MFRC522_REG_COMM_IE_N, irqEn | 0x80);
   TM_MFRC522_ClearBitMask(MFRC522_REG_COMM_IRQ, 0x80);
   TM_MFRC522_SetBitMask(MFRC522_REG_FIFO_LEVEL, 0x80);

   TM_MFRC522_WriteRegister(MFRC522_REG_COMMAND, PCD_IDLE);

   //Writing data to the FIFO
   for (i = 0; i < sendLen; i++) {   
      TM_MFRC522_WriteRegister(MFRC522_REG_FIFO_DATA, sendData[i]);    
   }

   //Execute the command
   TM_MFRC522_WriteRegister(MFRC522_REG_COMMAND, command);
   if (command == PCD_TRANSCEIVE) {    
      TM_MFRC522_SetBitMask(MFRC522_REG_BIT_FRAMING, 0x80);      //StartSend=1,transmission of data starts  
   }   

   //Waiting to receive data to complete
   i = 2000;   //i according to the clock frequency adjustment, the operator M1 card maximum waiting time 25ms???
   do {
      //CommIrqReg[7..0]
      //Set1 TxIRq RxIRq IdleIRq HiAlerIRq LoAlertIRq ErrIRq TimerIRq
      n = TM_MFRC522_ReadRegister(MFRC522_REG_COMM_IRQ);
      i--;
   } while ((i!=0) && !(n&0x01) && !(n&waitIRq));

   TM_MFRC522_ClearBitMask(MFRC522_REG_BIT_FRAMING, 0x80);         //StartSend=0

   if (i != 0)  {
      if (!(TM_MFRC522_ReadRegister(MFRC522_REG_ERROR) & 0x1B)) {
         status = MI_OK;
         if (n & irqEn & 0x01) {   
            status = MI_NOTAGERR;         
         }

         if (command == PCD_TRANSCEIVE) {
            n = TM_MFRC522_ReadRegister(MFRC522_REG_FIFO_LEVEL);
            lastBits = TM_MFRC522_ReadRegister(MFRC522_REG_CONTROL) & 0x07;
            if (lastBits) {   
               *backLen = (n - 1) * 8 + lastBits;   
            } else {   
               *backLen = n * 8;   
            }

            if (n == 0) {   
               n = 1;    
            }
            if (n > MFRC522_MAX_LEN) {   
               n = MFRC522_MAX_LEN;   
            }

            //Reading the received data in FIFO
            for (i = 0; i < n; i++) {   
               backData[i] = TM_MFRC522_ReadRegister(MFRC522_REG_FIFO_DATA);    
            }
         }
      } else {   
         status = MI_ERR;  
      }
   }

   return status;
}

MrDarK

Kartın ilgili sektörünü nfc içeren bir okuyucu veya telefon ile okuyun. Anahtarının 6 byte ff değeri olduğundan emin olduktan sonra kod konusunda inceleme yapılabilir.
Picproje Eğitim Gönüllüleri ~ MrDarK

görkem

Hocam telefondan okudum görüntüsü aşağıda 6 byte 0xff



MrDarK

#21
Kodunuzu debug yaparak hatanın nerede olduğunu tespit etmeniz lazım. Bu kod kalabalığı içinde yorum yapılamaz ne yazık ki. Ayrıca library'nin parçalarını atıyorsunuz. mantıken bunları kullandığınız kodun başka olması lazım. Kartın seri numarasını her seferinde okuyabiliyor musun ? Ondan sonra auth işleminde mi yoksa write sonucunda mı hata alıyorsun onu öğrenmek lazım. Birde kullandığın library'i tanımak lazım debug yapmak lazım. Eğer olmuyorsa yapamıyorsan örnek kodla çalışan bir library ara kendine derim.
Picproje Eğitim Gönüllüleri ~ MrDarK

görkem

kartın id sini okumada sorun yok her seferinde okuyabiliyorum.  sırasıyla atuh işleminde ve write işlemin de hata alıyorum. dikkatimi çeken birşey var atuh işleminde sadece key a ,sektör ,kart id bilgisi gönderiliyor  access bilgisi gönderilmiyor arduino örneklerindede baktım access bilgisi gönderilmeden sadece key a ile işlem başarıya ulaşmış  nasıl ulaşabiliyor ?

görkem

@MrDarK  hocam dan başka uğraşan olmadımı mfrc522 rfid ile bir karta veri yazamadık kesin basit bir noktayı atlıyorum.

cyber_cemati

Görkem ustam. Yaptıysan okuma için hangi yolu izledin? Bizle de paylaşır mısın?

tunahanfıtlamak