RFID(MFRC522) İncelemesi Hakkında Kısa Kısa

Başlatan MrDarK, 01 Mayıs 2014, 15:17:30

MrDarK

Benim ayarlarım bu şekilde, kendi ayarlarınla karşılaştırabilirsin.

Yeteri kadar açıklama vardır diye düşünüyorum komutların üzerinde.

// Transmit Register ayarı 100%ASK olarak yuklendi
	MFR522_WriteByte(TxAutoReg, 0x40);

	// Mode reg içerisine ilgili ayarlar yapılıyor
	// Transmit işlemi RF alan açıldığında başlayacak.
	// MFIN CPOL active HIGH
	// CRC Önişlemciye preset value olarak 6363H yüklenir.
	MFR522_WriteByte(ModeReg, 0x3D);

	// İnterrupt flagleri sıfırlandı
	ClearBitMask(CommIrqReg, 0x80);
	// Fifo Registerın 7. biti aktif edildi fifo tampon temizlenir.
	MFR522_WriteByte(FIFOLevelReg, 0x80);
	// İşlemden önce Mifare boşta komutu gönderilir
	MFR522_WriteByte(CommandReg, PCD_IDLE);

	// Anten kazancı max değere getirilir 48 db
	SetBitMask(RFCfgReg, 0x70);

	uint8_t temp;
	// Anten durumu kontrol edilir.
	temp = MFR522_ReadByte(TxControlReg);

	// Eğer RF alan açık değilse açılması gereken kod gonderilir.
	// RF alanı kontrol eden bitler son 2 bittir. o yüzden 0x03 ile kontrol edilir.
	if (!(temp & 0x03))
		SetBitMask(TxControlReg, 0x03);

	// Timer 1ms'ye ayarlandı. Transmit tamamlandığında başlayacak...
	MFR522_WriteByte(TModeReg, 0x80); 					//Tauto=1; f(Timer) = 6.78MHz/TPreScaler
	MFR522_WriteByte(TPrescalerReg, 0x8A);				//TModeReg[3..0] + TPrescalerReg
	MFR522_WriteByte(TReloadRegL, 0x30);
	MFR522_WriteByte(TReloadRegH, 0);

	// Transfer edilecek son byte'ın bit miktarı tanımlanır.
	MFR522_WriteByte(BitFramingReg, 0x07);
Picproje Eğitim Gönüllüleri ~ MrDarK

Mucit23

@MrDarK Ufak bir gelişme var. Ama bu gelişme Init ayarlarıyla düzelmedi. Anlamadım Önceki kütüphanede temel yapılan bir yanlış var ama bulamadım o yanlışı. Bende Pudn.com'dan Çinli arkadaşların yazmış olduğu bir kütüphaneyi denedim. O eksikte olsa çalıştı. Artık authentication hatası almıyorum ve Blok okuma yapabiliyorum. Fakat yazma yapamadım. Orada yine hata yapıyorum.

Test için şöyle bir rutin kullandım.
if(PcdRequest(PICC_REQIDL,&RevBuffer[0])==MI_OK)
		{
		   if(PcdAnticoll(&RevBuffer[2])==MI_OK)
			 {
			   printf("TAG Detected\r\n");
				 memcpy(Snr,&RevBuffer[2],4);
				 printf( "[%02X-%02X-%02X-%02X] \r\n", Snr[0], Snr[1], Snr[2], Snr[3]);
				 if(PcdSelect(Snr)==MI_OK)
				 {
				   	 printf("OK TAG Selected\r\n");
						 if(PcdAuthState(PICC_AUTHENT1A,7,PassWd,Snr)==MI_OK)
						 {
								printf("AUTH OK\r\n");
							  if(PcdRead(4,Read_Data)==MI_OK)
								{
								   printf("READ OK\r\n");
									 for(i=0;i<16;i++)
									printf("%02X:",Read_Data[i]);
									
									printf("\n\r");
								}
								
								if(PcdWrite(4,WriteData)==MI_OK)
								{
								  printf("Write OK\n\r");
								}
								else
								{
								  printf("Write ERROR\n\r");
								}
						 }				 	 
				 }
			 }

İlk Başta Request ile kart varmı yokmu onu sorguluyorum. Kart varsa Collision sorgusunu yapıyorum. Bu aşamadan da geçersem Select Tag yapıp sektör key ile authentication  işlemi yapıyorum. Bu aşamayı da sorunsuz geçip okuma yapabiliyorum. Okuduğum datalar doğru. Fakat yazma yapamadım. Aynı işlem sırasında okuma yerine yazma yapamıyorum.

Yazma için komut olarak 0xA0 gönderilmesi gerekiyor buffer'da, Benim kodda da öyle fakat hata alıyorum.

Başka dikkat etmem gereken birşey var mı?

MrDarK

Hocam selamlar,

Hazır kodları deneyerek iyi bir gelişme yakaladın :) Umarım sorununu halledersin.

Ben write işlem yaparken timer'ın timeout süresini 10ms'ye ayarlıyorum. Aşağıda write için değiştirdiğim ayarı ekledim. Bunun dışında ne yapabilirsin bilemiyorum. Yine sorun yaşarsan bence işin içine girmeden kenardan kenardan kaçamayacaksın gibi geliyor bana.

                // Timer 10ms'ye ayarlandı. Transmit tamamlandığında başlayacak...
                //Hesap Bilgisi; Period = ((Prescaler * 2 + 1)*(Treload+1))/13.56
                // 10ms = (277*490)/13,56 Mhz
                MFR522_WriteByte(TModeReg     , 0x80);              //Tauto=1; f(Timer) = 6.78MHz/TPreScaler
                MFR522_WriteByte(TPrescalerReg, 0x8A);              //TModeReg[3..0] + TPrescalerReg
                MFR522_WriteByte(TReloadRegL  , 0xD4);
                MFR522_WriteByte(TReloadRegH  , 0x03);
Picproje Eğitim Gönüllüleri ~ MrDarK

gokhangokcen

yeri gelmişken @MrDarK hocam benimde bir kaç sorum olacaktı. Anten kazancını arttırmak için
// Anten kazancı max değere getirilir 48 db
	SetBitMask(RFCfgReg, 0x70);

gibi bir kod kullandığınızı söylemişsiniz. Bu normal MFRC522 ürünlerinde herhangi bir değişiklilik yapmadan mı kullanılıyor? harici anten kullanmamız gerekli mi? Default olarak bu kazanç kaç olarak geliyordur? Örneğin default olarak orta seviye geldiğini varsayalım bunu max değere getirdiğimde okuma mesafesinde 5-6cm gibi bir değişim/artma olur mu?
Bildiğini paylaşmak, Allah'ın verdiği öğrenme yeteneğinin zekatıdır.

Mucit23

Yazma işleminden önce Timeri 10ms'ye ayarladım sizin yaptığınız gibi Ama düzelmedi.

Yazma işlemini aşağıdaki gibi yapıyorum.
char PcdWrite(u8   addr,u8 *p )
{
    char status;
    unsigned int  unLen;
    unsigned char i,ucComMF522Buf[MAXRLEN]; 
    
    ucComMF522Buf[0] = PICC_WRITE;
    ucComMF522Buf[1] = addr;

    CalulateCRC(ucComMF522Buf,2,&ucComMF522Buf[2]);
 
    status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,4,ucComMF522Buf,&unLen);

    if ((status != MI_OK) || (unLen != 4) || ((ucComMF522Buf[0] & 0x0F) != 0x0A))
    {   status = MI_ERR;   }
        
    if (status == MI_OK)
    {
        //memcpy(ucComMF522Buf, pData, 16);
        for (i=0; i<16; i++)
        {    ucComMF522Buf[i] = *(p+i);   }
        CalulateCRC(ucComMF522Buf,16,&ucComMF522Buf[16]);

        status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,18,ucComMF522Buf,&unLen);
        if ((status != MI_OK) || (unLen != 4) || ((ucComMF522Buf[0] & 0x0F) != 0x0A))
        {   status = MI_ERR;   }
    }
		
    
    return status;
}

 Debug'da kontrol ettiğimde en sondaki if sorgusunda hataya düşüyor. PcdComMF522 fonksiyonu yazma ve okuma yapıyor modüle. Burada 18Byte yazıp 4 byte okuma yapıyoruz. Gerçekten 4 byte okunuyor ama okunan datalardan 0. byte  ucComMF522Buf[0] 0x0A olmadığı için hataya düşüyor.

Yazma rutininde bunun ne anlama geldiğine bakmam lazım. Çünkü Yazma rutininin sonuna kadar sorunsuz işliyor ama en sondaki şarttan geçemiyor.

görkem

#80
source

#include "mfrc522.h"





void MFRC522_Init(SPI_t SPIx) {
	
	if(SPIL1==SPIx)
	{
	MFRC522_CS_HIGH;


   MFRC522_Reset(SPIx);

   MFRC522_WriteRegister(SPIx,MFRC522_REG_T_MODE, 0x8D);
   MFRC522_WriteRegister(SPIx,MFRC522_REG_T_PRESCALER, 0x3E);
   MFRC522_WriteRegister(SPIx,MFRC522_REG_T_RELOAD_L, 30);           
   MFRC522_WriteRegister(SPIx,MFRC522_REG_T_RELOAD_H, 0);

   /* 48dB gain */
 //  MFRC522_WriteRegister(SPIx,MFRC522_REG_RF_CFG, 0x70);
   
   MFRC522_WriteRegister(SPIx,MFRC522_REG_TX_AUTO, 0x40);
   MFRC522_WriteRegister(SPIx,MFRC522_REG_MODE, 0x3D);

   MFRC522_AntennaOn(SPIx);      //Open the antenna
		
		
		
	}
	else
	{
	
	
	
MFRC522_CS_HIGH2;


   MFRC522_Reset(SPIx);

   MFRC522_WriteRegister(SPIx,MFRC522_REG_T_MODE, 0x8D);
   MFRC522_WriteRegister(SPIx,MFRC522_REG_T_PRESCALER, 0x3E);
   MFRC522_WriteRegister(SPIx,MFRC522_REG_T_RELOAD_L, 30);           
   MFRC522_WriteRegister(SPIx,MFRC522_REG_T_RELOAD_H, 0);

   /* 48dB gain */
   //MFRC522_WriteRegister(SPIx,MFRC522_REG_RF_CFG, 0x70);
   
   MFRC522_WriteRegister(SPIx,MFRC522_REG_TX_AUTO, 0x40);
   MFRC522_WriteRegister(SPIx,MFRC522_REG_MODE, 0x3D);

   MFRC522_AntennaOn(SPIx);      //Open the antenna
}
	}



 MFRC522_Status_t MFRC522_Check(SPI_t SPIx,uint8_t* id) {
   MFRC522_Status_t status;
   //Find cards, return card type
   status = MFRC522_Request(SPIx,PICC_REQIDL, id);   
   if (status == MI_OK) {
      //Card detected
      //Anti-collision, return card serial number 4 bytes
      status = MFRC522_Anticoll(SPIx,id);   
   }
 //  MFRC522_Halt(SPIx);         //Command card into hibernation 

   return status;
}

MFRC522_Status_t MFRC522_Compare(uint8_t* CardID, uint8_t* CompareID) {
   uint8_t i;
	
	
   for (i = 0; i < 4; i++) {
		 CompareID[i]=CardID[i];
      if (CardID[i] != CompareID[i]) {
         break;
      } return MI_ERR;
		}
   
   return MI_OK;
}


   

   


void MFRC522_WriteRegister(SPI_t SPIx,uint8_t addr, uint8_t val) {
   //CS low
	if(SPIL1==SPIx)
	{
		
		  MFRC522_CS_LOW;
   //Send address
	addr=addr << 1;
	addr=addr & 0x7E;
	
   HAL_SPI_Transmit(&hspi1,&addr,1,500);
   //Send data   
   HAL_SPI_Transmit(&hspi1,&val,1,500);
   //CS high
   MFRC522_CS_HIGH;

	}
	else
	{
   MFRC522_CS_LOW2;
   //Send address
	addr=addr << 1;
	addr=addr & 0x7E;
	
   HAL_SPI_Transmit(&hspi2,&addr,1,500);
   //Send data   
   HAL_SPI_Transmit(&hspi2,&val,1,500);
   //CS high
   MFRC522_CS_HIGH2;
	}
}

uint8_t MFRC522_ReadRegister(SPI_t SPIx,uint8_t addr){
   uint8_t val;
	if(SPIL1==SPIx)
	{
   //CS low
   MFRC522_CS_LOW;
addr=addr << 1;
	addr=addr & 0x7E;
	addr=addr | 0x80;
   HAL_SPI_Transmit(&hspi1,&addr,1,500);  
	
   HAL_SPI_Transmit(&hspi1,MFRC522_DUMMY,1,500);	
	
   HAL_SPI_Receive(&hspi1,&val,1,500);
   //CS high
   MFRC522_CS_HIGH;

   return val;   
	}
	else
	{
	   //CS low
   MFRC522_CS_LOW2;
addr=addr << 1;
	addr=addr & 0x7E;
	addr=addr | 0x80;
   HAL_SPI_Transmit(&hspi2,&addr,1,500);  
	
   HAL_SPI_Transmit(&hspi2,MFRC522_DUMMY,1,500);	
	
   HAL_SPI_Receive(&hspi2,&val,1,500);
   //CS high
   MFRC522_CS_HIGH2;

   return val;  
	}
	
	
}

void MFRC522_SetBitMask(SPI_t SPIx,uint8_t reg, uint8_t mask) {
   MFRC522_WriteRegister(SPIx,reg, MFRC522_ReadRegister(SPIx,reg) | mask);
}

void MFRC522_ClearBitMask(SPI_t SPIx,uint8_t reg, uint8_t mask){
   MFRC522_WriteRegister(SPIx,reg, MFRC522_ReadRegister(SPIx,reg) & (~mask));
} 

void MFRC522_AntennaOn(SPI_t SPIx) {
   uint8_t temp;

   temp = MFRC522_ReadRegister(SPIx,MFRC522_REG_TX_CONTROL);
   if (!(temp & 0x03)) {
      MFRC522_SetBitMask(SPIx,MFRC522_REG_TX_CONTROL, 0x03);
   }
}

void MFRC522_AntennaOff(SPI_t SPIx) {
   MFRC522_ClearBitMask(SPIx,MFRC522_REG_TX_CONTROL, 0x03);
}

void MFRC522_Reset(SPI_t SPIx) {
   MFRC522_WriteRegister(SPIx,MFRC522_REG_COMMAND, PCD_RESETPHASE);
}

MFRC522_Status_t MFRC522_Request(SPI_t SPIx,uint8_t reqMode, uint8_t* TagType) {
   MFRC522_Status_t status;  
   uint16_t backBits;         //The received data bits

   MFRC522_WriteRegister(SPIx,MFRC522_REG_BIT_FRAMING, 0x07);      //TxLastBists = BitFramingReg[2..0]   ???

   TagType[0] = reqMode;
   status = MFRC522_ToCard(SPIx,PCD_TRANSCEIVE, TagType, 1, TagType, &backBits);

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

   return status;
}

MFRC522_Status_t MFRC522_ToCard(SPI_t SPIx,uint8_t command, uint8_t* sendData, uint8_t sendLen, uint8_t* backData, uint16_t* backLen) {
   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;
   }

   MFRC522_WriteRegister(SPIx,MFRC522_REG_COMM_IE_N, irqEn | 0x80);
   MFRC522_ClearBitMask(SPIx,MFRC522_REG_COMM_IRQ, 0x80);
   MFRC522_SetBitMask(SPIx,MFRC522_REG_FIFO_LEVEL, 0x80);

   MFRC522_WriteRegister(SPIx,MFRC522_REG_COMMAND, PCD_IDLE);

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

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

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

   MFRC522_ClearBitMask(SPIx,MFRC522_REG_BIT_FRAMING, 0x80);         //StartSend=0

   if (i != 0)  {
      if (!(MFRC522_ReadRegister(SPIx,MFRC522_REG_ERROR) & 0x1D)) { //0x1D olmasi gerekiyormus. bariyerde 0x1B
         status = MI_OK;
         if (n & irqEn & 0x01) {   
            status = MI_NOTAGERR;         
         }

         if (command == PCD_TRANSCEIVE) {
            n = MFRC522_ReadRegister(SPIx,MFRC522_REG_FIFO_LEVEL);
            lastBits = MFRC522_ReadRegister(SPIx,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] = MFRC522_ReadRegister(SPIx,MFRC522_REG_FIFO_DATA);    
            }
         }
      } else {   
         status = MI_ERR;  
      }
   }

   return status;
}

MFRC522_Status_t MFRC522_Anticoll(SPI_t SPIx,uint8_t* serNum) {
   MFRC522_Status_t status;
   uint8_t i;
   uint8_t serNumCheck = 0;
   uint16_t unLen;

   MFRC522_WriteRegister(SPIx,MFRC522_REG_BIT_FRAMING, 0x00);      //TxLastBists = BitFramingReg[2..0]

   serNum[0] = PICC_ANTICOLL;
   serNum[1] = 0x20;
   status = MFRC522_ToCard(SPIx,PCD_TRANSCEIVE, serNum, 2, serNum, &unLen);
//(uint8_t command, uint8_t* sendData, uint8_t sendLen, uint8_t* backData, uint16_t* backLen) {
   if (status == MI_OK) {
      //Check card serial number
      for (i = 0; i < 4; i++) {   
         serNumCheck ^= serNum[i];
      }
      if (serNumCheck != serNum[i]) {   
         status = MI_ERR;    
      }
   }
   return status;
} 

void MFRC522_CalculateCRC(SPI_t SPIx,uint8_t*  pIndata, uint8_t len, uint8_t* pOutData) {
   uint8_t i, n;

   MFRC522_ClearBitMask(SPIx,MFRC522_REG_DIV_IRQ, 0x04);         //CRCIrq = 0
   MFRC522_SetBitMask(SPIx,MFRC522_REG_FIFO_LEVEL, 0x80);         //Clear the FIFO pointer
   //Write_MFRC522(CommandReg, PCD_IDLE);

   //Writing data to the FIFO   
   for (i = 0; i < len; i++) {   
      MFRC522_WriteRegister(SPIx,MFRC522_REG_FIFO_DATA, *(pIndata+i));   
   }
   MFRC522_WriteRegister(SPIx,MFRC522_REG_COMMAND, PCD_CALCCRC);

   //Wait CRC calculation is complete
   i = 0xFF;
   do {
      n = MFRC522_ReadRegister(SPIx,MFRC522_REG_DIV_IRQ);
      i--;
   } while ((i!=0) && !(n&0x04));         //CRCIrq = 1

   //Read CRC calculation result
   pOutData[0] = MFRC522_ReadRegister(SPIx,MFRC522_REG_CRC_RESULT_L);
   pOutData[1] = MFRC522_ReadRegister(SPIx,MFRC522_REG_CRC_RESULT_M);
}

uint8_t MFRC522_SelectTag(SPI_t SPIx,uint8_t* serNum) {
   uint8_t i;
   MFRC522_Status_t status;
   uint8_t size;
   uint16_t recvBits;
   uint8_t buffer[9]; 

   buffer[0] = PICC_SElECTTAG;
   buffer[1] = 0x70;
   for (i = 0; i < 5; i++) {
      buffer[i+2] = *(serNum+i);
   }
   MFRC522_CalculateCRC(SPIx,buffer, 7, &buffer[7]);      //??
   status = MFRC522_ToCard(SPIx,PCD_TRANSCEIVE, buffer, 9, buffer, &recvBits);

   if ((status == MI_OK) && (recvBits == 0x18)) {   
      size = buffer[0]; 
   } else {   
      size = 0;    
   }

   return size;
}

MFRC522_Status_t MFRC522_Auth(SPI_t SPIx,uint8_t authMode, uint8_t BlockAddr, uint8_t* Sectorkey, uint8_t* serNum) {
   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 = MFRC522_ToCard(SPIx,PCD_AUTHENT, buff, 12, buff, &recvBits);

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

MFRC522_Status_t MFRC522_Read(SPI_t SPIx,uint8_t blockAddr, uint8_t* recvData) {
   MFRC522_Status_t status;
   uint16_t unLen;

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

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

   return status;
}

MFRC522_Status_t MFRC522_Write(SPI_t SPIx,uint8_t blockAddr, uint8_t* writeData) {
   MFRC522_Status_t status;
   uint16_t recvBits;
   uint8_t i;
   uint8_t buff[18]; 

   buff[0] = PICC_WRITE;
   buff[1] = blockAddr;
   MFRC522_CalculateCRC(SPIx,buff, 2, &buff[2]);
   status = MFRC522_ToCard(SPIx,PCD_TRANSCEIVE, buff, 4, buff, &recvBits);

   if ((status != MI_OK) || (recvBits != 4) || ((buff[0] & 0x0F) != 0x0A)) {   
      status = MI_ERR;   
   }

   if (status == MI_OK) {
      //Data to the FIFO write 16Byte
      for (i = 0; i < 16; i++) {    
         buff[i] = *(writeData+i);   
      }
      MFRC522_CalculateCRC(SPIx,buff, 16, &buff[16]);
      status = MFRC522_ToCard(SPIx,PCD_TRANSCEIVE, buff, 18, buff, &recvBits);

      if ((status != MI_OK) || (recvBits != 4) || ((buff[0] & 0x0F) != 0x0A)) {   
         status = MI_ERR;   
      }
   }

   return status;
}


MFRC522_Status_t MFRC522_Halt(SPI_t SPIx) {
   uint16_t unLen;
   uint8_t buff[4]; 
 MFRC522_Status_t status;
	
   buff[0] = PICC_HALT;
   buff[1] = 0;
   MFRC522_CalculateCRC(SPIx,buff, 2, &buff[2]);

   status= MFRC522_ToCard(SPIx,PCD_TRANSCEIVE, buff, 4, buff, &unLen);
   MFRC522_ClearBitMask(SPIL1,MFRC522_REG_STATUS2 ,0x08);
	 return status; 
}




Header


#ifndef MFRC522_H
#define MFRC522_H 

#include "stm32f1xx_hal.h"                  // Device header
#include "stm32f1xx_hal_gpio.h"
#include "stm32f1xx_hal_spi.h"

extern SPI_HandleTypeDef hspi1;

extern SPI_HandleTypeDef hspi2;

typedef enum {
   MI_OK = 0,
   MI_NOTAGERR,
   MI_ERR
} MFRC522_Status_t;


typedef enum {
	SPIL1=0,
	SPIL2
} SPI_t;



#define MFRC522_CS_LOW              HAL_GPIO_WritePin(GPIOA,GPIO_PIN_4,GPIO_PIN_RESET);
#define MFRC522_CS_HIGH             HAL_GPIO_WritePin(GPIOA,GPIO_PIN_4,GPIO_PIN_SET);

#define MFRC522_CS_LOW2             HAL_GPIO_WritePin(GPIOA,GPIO_PIN_8,GPIO_PIN_RESET);
#define MFRC522_CS_HIGH2            HAL_GPIO_WritePin(GPIOA,GPIO_PIN_8,GPIO_PIN_SET);



/* MFRC522 Commands */
#define PCD_IDLE                  0x00   //NO action; Cancel the current command
#define PCD_AUTHENT                  0x0E   //Authentication Key
#define PCD_RECEIVE                  0x08   //Receive Data
#define PCD_TRANSMIT               0x04   //Transmit data
#define PCD_TRANSCEIVE               0x0C   //Transmit and receive data,
#define PCD_RESETPHASE               0x0F   //Reset
#define PCD_CALCCRC                  0x03   //CRC Calculate

/* Mifare_One card command word */
#define PICC_REQIDL                  0x26   // find the antenna area does not enter hibernation
#define PICC_REQALL                  0x52   // find all the cards antenna area
#define PICC_ANTICOLL               0x93   // anti-collision
#define PICC_SElECTTAG               0x93   // election card
#define PICC_AUTHENT1A               0x60   // authentication key A
#define PICC_AUTHENT1B               0x61   // authentication key B
#define PICC_READ                  0x30   // Read Block
#define PICC_WRITE                  0xA0   // write block
#define PICC_DECREMENT               0xC0   // debit
#define PICC_INCREMENT               0xC1   // recharge
#define PICC_RESTORE               0xC2   // transfer block data to the buffer
#define PICC_TRANSFER               0xB0   // save the data in the buffer
#define PICC_HALT                  0x50   // Sleep

/* MFRC522 Registers */
//Page 0: Command and Status
#define MFRC522_REG_RESERVED00         0x00    
#define MFRC522_REG_COMMAND            0x01    
#define MFRC522_REG_COMM_IE_N         0x02    
#define MFRC522_REG_DIV1_EN            0x03    
#define MFRC522_REG_COMM_IRQ         0x04    
#define MFRC522_REG_DIV_IRQ            0x05
#define MFRC522_REG_ERROR            0x06    
#define MFRC522_REG_STATUS1            0x07    
#define MFRC522_REG_STATUS2            0x08    
#define MFRC522_REG_FIFO_DATA         0x09
#define MFRC522_REG_FIFO_LEVEL         0x0A
#define MFRC522_REG_WATER_LEVEL         0x0B
#define MFRC522_REG_CONTROL            0x0C
#define MFRC522_REG_BIT_FRAMING         0x0D
#define MFRC522_REG_COLL            0x0E
#define MFRC522_REG_RESERVED01         0x0F
//Page 1: Command 
#define MFRC522_REG_RESERVED10         0x10
#define MFRC522_REG_MODE            0x11
#define MFRC522_REG_TX_MODE            0x12
#define MFRC522_REG_RX_MODE            0x13
#define MFRC522_REG_TX_CONTROL         0x14
#define MFRC522_REG_TX_AUTO            0x15
#define MFRC522_REG_TX_SELL            0x16
#define MFRC522_REG_RX_SELL            0x17
#define MFRC522_REG_RX_THRESHOLD      0x18
#define MFRC522_REG_DEMOD            0x19
#define MFRC522_REG_RESERVED11         0x1A
#define MFRC522_REG_RESERVED12         0x1B
#define MFRC522_REG_MIFARE            0x1C
#define MFRC522_REG_RESERVED13         0x1D
#define MFRC522_REG_RESERVED14         0x1E
#define MFRC522_REG_SERIALSPEED         0x1F
//Page 2: CFG    
#define MFRC522_REG_RESERVED20         0x20  
#define MFRC522_REG_CRC_RESULT_M      0x21
#define MFRC522_REG_CRC_RESULT_L      0x22
#define MFRC522_REG_RESERVED21         0x23
#define MFRC522_REG_MOD_WIDTH         0x24
#define MFRC522_REG_RESERVED22         0x25
#define MFRC522_REG_RF_CFG            0x26
#define MFRC522_REG_GS_N            0x27
#define MFRC522_REG_CWGS_PREG         0x28
#define MFRC522_REG__MODGS_PREG         0x29
#define MFRC522_REG_T_MODE            0x2A
#define MFRC522_REG_T_PRESCALER         0x2B
#define MFRC522_REG_T_RELOAD_H         0x2C
#define MFRC522_REG_T_RELOAD_L         0x2D
#define MFRC522_REG_T_COUNTER_VALUE_H   0x2E
#define MFRC522_REG_T_COUNTER_VALUE_L   0x2F
//Page 3:TestRegister 
#define MFRC522_REG_RESERVED30         0x30
#define MFRC522_REG_TEST_SEL1         0x31
#define MFRC522_REG_TEST_SEL2         0x32
#define MFRC522_REG_TEST_PIN_EN         0x33
#define MFRC522_REG_TEST_PIN_VALUE      0x34
#define MFRC522_REG_TEST_BUS         0x35
#define MFRC522_REG_AUTO_TEST         0x36
#define MFRC522_REG_VERSION            0x37
#define MFRC522_REG_ANALOG_TEST         0x38
#define MFRC522_REG_TEST_ADC1         0x39  
#define MFRC522_REG_TEST_ADC2         0x3A   
#define MFRC522_REG_TEST_ADC0         0x3B   
#define MFRC522_REG_RESERVED31         0x3C   
#define MFRC522_REG_RESERVED32         0x3D
#define MFRC522_REG_RESERVED33         0x3E   
#define MFRC522_REG_RESERVED34         0x3F
//Dummy byte
#define MFRC522_DUMMY               0x00

#define MFRC522_MAX_LEN               16

/**
 * Public functions
 */
/**
 * Initialize MFRC522 RFID reader
 *
 * Prepare MFRC522 to work with RFIDs
 *
 */
extern void MFRC522_Init(SPI_t SPIx);

/**
 * Check for RFID card existance
 *
 * Parameters:
 *    - uint8_t* id:
 *       Pointer to 5bytes long memory to store valid card id in.
 *       ID is valid only if card is detected, so when function returns MI_OK
 *
 * Returns MI_OK if card is detected
 */
 
extern MFRC522_Status_t MFRC522_Check(SPI_t SPIx,uint8_t* id);

/**
 * Compare 2 RFID ID's
 * Useful if you have known ID (database with allowed IDs), to compare detected card with with your ID
 *
 * Parameters:
 *    - uint8_t* CardID:
 *       Pointer to 5bytes detected card ID
 *    - uint8_t* CompareID:
 *       Pointer to 5bytes your ID
 *
 * Returns MI_OK if IDs are the same, or MI_ERR if not
 */
extern MFRC522_Status_t MFRC522_Compare(uint8_t* CardID, uint8_t* CompareID);

/**
 * Private functions
 */
extern void MFRC522_InitPins(void);
extern void MFRC522_WriteRegister(SPI_t SPIx,uint8_t addr, uint8_t val);
extern uint8_t MFRC522_ReadRegister(SPI_t SPIx,uint8_t addr);
extern void MFRC522_SetBitMask(SPI_t SPIx,uint8_t reg, uint8_t mask);
extern void MFRC522_ClearBitMask(SPI_t SPIx,uint8_t reg, uint8_t mask);
extern void MFRC522_AntennaOn(SPI_t SPIx);
extern void MFRC522_AntennaOff(SPI_t SPIx);
extern void MFRC522_Reset(SPI_t SPIx);
extern MFRC522_Status_t MFRC522_Request(SPI_t SPIx,uint8_t reqMode, uint8_t* TagType);
extern MFRC522_Status_t MFRC522_ToCard(SPI_t SPIx,uint8_t command, uint8_t* sendData, uint8_t sendLen, uint8_t* backData, uint16_t* backLen);
extern MFRC522_Status_t MFRC522_Anticoll(SPI_t SPIx,uint8_t* serNum);
extern void MFRC522_CalculateCRC(SPI_t SPIx,uint8_t* pIndata, uint8_t len, uint8_t* pOutData);
extern uint8_t MFRC522_SelectTag(SPI_t SPIx,uint8_t* serNum);
extern MFRC522_Status_t MFRC522_Auth(SPI_t SPIx,uint8_t authMode, uint8_t BlockAddr, uint8_t* Sectorkey, uint8_t* serNum);
extern MFRC522_Status_t MFRC522_Read(SPI_t SPIx,uint8_t blockAddr, uint8_t* recvData);
extern MFRC522_Status_t MFRC522_Write(SPI_t SPIx,uint8_t blockAddr, uint8_t* writeData);
extern MFRC522_Status_t MFRC522_Halt(SPI_t SPIx);


#endif

mainde kullandığım

MFRC522_Check(SPIL1,UUID);  //kartı okuyun 

MFRC522_SelectTag(SPIL1,serial);// okunan kartı seçin 

for(uint8_t i=0;i<64;i++)
{
status=MFRC522_Auth(SPIL1,PICC_AUTHENT1A,i,sifreA,serial);   //i değişkeni sektörü ifade eder 64 e kadar gider döngü içinde  şifreA standart FF den oluşan şifre ,Serial değişkeni  kartın ID si

if(status == MI_OK) { // statu değişkeni eğer eşleşiyorsa 
	 
MFRC522_Write(SPIL1,i,sector_data);  sector data 16 bytelık değişken veriyi yazabilirsiniz  i yerine istediğin block adresi girebilirsin 64 e kadar 

}
  MFRC522_Halt(SPIL1);   bağlantı sonlandırılıyor.


ben aktif olarak bu fonksiyonlar ile veri yazıp okuyabiliyorum.

Mucit23

@görkem Örnek için teşekkürler. Şimdi senin örneği HAL library ile denedim ama senin örneği hiç çalıştıramadım. SPI init fonksiyonlarını göremedim. Sende SPI BaudPrescaller değeri neydi? Ben bir önceki denemiş olduğum kütüphanede baudrate değerini 8 yaparak denemiştim. Yani 9Mhz. O kütüphanede Check ve Select Tag işlemlerinde sorun olmayıp Sadece Auth işleminde sorun yaşıyordum. Senin örnekte SPI ayarlarını ben yaptım. SPI harici olarak çalışıyor test ettim. Fakat Check işlemi bile geçemiyorum. Özellikle dikkat etmem gereken birşey var mı?

Bu arada senin rutinleri inceliyorum. Gördüğüm tek fark TM_MFRC522_ToCard fonksiyonundaki aşağıdaki satırda. Başkada bir fark yok.

//Waiting to receive data to complete
	i = 25;	//i according to the clock frequency adjustment, the operator M1 card maximum waiting time 25ms???
	do {
		delay_ms(1);
		//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));

Sen doğrudan max döngü süresini 25ms olacak şekilde ayarlamışsın sanırım. Bende öyle yaptım ama Auth problemine çözüm olmadı. Hala sektöre giriş yapamıyorum.

MrDarK

Alıntı yapılan: gokhangokcen - 13 Mart 2019, 17:48:40yeri gelmişken @MrDarK hocam benimde bir kaç sorum olacaktı. Anten kazancını arttırmak için
gibi bir kod kullandığınızı söylemişsiniz. Bu normal MFRC522 ürünlerinde herhangi bir değişiklilik yapmadan mı kullanılıyor? harici anten kullanmamız gerekli mi? Default olarak bu kazanç kaç olarak geliyordur? Örneğin default olarak orta seviye geldiğini varsayalım bunu max değere getirdiğimde okuma mesafesinde 5-6cm gibi bir değişim/artma olur mu?

Gökhan hocam, ekte yeni bir resim ekledim. Datasheet'e göre 33dB değeri default olarak yüklendiği görünüyor. Anten alıcı kazancını etkiliyor. Durumunuza göre deneyerek test yapabilirsiniz. Mifare'de sağlıklı iletişim için 5-6 cmden fazla çıkılabildiğini görmedim.

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

Mucit23

Sorunu çözdüm bu arada yazma okuma yapabiliyorum. SPI BaudRate değerini 140Khz lere düşürdüm. Aynı zamanda yazma fonksiyonunda da buffer boyutunda eksiklik vardı.

Şuan kütüphaneyi toparlıyorum.

görkem

#84
@Mucit23 Ben bir problem yaşamadım 6Mhz ile haberleştiriyordum.kütüphaneler aynıydı sadece üzerinde bir kaç oynama yapmıştım ben timer değerini değiştirmiştim.

Yaşadığınız problem neydi ?

Mucit23

Sizin projede hiç haberleşemedim. Yani modül cevap vermiyordu. SPI ayarları yoktu onu kendim yaptım. SPI fonksiyonlarını bağımsız olarak test ettim yazma ve okuma yapıldığını gördüm. Gerisi Çalışması gerekir diye düşündüm. Belki derlenebilen proje olarak denenebilir. Mutlaka eksik yaptığım birkaç birşey var. Onun yanı sıra pudn dan elde ettiğim kütüphaneyi düzenleyerek güzel bir kütüphane oluşturdum. Şuan gayet güzel çalışıyor.

Birşey sormak istiyorum. MFRC522_Halt() fonksiyonu ile kart ile haberleşmemizin bittiğini söylüyoruz. Bu durumda yeni haberleşme için modül'ün kartın ayrılmasını beklemesi gerekmiyormu? Şuanki durumda kart modül üzerinde olduğu sürece sürekli okuma veya yazma yapılıyor. Bunu manuel kendim çözebilirim ama sanki Modülde öyle bir özellik vardı.

MrDarK

@Mucit23 karta Halt dediğin durumda oturumu kapat demiş oluyorsun. Kart ile iletişimde aldığın yetkiler gidiyor. Modül kartın ayrılmasını beklemiyor. Sadece aralarındaki iletişim sonlanıyor. Eğer tekrar iletişim kurmak istersen tüm fazları baştan yapmalısın. Request -> Anticoll -> Select gibi..
Picproje Eğitim Gönüllüleri ~ MrDarK

Hiko_sv

@ Mucit23  Can you send the project to my email? (gordienkonikolay.nsk@gmail.com)
because I have the same problem now: TM_MFRC522_Auth returns MI_ERR (

cyber_cemati

Merhaba arkadaşlar. Ben de rc522 modülü ile devre yapmaya çalışıyorum. Picbasic dili kullanıyorum. spi haberleşme yapıyorum. Versiyon numarası ile test verilerini okuyabiliyorum. Ancak kart okuma yapamadım. Basit bir şekilde okuma yapmam için hangi yolu izlemeliyim. Yardımcı olursanız sevinirim.

cyber_cemati

MrDark hocam. Bana da yardımcı olmanız mümkün mü? En azından okuma prosedürü nasıl işliyor? Bilirsem kendim program yazmaya çalışırım.
En basitinden okuma nasıl yapılır?