Picproje Elektronik Sitesi

ENDÜSTRiYEL OTOMASYON => Endüstriyel Elektronik => Konuyu başlatan: MrDarK - 01 Mayıs 2014, 15:17:30

Başlık: RFID(MFRC522) İncelemesi Hakkında Kısa Kısa
Gönderen: MrDarK - 01 Mayıs 2014, 15:17:30
Merhaba arkadaşlar ;

Bugün kısa kısa çok detaylara girmeden sizlere RFID ile ilgili bilinmeyen bazı şeylerden bahsetmek istiyorum.

Öncelikle konunun seviye olarak orta kısımlara hitap ettiğini söylemeliyim. Mifare kartlar ve onlara ait donanımlarla çalışma fırsatı buldum. Şimdilik bilgilerim RFID konusunda bu alana yakın.

Bu donanımlarla çalışmak isteyenlere Allah şimdiden sabır versin. Çünkü güvenlik gerekçesiyle birçok döküman parça parça farklı farklı kişiler tarafından ele alınmış ve genel anlamda gizli tutulmaya çalışılmış. Protokol fazla dallandırmamış ki kimse kırmaya çalışmasın güvenlik sağlam kalsın. Oda ne ? 2008 yılında bir üniversite tarafından Mifare standardının kırıldığını görebiliyoruz.

Buna rağmen birçok firma hala mifare gibi donanımların yeterli güvenlik sunduğunu biliyor ve projelerinde kullanabiliyorlar.

Gelelim kullanımına ;

(http://imgs.inkfrog.com/pix/ebayimage2012/24713-1.jpg)

Mifare bence en güzel en hızlı SPI ile kumanda edilir. MFRC522 takılı modülleri yurt dışında 5$'a türkiye içinde ise 20 TL gibi bir fiyata bulabilirsiniz.

Yurt içinden modülü temin ettik gelelim kodlamaya ; İnternette Arduino ile yazılmış çok güzel kodlar var. Veya ARM serisi chipler için geliştirilmiş Ansi kodlar mevcut. Arduino ile yazılmış bir kütüphaneyi kendi kullandığım işlemciye göre düzenleyip çalıştırdım. Gelelim internette pekte bilgi bulunmayan bazı konulara.

(http://s9.postimg.cc/qwfrkro6n/MFRC_tan_ma.jpg)

(http://s9.postimg.cc/cr9yiyf5b/MFRC_tan_ma2.jpg)

Öncelikle RF alana REQA denilen bir bilgi yolluyoruz. Eğer RF alan içinde bir mifare kart var ise bize cevap yolluyor. Ardından RF alana kartın seri numarasını öğrenmek için bir kod yolluyoruz. Kart seri numarasını gönderiyor. Ardından Anticollision (çarpışmama) RF alanda birden başka bir kart olmadığını teyit ettikten sonra Select denilen işlemi yapıyoruz.

Mifare Kart ile donanım şu noktada neredeyse hazır gibiler. Buradan sonra Sector Trailer denen alandan izin almamız gerekiyor.

RF alana bağlanmak istediğimiz sector trailerın key kodunu vs bilgileri yükleyip gönderiyoruz. Eğer gönderdiğimiz key bilgisi doğru ise RF kart onay veriyor ve kartın iznini aldığımı sectorunun istediğimiz bloğunu yaz sil azalt ve çoğalt işlemleri gerçekleştirebiliyoruz.

Şimdilik bu çetrefilli konudaki bilgileri burada sonlandırıyorum.

Kısa kısa soru cevap şeklinde ilerleyelim istiyorum. Ülkemizde bu çok yaygın kullanılan donanımın türkçe herhangi bir dökümanı olmayışı , kafalarda çok fazla soru işareti olması ve Picproje gibi bir sitede böyle bir dökümanın yıllarca kalmasını arzu ederek cümlelerime son veriyorum.

Arduino Kütüphane Linki : https://github.com/miguelbalboa/rfid (https://github.com/miguelbalboa/rfid)

Fazlasıyla açıklamalı çok daha önerdiğim kütüphane linki : https://github.com/miguelbalboa/rfid/blob/master/MFRC522.cpp (https://github.com/miguelbalboa/rfid/blob/master/MFRC522.cpp)

Saygılarımla Efendim.
MrDarK
Başlık: Ynt: RFID(MFRC522) İncelemesi Hakkında Kısa Kısa
Gönderen: kantirici - 01 Mayıs 2014, 17:37:24
teşekkürler hocam. Bende bu modülü almıştım ama iç uğraşmadım. Yazıdan sonra bi et atayım artık. Ayrıca arduino da aldı başını gitti. Ne arıyorsan bi kütüphanesi var.
Başlık: Ynt: RFID(MFRC522) İncelemesi Hakkında Kısa Kısa
Gönderen: MrDarK - 01 Mayıs 2014, 20:12:11
Güzel bir alet fakat epey saç baş yoldurdu fakat artık iyi anlaşabiliyoruz. Forumda da epey bu konuda sıkıntı yaşayan olduğunu okumuştum. O yüzden kısa bir giriş manasında bu yazıyı yazdım bakalım hayırlısı :)
Başlık: Ynt: RFID(MFRC522) İncelemesi Hakkında Kısa Kısa
Gönderen: xoom - 01 Mayıs 2014, 20:24:48
keşke CCS C veya C dili ile başlasaydınız :)
Başlık: Ynt: RFID(MFRC522) İncelemesi Hakkında Kısa Kısa
Gönderen: MrDarK - 01 Mayıs 2014, 22:19:04
Arduino ile yazılmış olan bir kütüphaneyi zaten kendi kullandığımız işlemciye göre C diline uyarladım. CCS'e aynı kütüphaneyi uyarlamak oldukça basit olmalı.

Kendinizde yapabilirsiniz zaten Arduino yarım C sayılır bu kütüphanede hazır olan bir fonksiyon yok ki ? Kodları inceleyip korkmanızı gerektirecek birşey yok. C'ye oldukça uyumlu arduino
Başlık: Ynt: RFID(MFRC522) İncelemesi Hakkında Kısa Kısa
Gönderen: justice_for_all - 13 Ekim 2014, 09:28:58
ben arduino ile linkini verdiğiniz örneği yükledim ama kartın seri numarasını bi türlü öğrenemedim bu neden olur?artık kartın bozuk olduğunu düşünmeye başladım.
Başlık: Ynt: RFID(MFRC522) İncelemesi Hakkında Kısa Kısa
Gönderen: MrDarK - 13 Ekim 2014, 09:48:50
Alıntı yapılan: justice_for_all - 13 Ekim 2014, 09:28:58
ben arduino ile linkini verdiğiniz örneği yükledim ama kartın seri numarasını bi türlü öğrenemedim bu neden olur?artık kartın bozuk olduğunu düşünmeye başladım.

Kullandığınız kart kitle beraber gelen kart beyaz şeffaf kart mı yoksa başka bir mifare plus veya diğer türlerinden olabilir mi ? Ben direk takıp çalıştırabilmiştim.
Başlık: Ynt: RFID(MFRC522) İncelemesi Hakkında Kısa Kısa
Gönderen: justice_for_all - 13 Ekim 2014, 10:20:34
kitle beraber gelen kart ayrıca anahtarlık şeklinde gelen vardı onuda denedim hocam onuda okuyamadım.
Başlık: Ynt: RFID(MFRC522) İncelemesi Hakkında Kısa Kısa
Gönderen: MrDarK - 13 Ekim 2014, 10:33:41
Alıntı yapılan: justice_for_all - 13 Ekim 2014, 10:20:34
kitle beraber gelen kart ayrıca anahtarlık şeklinde gelen vardı onuda denedim hocam onuda okuyamadım.

Bağlantılarınızda bir problem olmalı veya donanımda hata olabilir (düşükte olsa), en mantıklı ve doğru çözüm logic analyser ile akışa bakmak olacaktır. Yoksa birşey demek zor. Modulu yurt dışından mı almıştınız ?
Başlık: Ynt: RFID(MFRC522) İncelemesi Hakkında Kısa Kısa
Gönderen: justice_for_all - 13 Ekim 2014, 10:38:05
Bağlantılarım doğru bikaç kez kontrol ettim.Aliexpressten getirtmiştim.Modul 3.3 v ile çalışyor ben ardunio kartı 5 v ile besliyorum acaba SPI pinlerinide mi 3.3 volt ile vermem gerekti?
Başlık: Ynt: RFID(MFRC522) İncelemesi Hakkında Kısa Kısa
Gönderen: muhittin_kaplan - 13 Ekim 2014, 11:17:34
aynı durumu stm32 için bende yaşıyorum.
bende yurtdışından RC522 aldım.
Başlık: Ynt: RFID(MFRC522) İncelemesi Hakkında Kısa Kısa
Gönderen: justice_for_all - 13 Ekim 2014, 11:19:00
if (TM_MFRC522_Check(CardID) == MI_OK)

burdan geçemiyor benimki hocam.Ya sizinki
Başlık: Ynt: RFID(MFRC522) İncelemesi Hakkında Kısa Kısa
Gönderen: X-Fi - 13 Ekim 2014, 11:23:06
Bekleme süreleri önemli authenticate olma sırasındaki beklemeleri kontrol ediniz.
Başlık: Ynt: RFID(MFRC522) İncelemesi Hakkında Kısa Kısa
Gönderen: muhittin_kaplan - 13 Ekim 2014, 11:28:32
Alıntı yapılan: justice_for_all - 13 Ekim 2014, 11:19:00
if (TM_MFRC522_Check(CardID) == MI_OK)

burdan geçemiyor benimki hocam.Ya sizinki
aynen, bugün lojik ile kontrol edeceğim artık.
Başlık: Ynt: RFID(MFRC522) İncelemesi Hakkında Kısa Kısa
Gönderen: justice_for_all - 13 Ekim 2014, 11:31:25
Alıntı yapılan: muhittin_kaplan - 13 Ekim 2014, 11:28:32
aynen, bugün lojik ile kontrol edeceğim artık.

denemenizi bekliycem hocam.
Başlık: Ynt: RFID(MFRC522) İncelemesi Hakkında Kısa Kısa
Gönderen: muhittin_kaplan - 13 Ekim 2014, 11:34:20
http://birkodyaz.blogspot.com.tr/2014/09/stm32f4-stm32f429-discovery-ile-rfid.html (http://birkodyaz.blogspot.com.tr/2014/09/stm32f4-stm32f429-discovery-ile-rfid.html) de ayrı bir örnek ama aynı kütük.
Başlık: Ynt: RFID(MFRC522) İncelemesi Hakkında Kısa Kısa
Gönderen: justice_for_all - 13 Ekim 2014, 11:40:52
SPI pinlerinden 3.3v mu çıkış alıyorsunuz hocam siz?
Başlık: Ynt: RFID(MFRC522) İncelemesi Hakkında Kısa Kısa
Gönderen: muhittin_kaplan - 13 Ekim 2014, 11:51:29
hocam kit 3.3 v. ben stm32f4discovery (stm32f407vgt6) kullanıyorum. RC522 nin beslemesini discodan alıyorum. ölçtüm 2.9v. ama spi pinlerini kontrol etmedim.
Başlık: Ynt: RFID(MFRC522) İncelemesi Hakkında Kısa Kısa
Gönderen: justice_for_all - 13 Ekim 2014, 11:53:31
internetten bakıyorum 5 volt beslenen kartlara direkt olarak bağlamışlar SPI pinlerini ama data sheet te max 3.3 v diyor .Ya ben yalnış bakıyorum yada internette yapanlar yalnış bağlıyorlar.iyice kafam karıştı
Başlık: Ynt: RFID(MFRC522) İncelemesi Hakkında Kısa Kısa
Gönderen: selcukozb - 13 Ekim 2014, 12:20:54
Merhaba,

Ben de STM32F103 ile MFRC522 yi konuşturmak için epey uğraşıp uğraşmış, sonuda becermiştim. Ancak neler yaptığımı hatırlamam lazım. 1.5 ay geçmesine rağmen çabuk unutuluyor. Hemen önerebileceğim şey, önce MFRC nin registerlerine herhangi bir byte yazıp geri okuyup karşılaştırmak olacak. Bu şekilde öncelikle SPI haberleşmenin gerçekleşip gerçekleşmediği, herhangi bir HW sorunu olup olmadığını anlayabilirsiniz. Ben bir osiloskop ile sinyalleri gözleyerek sorunu çözebilmiştim. Ama çözdüğüm esas sorun ne idi hatırlamam lazım. Hatırlayınca onu da yazarım. Şimdi hatırladığım kadarı şu: SPI SPOL/SPI_CPHA ayarları ile ve MISO Pininin PullUp modunda olmasına dikkat etmek gerekiyor. Ayrıca Read komutu gönderildikten sonra NSS telinde kesinti olmamalı, yani 16 bitlik ya da 32 bitlik paketler ile çalışılması gerekiyordu. Her byte dan sonra NSS on/off olursa sorun çıkıyor. Kritik birkaç kodu aşağıda veriyorum.

   /* Configure SPI1 pins: NSS, SCK, MISO and MOSI */
   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7;
   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
   GPIO_Init(GPIOA, &GPIO_InitStructure);

   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
   GPIO_InitStructure.GPIO_Mode =  GPIO_Mode_IPU;   //  MISO Pini Input Pull Up modunda
   GPIO_Init(GPIOA, &GPIO_InitStructure);


    /*   SD_CS -> PC5   */      
   
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  GPIO_Init(GPIOC, &GPIO_InitStructure);

   /* SPI1 configuration */
   SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
   SPI_InitStructure.SPI_Mode = SPI_Mode_Master;
   SPI_InitStructure.SPI_DataSize = SPI_DataSize_16b;
   SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;
   SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge;
   SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;
   SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_256;
   SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;
   SPI_InitStructure.SPI_CRCPolynomial = 7;
   SPI_Init(SPI1, &SPI_InitStructure);

/****************************************************************************************
* Function Name:Read_MFRC522
* Description: Read a byte from MFRC522 data register
* Input Parameters: addr - register address
* Returns: a byte of data read from MFRC522
****************************************************************************************/
unsigned char Read_MFRC522( unsigned char addr)
{  unsigned char readByte;
   unsigned int dat = 0;

   MFRC522_CSL();          // NSS (PC5) set to low to select chip

  dat=((((addr << 1) & 0x7E) | 0x80) << 8 ) | 0x00;
   // issue read command for 8 bit data to be read
   readByte=SPI_MFRC522_ReadWrite(dat);  // SPI1 e "addr" ile gelen adresi A1..6 da gönderiyoruz MSB=1 (read, 8 bit de 0, SPI_MFRC522_ReadWrite --> SPI1_ReadWrite)
  MFRC522_CSH();          //NSS (PC5) set to high to unselect chip

   return readByte;
}

Başlık: Ynt: RFID(MFRC522) İncelemesi Hakkında Kısa Kısa
Gönderen: mustafa_cmbz - 13 Ekim 2014, 12:41:31
(http://img02.taobaocdn.com/imgextra/i2/211190147/T2HOn.XX0XXXXXXXXX_!!211190147.jpg)

Şayet bu modülden kullanılıyorsanız bu kart benim anladığım sadece spı ile çalışıyor.

Neden diyecek olursanız datasheetinde:

(http://i.hizliresim.com/3R6Dnp.jpg)

yukarıdaki resimdeki gibi haberleşme protokolünün  seçiminin nasıl yapılacağından bahsediyor.

fakat modül üzerinde 1 ve 32 uçları yanı I2c ve AEA uçlarını ölçtüğümde

AE = 32 = VCC
I2c= 1  = GND

Bağlı olduğu gözüküyor.

Bundan dolayı bu mavi kartı alanlar haberleşme türünü değiştiremiyor kart sadece spı olarak kullanılabiliyor.

yanlışmıyım ?

Başlık: Ynt: RFID(MFRC522) İncelemesi Hakkında Kısa Kısa
Gönderen: justice_for_all - 13 Ekim 2014, 13:01:18
aynen hocam o hazır kit sadece spi için kullanılır.Farklı bağlantı yapılacaksa pinleri değiştirmeniz gerek.neden jumper ile yapmamışlarsa çok saçma olmuş.Aslında SPI ideal olan en hızlısı olduğu için öyle yapmış olabilirler.
Başlık: Ynt: RFID(MFRC522) İncelemesi Hakkında Kısa Kısa
Gönderen: x-nomek - 13 Ekim 2014, 13:06:01
NFC telefonla okuduğun bilgiyi bluetooth üzerinden veya internet üzerinden çalışan bir sisteme gönderirsen yapabilirsin tabi, ama bana çok da mantıklı gelmiyor neden NFC'li telefon kullanıyorsun. Al bir okuyucu sabit kalsın :)

direk iletişime geçemez mi ? internet ve bluetooth olmaz :D
Başlık: Ynt: RFID(MFRC522) İncelemesi Hakkında Kısa Kısa
Gönderen: MrDarK - 13 Ekim 2014, 13:50:14
Alıntı yapılan: x-nomek - 13 Ekim 2014, 13:06:01
direk iletişime geçemez mi ? internet ve bluetooth olmaz :D

Android de HID device yapmayı araştır o zaman :)
Başlık: Ynt: RFID(MFRC522) İncelemesi Hakkında Kısa Kısa
Gönderen: mustafa_cmbz - 13 Ekim 2014, 14:16:15

modüllü mecburen SPI olarak kullanacağız.

Peki bu SPI olarak kullanırken data ve clk ucunun yanında birde enb ucu olması gerekmıyor mu ?

Peki bu enb ucu hangisi ?

(http://i.hizliresim.com/zEj5kj.jpg) (http://hizliresim.com/zEj5kj)

(http://i.hizliresim.com/G1mRAZ.jpg) (http://hizliresim.com/G1mRAZ)

datasheetinde ki MISO MOSI  uçlarının karşılığına baktığım biri giriş biri çıkış diyor fakat hangisi olacak karar bilemedim.

Birde aynı şekilde RQ diye bir ucu var..

(http://i.hizliresim.com/MlVpjM.jpg) (http://hizliresim.com/MlVpjM)

Bu ucun ne işe yaradığına baktığımda ise :

(http://i.hizliresim.com/2Q61bE.jpg) (http://hizliresim.com/2Q61bE)

karşılığında ise kesme isteği çıkışı vs. gibi bir manya geliyor.Donanım yapısında sadece output olduğunu görüyorum.Benim anladığım ya led gibi birşey bağlayacağız yada tam emin değilim ama modül çıkışa data okudum yada okuyamadım gibi bir onayı aktarmak için mi kullanılıyor acaba ?


Kısacası spı olarak kullanım için örnek bir şema paylaşma imkanınız varmı acaba ?


Başlık: Ynt: RFID(MFRC522) İncelemesi Hakkında Kısa Kısa
Gönderen: justice_for_all - 13 Ekim 2014, 14:24:27
NSS = CS pini hocam seçme pini yani.

http://microcontrolandos.blogspot.com.tr/2014/02/pic-rfid-mfrc522.html (http://microcontrolandos.blogspot.com.tr/2014/02/pic-rfid-mfrc522.html)
Başlık: Ynt: RFID(MFRC522) İncelemesi Hakkında Kısa Kısa
Gönderen: MrDarK - 13 Ekim 2014, 14:26:19
(http://i.hizliresim.com/3R6Dnp.jpg)

Hocam daha önce mutlaka spi kullanmışsınızdır. SPI'da aktif olarak 4 pin gereklidir. NSS, CLK , MOSI, MISO

Şablondaki gösterime göre ; NSS (CS'de diyebilirsin) SDA pinine denk geliyor.
CLK gösterime göre ; SCK,  D5 pinine denk geliyor.
MOSI ; D6
MISO ; D7

Bu pinler minimum haberleşme pinleri , diğer IRQ gibi pinler modülden interrupt almak için kullanılıyor.
Başlık: Ynt: RFID(MFRC522) İncelemesi Hakkında Kısa Kısa
Gönderen: mustafa_cmbz - 13 Ekim 2014, 16:15:29
hocam daha önce MCP3553 ve 74hc595ler ile uygulama yaptım fakat hazır örnekler üzerinden protokolleri dallandırmadan budaklandırmadan çalıştım.

Ve onlardan aklımda kalan sadece 3 pin ile haberleşme yapıldığı.

Şimdi nasıl oluyorda

SDA - CS
SCK - CLOCK

MISO
MOSI

Uçları olmak üzere toplamda 4 pin ile bu haberleşme yapılıyor?

CS - ve CLOCK ucunu biliyorum fakat bunun yanında birda data ucu olması gerekmiyor mu bunun karşısında ise modülde 2 tane uç var biri input biri output diyor.


Protonda

SHİN ve SHOUT komutlarını kullanırken

Shout DTA, CLK, MsbFirst, [verı]

olarak kullanmıyormuyuz ?

Burada kafam iyice karıştı.Pek fazla üzerinde durduğum ve kullandığım bir haberleşme değil ve belkide farklı bir türü olabilir..


Bu konuda beni aydınlatabilirmisiniz ?




Başlık: Ynt: RFID(MFRC522) İncelemesi Hakkında Kısa Kısa
Gönderen: justice_for_all - 13 Ekim 2014, 16:22:58
Hocam sizin dediğiniz I2C ten data pini var hem giriş oluyor hem çıkış.SPI da ise giriş ve çıkış pinleri ayrı

MISO (master input/ Slave output)

MOSI (master output/ Slave input)    pinlerini açıklarsak   

MCU (master ) -------------- RFID (Slave)

MOSI -------------- MOSI  (master çıkışımız Slave data giriş)
MISO -------------- MISO  (master girişimiz Slave data Çıkış pinine)


NSS pini Slave seçmeye yarıyor.SPI bus ile bikaç cihaz haberleşebilir.Cihazlar karısmasın diye Her cihazı seçmek için MCU dan bir pin çıkarılır.

Bu cihazda cihazı seşmek için NSS pini normalde high seviyesinde iken Low seviyesine çekilir ve data gönderdiğiniz müddetce low seviyesinde kalır.


http://www.protonbasic.co.uk/showthread.php/52737-MCP3201-12-BIT-ADC-from-microchip?highlight=mcp3201 (http://www.protonbasic.co.uk/showthread.php/52737-MCP3201-12-BIT-ADC-from-microchip?highlight=mcp3201)
                                     
Başlık: Ynt: RFID(MFRC522) İncelemesi Hakkında Kısa Kısa
Gönderen: mustafa_cmbz - 13 Ekim 2014, 17:54:23
hocam şunu bana şematik ve görsel olarak çizerek anlatabilirmisin.Kafam karıştıkça karışıyor.

MISO ve MOSI pinleri rx tx uçları gibi düşünülmüyormu ?

şayet böyle ise programdan şöyle yapmamız gerekiyor ozm.


PİC DATA BEKLERKEN:

Shin RC522_MISO, RC522_CLK, MsbPre, [DATTA] ' Shift in msb-first, pre-clock.


PİC DATA GÖNDERİRKEN:

ShOUT RC522_MOSI, RC522_CLK, MsbPre, [DATTA] ' Shift in msb-first, pre-clock.



Böyle olacağını tahmin ediyorum.Yanlışmıyım ? Tabi bu örneklerde cs pinini katmadım.Zaten nerede nasıl kullanıldığı belli.
Başlık: Ynt: RFID(MFRC522) İncelemesi Hakkında Kısa Kısa
Gönderen: justice_for_all - 13 Ekim 2014, 18:05:41
evet rx ve tx gibi düşünülebilir.

Aslında enkolay yöntem kendin fonksiyon yaparak çalış.

ben proton bilmediğim için algoritma yapacam.


fonksiyon gonder (byte data)
{
    CS = low

    MOSI = datanın 7.biti

    CLK= high
    CLK = Low

    datayı bir bit sola kaydır

    MOSI = datanın 7.biti

    CLK= high
    CLK = Low

     datayı bir bit sola kaydır

    MOSI = datanın 7.biti

    CLK= high
    CLK = Low


    datayı bir bit sola kaydır

    MOSI = datanın 7.biti

    CLK= high
    CLK = Low


     datayı bir bit sola kaydır

    MOSI = datanın 7.biti

    CLK= high
    CLK = Low

    datayı bir bit sola kaydır

    MOSI = datanın 7.biti

    CLK= high
    CLK = Low

    datayı bir bit sola kaydır

    MOSI = datanın 7.biti

    CLK= high
    CLK = Low

    datayı bir bit sola kaydır

    MOSI = datanın 7.biti

    CLK= high
    CLK = Low

    CS = high
}

fonksiyon Data_al()
{
    byte alınan=0;

    CS = Low ;

    CLK=high;

    data|= MISO;

   CLK = low
   
   datayı bir bit sola kaydır.

     CLK=high;

    data|= MISO;

   CLK = low
   
   datayı bir bit sola kaydır.

    CLK=high;

    data|= MISO;

   CLK = low
   
   datayı bir bit sola kaydır.

    CLK=high;

    data|= MISO;

   CLK = low
   
   datayı bir bit sola kaydır.

    CLK=high;

    data|= MISO;

   CLK = low
   
   datayı bir bit sola kaydır.

    CLK=high;

    data|= MISO;

   CLK = low
   
   datayı bir bit sola kaydır.

    CLK=high;

    data|= MISO;

   CLK = low
   
   datayı bir bit sola kaydır.

    CLK=high;

    data|= MISO;

   CLK = low
   
   CS = high;

   return alınan;

}



gibi yapılabilir.
Başlık: Ynt: RFID(MFRC522) İncelemesi Hakkında Kısa Kısa
Gönderen: mustafa_cmbz - 13 Ekim 2014, 18:26:32
Anladım hocam.

Peki şimdi bu donanım bağlantılarını vs. olması gerektiğini öğrendim.

Sizin verdiğiniz örnekte sırası ile gelen bilgiyi bit bit alıyorsun galiba.

Bizim protonda direkt bu işlemi byte veya worda atabiliyoruz.Tabi arka planda koşan programı bilmiyoruz..


Peki şimdi denemeleri yapabilmek adına soruyorum.Geçen mesajlarınızda dediğiniz gibi anten default olarak kapalı geliyor demiştiniz.Sırası ile modül ile iglili tüm bağlantıları yaptıktan sonra modüle ne göndermemiz gerekiyor ne alamamız gerekiyor.Sonrasında neler yapmalıyız aşam aşama anlatırmısın hocam.Hatta datasheetten sayfa olarak gidersek daha açıklayıcı olacaktır diye düşünüyorum.Bende bu arada göz atıyorum..

Başlık: Ynt: RFID(MFRC522) İncelemesi Hakkında Kısa Kısa
Gönderen: justice_for_all - 13 Ekim 2014, 18:40:19
mesela protonda data.7 gibi bişe yapabiliyormusun?
Başlık: Ynt: RFID(MFRC522) İncelemesi Hakkında Kısa Kısa
Gönderen: mustafa_cmbz - 13 Ekim 2014, 18:53:38
Alıntı yapılan: justice_for_all - 13 Ekim 2014, 18:40:19
mesela protonda data.7 gibi bişe yapabiliyormusun?


PRINT AT 1,1,"DATA : " ,DEC4 datta.7


gibi birşey yapabiliyorum hocam.

Yani bu data bytenın 7. bitini al gibi birşet değilmi?

yani bir byte a aktardığın datayı sırası ile 1-0 olarak çıkışa aktarıyorsun. değilmi ?

Başlık: Ynt: RFID(MFRC522) İncelemesi Hakkında Kısa Kısa
Gönderen: RaMu - 14 Ekim 2014, 03:38:50
SPI protokolünün birkaç farklı modu var aslında.
Şunu söyleyebiliriz, biz master ız MOSI data çıkış pinimiz, MISO data giriş pinimiz
spi de iki tane register var birisi giden birisi gelen
gidene göndereceğimiz datayı yazıyoruz,
sonra gönder diyoruz,
bu data bit bit MOSI pinimizden gönderiliyor
her spi clock uğunda datanın bir 1 biti gönderiliyor
ama aynı zamanda her spi clock unda MISO pininde bulunan 1 bit data okunuyor
(bu datayı slave cihaz bizw gönderiyor)
bunu futbolda oyuncu değişikliğine benzetebiliriz,
her hakem düdüğünde her clocda bir oyuncu değiştiriliyor,
bu sayede 8 clock da 1 byte data göndermiş ve 1 byte data almış oluyoruz.

Bunu mcu nun spi modülü kendi yapıyor,
bizim gönderilecek byte ı girmemiz yeterli oluyor.
Başlık: Ynt: RFID(MFRC522) İncelemesi Hakkında Kısa Kısa
Gönderen: ArifAhmet - 14 Ekim 2014, 10:11:40
Hocam konudan biraz uzak olabilir. Belki yadımcı olur diye koyuyorum. Burada (http://birkodyaz.blogspot.com.tr/2014/09/stm32f4-stm32f429-discovery-ile-rfid.html (http://birkodyaz.blogspot.com.tr/2014/09/stm32f4-stm32f429-discovery-ile-rfid.html)) STM32 ile bir örneği var. Kütüphane gayet sade ve güzel yazılmış.
Başlık: Ynt: RFID(MFRC522) İncelemesi Hakkında Kısa Kısa
Gönderen: muhittin_kaplan - 14 Ekim 2014, 10:27:06
Hocam O Kütüphane "Genelde Kullanılan Kütüphane"
http://stm32f4-discovery.com/2014/07/library-23-read-rfid-tag-mfrc522-stm32f4xx-devices/ (http://stm32f4-discovery.com/2014/07/library-23-read-rfid-tag-mfrc522-stm32f4xx-devices/)

ve kartın olup olmadığında problem yaşıyoruz.
Başlık: Ynt: RFID(MFRC522) İncelemesi Hakkında Kısa Kısa
Gönderen: ArifAhmet - 14 Ekim 2014, 10:34:51
Hocam kütüphane kaynak kodları incelenirse fayalı olur diye düşünüyorum.
Başlık: Ynt: RFID(MFRC522) İncelemesi Hakkında Kısa Kısa
Gönderen: justice_for_all - 14 Ekim 2014, 10:49:51
ayrıca üreticinin datasheeti çok karışık.Haberleşme için normalde hangi registere ne yazılacağını algoritmasını filan vermesi gerek ama hiç biri yok.register açıklamaları da çok karışık yada ben anlamıyorum.
Başlık: Ynt: RFID(MFRC522) İncelemesi Hakkında Kısa Kısa
Gönderen: M_B - 26 Kasım 2014, 11:00:01
http://stm32f4-discovery.com/2014/07/library-23-read-rfid-tag-mfrc522-stm32f4xx-devices/ (http://stm32f4-discovery.com/2014/07/library-23-read-rfid-tag-mfrc522-stm32f4xx-devices/)
Linkteki uygulamayı birebir denedim.
mavi anahtarlıkta sorun yok. Kartı detect edip Seri nosunu ekrana yazıyor.
Beyaz kartı ve ist kartı malesef detect edemiyor.
Şimdi burdan nasıl bir sonuc cıkar. Linkteki uygulamadaki kutuphaneye hıc mudahale etmedim. Kartlarda mı sorun var kitte mi ?
Anlayabilmiş değilim.
@muhittin_kaplan hocam  ve @justice_for_all  hocam siz neler yaptınız.

Not: Beyaz kartı ve İst kartı baska bir RFID li çalışan sisteme dokundurdugumda İnvalid ID diyor.
Bu da demek oluyorki kitle gelen kart saglam. O zaman sorun nerde :(

Linkini verdiğim uygulamanın resmi:
(http://i.hizliresim.com/MlNv8Q.jpg) (http://hizliresim.com/MlNv8Q)
Başlık: Ynt: RFID(MFRC522) İncelemesi Hakkında Kısa Kısa
Gönderen: MrDarK - 26 Kasım 2014, 11:51:09
Elindeki okuyucu ile IST kart okuyamazsın, IST kart dediğin Desfire özellikli güvenlikli bir karttır ve Mifare versiyonu senin RC522 ile okunmasına müsade etmez.

RC522 ile Classic vb giriş seviyesinde kartları okuyabilirsin. Detaylı bilgi datasheet'inde ve karşılaştırma tablolarında mevcut.

Beyaz kartı okuyabilmen gerekiyordu , belki kart arızalıdır. Sana tavsiyem üniversite öğrenci kartları, bazı banka kartları içinde de mifare classic olabiliyor. Onları dene amaç sadece ID okumaksa.
Başlık: Ynt: RFID(MFRC522) İncelemesi Hakkında Kısa Kısa
Gönderen: M_B - 26 Kasım 2014, 16:01:03
Alıntı yapılan: MrDarK - 26 Kasım 2014, 11:51:09
Beyaz kartı okuyabilmen gerekiyordu , belki kart arızalıdır.
Hocam bende oyle dusunuyorum ama o kartı Baska RFID li kartla calısan sisteme okuttugumda İnvalid ID diyor. Yanı kartı gormese boyle demez dıye dusunuyorum.
Şunuda denedim. Personel kartımızı da denedim ( O da RFID li ) onu da tanımıyor.
Karta kesin olarak bozuk diyemiyorum bir kesinleştirebilsem. 
Başlık: Ynt: RFID(MFRC522) İncelemesi Hakkında Kısa Kısa
Gönderen: AsHeS - 26 Kasım 2014, 16:33:16
Alıntı yapılan: M_B - 26 Kasım 2014, 16:01:03

Hocam bende oyle dusunuyorum ama o kartı Baska RFID li kartla calısan sisteme okuttugumda İnvalid ID diyor. Yanı kartı gormese boyle demez dıye dusunuyorum.
Şunuda denedim. Personel kartımızı da denedim ( O da RFID li ) onu da tanımıyor.
Karta kesin olarak bozuk diyemiyorum bir kesinleştirebilsem. 

Hocam İstanbul'da iseniz kendi okuduğum ID sini bildiğim kartlardan birini size verebilirim.
Başlık: Ynt: RFID(MFRC522) İncelemesi Hakkında Kısa Kısa
Gönderen: ArifAhmet - 26 Kasım 2014, 16:59:05
Hocam aynı kütüphaneyi (stm32f4-discovery.com) daha önceden denedim ve istanbul kartı okudum. Tabi sadece ID kısmını.
Başlık: Ynt: RFID(MFRC522) İncelemesi Hakkında Kısa Kısa
Gönderen: AsHeS - 26 Kasım 2014, 17:03:16
Alıntı yapılan: ArifAhmet - 26 Kasım 2014, 16:59:05
Hocam aynı kütüphaneyi (stm32f4-discovery.com) daha önceden denedim ve istanbul kartı okudum. Tabi sadece ID kısmını.
Bütün Mifare kartların Etiket tipleri alınabiliyor sorun okuma da başlıyor.
Başlık: Ynt: RFID(MFRC522) İncelemesi Hakkında Kısa Kısa
Gönderen: M_B - 26 Kasım 2014, 19:16:23
Alıntı yapılan: AsHeS - 26 Kasım 2014, 16:33:16
Hocam İstanbul'da iseniz kendi okuduğum ID sini bildiğim kartlardan birini size verebilirim.
Hocam istanbuldayim.hatta benim karti bile deneyebiliriz eger modulunuz duruyorsa.
Avrupa yakasindayim.
Başlık: Ynt: RFID(MFRC522) İncelemesi Hakkında Kısa Kısa
Gönderen: Yazilim - 28 Kasım 2014, 00:23:05
MFRC522 pinlerini pic e direkmi bağlıyorsunuz ? pic5volt modül 3.3 volt
Başlık: Ynt: RFID(MFRC522) İncelemesi Hakkında Kısa Kısa
Gönderen: MrDarK - 28 Kasım 2014, 08:40:15
Transistörler ile level shifter yapılmalı, veya direnç ile gerilim bölücü yapılabilir bazı pinlere.
Başlık: Ynt: RFID(MFRC522) İncelemesi Hakkında Kısa Kısa
Gönderen: murat34 - 17 Aralık 2014, 23:12:13
Merhaba arkadaşlar
altta linkini verdiğim kodları denedim ama çalışmadı
kodda kullanılan işlemci 16F887 ben 16f877A kullandım bundan dolayı olabilirmi acaba ?.

http://simplesoftmx.blogspot.com.tr/2014/11/libreria-para-usar-lector-rfid-rc522.html (http://simplesoftmx.blogspot.com.tr/2014/11/libreria-para-usar-lector-rfid-rc522.html)
Başlık: Ynt: RFID(MFRC522) İncelemesi Hakkında Kısa Kısa
Gönderen: MrDarK - 18 Aralık 2014, 11:58:38
Alıntı yapılan: murat34 - 17 Aralık 2014, 23:12:13
Merhaba arkadaşlar
altta linkini verdiğim kodları denedim ama çalışmadı
kodda kullanılan işlemci 16F887 ben 16f877A kullandım bundan dolayı olabilirmi acaba ?.

http://simplesoftmx.blogspot.com.tr/2014/11/libreria-para-usar-lector-rfid-rc522.html (http://simplesoftmx.blogspot.com.tr/2014/11/libreria-para-usar-lector-rfid-rc522.html)


Mesela nesi çalışmadı ? Bu şekilde sorduğunuz sorulara anlamlı yanıtlar beklemeyin :) Müneccim değiliz yada elektronikte şapkadan tavşan çıkmıyor :)
Başlık: Ynt: RFID(MFRC522) İncelemesi Hakkında Kısa Kısa
Gönderen: stm - 19 Ocak 2015, 21:03:28
@MrDark  hocam diğer konuya yazmıştım siz buraya yönlendirdiniz diye şimdi buraya yazıyorum yazdıklarınızı en baştan okudum ama yine çözemedim. kodlarımı ekliyorum . nerde hata yapıyorum acaba.
birde key A key B nedir bu alanları ne amaçla kullanıyoruz.

(http://i.hizliresim.com/k1M4qD.png)


#include <Built_in.h>
//copie e cole o código da biblioteca aqui!!!
//O Teste foi feito com cartões MIFARE 1K
sbit MFRC522_CS at RD4_Bit;
sbit MFRC522_Rst at RD3_Bit;
sbit SoftSPI_SDO at RD1_Bit;
sbit SoftSPI_CLK at RD0_Bit;
sbit SoftSPI_SDI at RD2_Bit;
sbit MFRC522_CS_Direction at TRISD4_Bit;
sbit MFRC522_Rst_Direction at TRISD3_Bit;
sbit SoftSPI_SDO_Direction at TRISD1_Bit;
sbit SoftSPI_CLK_Direction at TRISD0_Bit;
sbit SoftSPI_SDI_Direction at TRISD2_Bit;
// LCD module connections
sbit LCD_RS at RB4_bit;
sbit LCD_EN at RB5_bit;
sbit LCD_D4 at RB0_bit;
sbit LCD_D5 at RB1_bit;
sbit LCD_D6 at RB2_bit;
sbit LCD_D7 at RB3_bit;
sbit LCD_RS_Direction at TRISB4_bit;
sbit LCD_EN_Direction at TRISB5_bit;
sbit LCD_D4_Direction at TRISB0_bit;
sbit LCD_D5_Direction at TRISB1_bit;
sbit LCD_D6_Direction at TRISB2_bit;
sbit LCD_D7_Direction at TRISB3_bit;
// End LCD module connections
char key[6] = { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF };
char writeData[] = "Microcontrolandos";
void main()
{
char msg[12];
char UID[6];
unsigned TagType;
char size;
char i;
//Desativa as Portas Analogicas
ADCON1 = 0x0F;
//Inicializa Soft SPI
Soft_SPI_Init();
//Inicializa display
Lcd_Init();
Lcd_Cmd(_LCD_CLEAR);
Lcd_Cmd(_LCD_CURSOR_OFF);
//inicializa o modulo RFID
MFRC522_Init();
while(1)
{
//Verifica se há algum cartão
if( MFRC522_isCard( &TagType ) )
{
Lcd_Cmd(_LCD_CLEAR);
//Exibe o tipo do cartão no display
ByteToHex( Lo(TagType), msg );
ByteToHex( Hi(TagType), msg+2 );
Lcd_Out( 1, 1, "TAG TYPE: " );
Lcd_Out_CP( msg );
//Faz a leitura do numero de serie
if( MFRC522_ReadCardSerial( &UID ) )
{
//Posiciona o cursor
Lcd_Out( 1, 1, "" );
for( i=0; i < 5; i++)
{
ByteToHex( UID[i], msg );
Lcd_Out_CP( msg );
}
size = MFRC522_SelectTag( &UID );
}
//Posiciona o cursor
Lcd_Out( 2, 1, "" );
//Tenta realizar a autenticação A do setor 1( blocos: 4 - 7 )
//bloco de autenticação é o 7
if( MFRC522_Auth( PICC_AUTHENT1A, 7, &key, &UID ) == 0 )
{
//Escreve algo no bloco 4
MFRC522_Write( 4, &writeData );
}
else if( MFRC522_Auth( PICC_AUTHENT1B, 7, &key, &UID ) == 0 )
{
//Escreve algo no bloco 4
MFRC522_Write( 4, &writeData );
}
else
{
Lcd_Out_CP( "Erro" );
continue;
}
//Faz a leitura do bloco 4
if( MFRC522_Read( 4, &writeData ) == 0 )
{
Lcd_Out( 2, 1, &writeData );
}
//Estado de hibernação
MFRC522_Halt();
}
}
}



Başlık: Ynt: RFID(MFRC522) İncelemesi Hakkında Kısa Kısa
Gönderen: MrDarK - 20 Ocak 2015, 08:57:08
Alıntı yapılan: stm - 19 Ocak 2015, 21:03:28
@MrDark  hocam diğer konuya yazmıştım siz buraya yönlendirdiniz diye şimdi buraya yazıyorum yazdıklarınızı en baştan okudum ama yine çözemedim. kodlarımı ekliyorum . nerde hata yapıyorum acaba.
birde key A key B nedir bu alanları ne amaçla kullanıyoruz.


stm selam; A ve B keyleri çeşitli güvenlik seviyeler için kullanılmak üzere hazırlanmış. Kodlarını incelemedim zaten baksamda sorunun ne olduğunu söylemiyorsun. Çalışmıyor bir sorun değil ne yazık ki :) İlk mesajımdaki yönergeleri eğer okuduysan şöyle bir yapı var mifare sistemlerde. Yazmak için sector trailer denen bölgelerden izin almak zorundasın bunlar okuma yada şifreli işlem yapma olabilir. Elindeki kart eğer sıfır bir kart ise key değerleri default değerdedir. Bu keyler ile sector trailerden izin alıp verini göndermek istediğin sectore atıp kayıtlandığına emin ol.

Dikkat : Eğer bir şekilde sector trailer'a key değiştirmek veya yanlışlıkla erişim sebebiyle erişip oradaki bilgileri kafanıza göre değiştirirseniz kartın o sectorü yalan oluyor bilesiniz.
Başlık: Ynt: RFID(MFRC522) İncelemesi Hakkında Kısa Kısa
Gönderen: stm - 20 Ocak 2015, 21:02:31
@MrDarK  hocam cevap için teşekkürler  biraz daha kafa yormam gerekiyor sanırım  bu arada bu kart moda oldu çoğu kişi almış çözmeye çalışıyor.
eklediğim kodlara şöyle bir göz ucuyla baksakıp bir yorumda bulunsaydınız iyi olurdu aslında.:)

Başlık: Ynt: RFID(MFRC522) İncelemesi Hakkında Kısa Kısa
Gönderen: MrDarK - 21 Ocak 2015, 00:05:31
Alıntı yapılan: stm - 20 Ocak 2015, 21:02:31
@MrDarK  hocam cevap için teşekkürler  biraz daha kafa yormam gerekiyor sanırım  bu arada bu kart moda oldu çoğu kişi almış çözmeye çalışıyor.
eklediğim kodlara şöyle bir göz ucuyla baksakıp bir yorumda bulunsaydınız iyi olurdu aslında.:)

Eklediğin kod benim ilk sayfada anlattığım akış diyagramlarını işlemiş önce A keyi ile izin istemiş MI_OK cevabını alamazsa B keyi ile denemiş bir şekilde izin alırsa veri yazmış. Hiç birşey yapamaz ise error döndürmüş. Durumlarıda LCD'de yazdırmış.
Başlık: Ynt: RFID(MFRC522) İncelemesi Hakkında Kısa Kısa
Gönderen: moksan - 20 Şubat 2015, 16:35:45
Haliyle çalışan,denenmiş MFRC522 için PIC16F877  CCS C ile yazılmış kod varsa paylaşabilirmisiniz?
Başlık: Ynt: RFID(MFRC522) İncelemesi Hakkında Kısa Kısa
Gönderen: mcn - 07 Temmuz 2015, 07:46:59
Konuyu az biraz hortlatmış olucam ama gerçi pek de eski konu değil.

Modülün algılama mesafesini arttırmak için ne yapılabilir? Bu şekilde bir çalışma yapan oldu mu?
Başlık: Ynt: RFID(MFRC522) İncelemesi Hakkında Kısa Kısa
Gönderen: MrDarK - 07 Temmuz 2015, 08:17:43
Hocam zannetmiyorum algılama mesafesini yükseklik olarak değilde genişlik olarak arttırabilirsin. Mifare Classic max 5-6cm arasından haberleşebiliyor. Farklı entegreler var ismini hatırlamıyorum onları kullanırsan mesafe daha da artacaktır. MFRC522 ile bunu yapman pek olası değil bence.

Mifare kullanmayacaksan eğer standart RFID Kullanabilirsin;
http://www.soselectronic.com/?str=1719&article=with-the-id3la-rfid-module-it-s-possible-to-read-a-tag-up-to-30cm (http://www.soselectronic.com/?str=1719&article=with-the-id3la-rfid-module-it-s-possible-to-read-a-tag-up-to-30cm)
Başlık: Ynt: RFID(MFRC522) İncelemesi Hakkında Kısa Kısa
Gönderen: bbk - 01 Şubat 2017, 19:36:10
lütfen "stm32f103" için "MFRC522" kütüphanesi sizde var mı ?
lütfen yardimcı olunuz.

teşekkür ederim


bbk.bstn@gmail.com
Başlık: Ynt: RFID(MFRC522) İncelemesi Hakkında Kısa Kısa
Gönderen: Mucit23 - 10 Mart 2019, 00:15:29
Selamlar

Yeni konu açmak istemedim ama konuyla ilgili aşağı yukarı aynı sorunu yaşamaktayım. Tilen'in STM32F4 için düzenlemiş olduğu RC522 kütüphanesini bende STM32F103de çalışacak şekilde SPI fonksiyonlarını vs düzenledim. Şuan modül ile haberleşmemde sıkıntı yok. Kart Yaklaştırdığımda kartı tespit edip ID'sini okuyabiliyorum.

Kart içerisine blok yazma ve okuma işlemlerini denemeye çalışıyorum. İlk başta yazma okuma yapmak için Kart sorgulamadan sonra ilgili odacığa key ile giriş yapmak gerekiyor.Ben kartı tespit ediyorum ama bu aşamada başarılı olamıyorum.


if (TM_MFRC522_Check(CardID) == MI_OK)
{
printf( "[%02x-%02x-%02x-%02x-%02x] \r\n", CardID[0], CardID[1], CardID[2], CardID[3], CardID[4]);
if( (TM_MFRC522_Auth(PICC_AUTHENT1B,1,KEY,CardID) == MI_OK))
           printf("OK");
       else
   printf("FAILED\n\n");
}

TM_MFRC522_Auth işlemi sürekli fail olarak sonuçlanıyor. Key defaul olarak 6 adet 0xFF

Atladığım bir nokta varmı forumda birkaç kişi daha bu sorunu yaşamış sanırım. Blok okuma yazma için basit bir örnek vermeniz mümkün mü?
Başlık: Ynt: RFID(MFRC522) İncelemesi Hakkında Kısa Kısa
Gönderen: MrDarK - 10 Mart 2019, 15:00:29
Hocam selamlar, kod örneği vermeden önce kartın okumak istediğiniz yerini mobil bir uygulama indirip okuyabilirseniz ilgili bloğun anahtarının 6 byte ff olup olmadığını anlamış oluruz diye düşünüyorum.
Başlık: Ynt: RFID(MFRC522) İncelemesi Hakkında Kısa Kısa
Gönderen: Mucit23 - 10 Mart 2019, 17:53:04
Hocam kartlar sıfır. Evet dediğiniz gibi Mifare Classic Tool uygulaması ile kontrol ettim sorun yok gibi keya ve keyb FF lerden oluşuyor.
Başlık: Ynt: RFID(MFRC522) İncelemesi Hakkında Kısa Kısa
Gönderen: Mucit23 - 10 Mart 2019, 23:16:07
Kartı telefonla okuduğumda bu şekilde olduğunu görebiliyorum.
(https://i.postimg.cc/3wK8N2cC/Screenshot-20190310-231335-MIFARE-Classic-Tool.jpg)
Sektör 1 blok 0 daki dataları yine telefonla ben yazdım.
Hatta Kart sorgusundan sonra kartın seri numarası ile birlikte TAG Select işlemi yapıyorum. Buna da pozitif cevap alıyorum. Fakat sektöre giriş yapamıyorum bir türlü.

@MrDarK sebebi ne olabilir bunun?
Başlık: Ynt: RFID(MFRC522) İncelemesi Hakkında Kısa Kısa
Gönderen: MrDarK - 11 Mart 2019, 09:53:37
Kodların tamamına bakmak lazım ama genelde bu write auth read gibi işlemlerde kullanılan timer'ın süresi hatalı olabiliyor. Timer'ı init esnasında 1 kere kurduktan sonra library değiştirmiyordu yanlış hatırlamıyorsam. MFRC522'de bir timer var timeout'u tutmak için, o timeout işlemi genelde card detect için gerekli olan süreye kuruluyor. Oradan şüphe ediyorum.

Kodları görmeden net birşey söylemek çok kolay değil hocam tahmin edebileceğin gibi :)

En azından rfid tag'de bir sorun olmadığını gördük. Bundan sonra MFRC'nin setup işlemlerine bakabiliriz.

Birde şimdi dikkatimi çekti Sen KEYB ile auth olmaya çalışıyorsun. Oysa ki default kartlarda KEYA yetkilidir. Değiştir orayı çalışacaktır :) Yani aşağıdaki gibi dene..

if (TM_MFRC522_Check(CardID) == MI_OK)
{
printf( "[%02x-%02x-%02x-%02x-%02x] \r\n", CardID[0], CardID[1], CardID[2], CardID[3], CardID[4]);
if( (TM_MFRC522_Auth(PICC_AUTHENT1A,1,KEY,CardID) == MI_OK))
           printf("OK");
       else
   printf("FAILED\n\n");
}
Başlık: Ynt: RFID(MFRC522) İncelemesi Hakkında Kısa Kısa
Gönderen: Mucit23 - 11 Mart 2019, 11:41:07
İkisini de denedim hocam. En son keyB kalmış orada.

Kütüphanenin tamamı da budur.
/**
 * |----------------------------------------------------------------------
 * | Edited by PhanDAT 23/09/2015
 * | Copyright (C) Tilen Majerle, 2014
 * |
 * | This program is free software: you can redistribute it and/or modify
 * | it under the terms of the GNU General Public License as published by
 * | the Free Software Foundation, either version 3 of the License, or
 * | any later version.
 * | 
 * | This program is distributed in the hope that it will be useful,
 * | but WITHOUT ANY WARRANTY; without even the implied warranty of
 * | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * | GNU General Public License for more details.
 * |
 * | You should have received a copy of the GNU General Public License
 * | along with this program.  If not, see <http://www.gnu.org/licenses/>.
 * |----------------------------------------------------------------------
 */
#include "MFRC522.h"
#include <stdio.h>
#include "systick.h"
#include <stm32f10x.h>
//-------------------------------------------------
void TM_MFRC522_Init(void)
{

  TM_MFRC522_InitPins();
//CS high
MFRC522_CS_HIGH;

TM_MFRC522_Reset();

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

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

TM_MFRC522_AntennaOn(); //Open the antenna
}
 
//SPI2
void TM_MFRC522_InitPins(void)
 {
SPI_InitTypeDef  SPI_InitStructure;
GPIO_InitTypeDef GPIO_InitStructure;

/* Enable SPI2 and GPIOB clocks */
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2, ENABLE); 
// 
//CS  ---- Output, duoc dieu khien khi read/write
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  GPIO_Init(GPIOB, &GPIO_InitStructure); 
//SET CS HIGH LEVEL
  GPIO_SetBits(GPIOB,GPIO_Pin_12);

/*Configure SPI2 pins: SCK, MISO and MOSI*/
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_Init(GPIOB, &GPIO_InitStructure);
 
/* SPI2 configuration */
  /* Data bytes on both MOSI and MISO lines are sent with the MSB first. Data on both MOSI
and MISO lines must be stable on the rising edge of the clock and can be changed on the
falling edge. Data is provided by the MFRC522 on the falling clock edge and is stable
during the rising clock edge. */
SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
SPI_InitStructure.SPI_Mode = SPI_Mode_Master;
SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;
SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;
SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge;
SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;
SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_8; // 72Mhz / 8 = 9Mhz 
SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;
SPI_InitStructure.SPI_CRCPolynomial = 7;
SPI_Init(SPI2, &SPI_InitStructure);

/* Enable SPI2  */
SPI_Cmd(SPI2, ENABLE);
 }
 //-------------------------------------------------
 //SPI2
unsigned char SPI2_ReadWrite(unsigned char writedat)
{
/* Loop while DR register in not emplty */
while(SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_TXE) == RESET);

/* Send byte through the SPI2 peripheral */
SPI_I2S_SendData(SPI2, writedat);

/* Wait to receive a byte */
while(SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_RXNE) == RESET);

/* Return the byte read from the SPI bus */
return SPI_I2S_ReceiveData(SPI2);
}

 //-------------------------------------------------
void TM_MFRC522_WriteRegister(uint8_t addr, uint8_t val)
 {
//CS low
unsigned char status;
MFRC522_CS_LOW;
//Send address
delay_us(100);
  status = SPI2_ReadWrite((addr << 1) & 0x7E);
//Send data
  delay_us(100);
  status = SPI2_ReadWrite(val);
//CS high
MFRC522_CS_HIGH;
}
//-------------------------------------------------
uint8_t TM_MFRC522_ReadRegister(uint8_t addr)
{
uint8_t val;
//CS low
MFRC522_CS_LOW;
  delay_us(100);
SPI2_ReadWrite(((addr << 1) & 0x7E) | 0x80);
  delay_us(100);
val =  SPI2_ReadWrite(0x00); // SPI2_ReadWrite(0x00);
//CS high
MFRC522_CS_HIGH;

return val;
}
//-------------------------------------------------
void TM_MFRC522_SetBitMask(uint8_t reg, uint8_t mask) {
TM_MFRC522_WriteRegister(reg, TM_MFRC522_ReadRegister(reg) | mask);
}
//-------------------------------------------------
void TM_MFRC522_ClearBitMask(uint8_t reg, uint8_t mask){
TM_MFRC522_WriteRegister(reg, TM_MFRC522_ReadRegister(reg) & (~mask));
}
//-------------------------------------------------
void TM_MFRC522_AntennaOn(void) {
uint8_t temp;

temp = TM_MFRC522_ReadRegister(MFRC522_REG_TX_CONTROL);
if (!(temp & 0x03)) {
TM_MFRC522_SetBitMask(MFRC522_REG_TX_CONTROL, 0x03);
}
}
//-------------------------------------------------
void TM_MFRC522_AntennaOff(void) {
TM_MFRC522_ClearBitMask(MFRC522_REG_TX_CONTROL, 0x03);
}
//-------------------------------------------------
void TM_MFRC522_Reset(void) {
TM_MFRC522_WriteRegister(MFRC522_REG_COMMAND, PCD_RESETPHASE);
}
//-------------------------------------------------
uint8_t getFirmwareVersion()
{
  uint8_t response;
  response = TM_MFRC522_ReadRegister(MFRC522_REG_VERSION);
  return response;
}
//-------------------------------------------------
TM_MFRC522_Status_t TM_MFRC522_Request(uint8_t reqMode, uint8_t* TagType) {
TM_MFRC522_Status_t status; 
uint16_t backBits; //The received data bits

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

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

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

return status;
}

//-------------------------------------------------
TM_MFRC522_Status_t TM_MFRC522_Check(uint8_t* id) {
TM_MFRC522_Status_t status;
//Find cards, return card type
status = TM_MFRC522_Request(PICC_REQIDL, id);
if (status == MI_OK) {
//Card detected
//Anti-collision, return card serial number 4 bytes
status = TM_MFRC522_Anticoll(id);
}
TM_MFRC522_Halt(); //Command card into hibernation

return status;
}
//-------------------------------------------------
TM_MFRC522_Status_t TM_MFRC522_Compare(uint8_t* CardID, uint8_t* CompareID) {
uint8_t i;
for (i = 0; i < 5; i++) {
if (CardID[i] != CompareID[i]) {
return MI_ERR;
}
}
return MI_OK;
}
//-------------------------------------------------
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;
}
//-------------------------------------------------
TM_MFRC522_Status_t TM_MFRC522_Anticoll(uint8_t* serNum) {
TM_MFRC522_Status_t status;
uint8_t i;
uint8_t serNumCheck = 0;
uint16_t unLen;

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

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

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 TM_MFRC522_CalculateCRC(uint8_t*  pIndata, uint8_t len, uint8_t* pOutData) {
uint8_t i, n;

TM_MFRC522_ClearBitMask(MFRC522_REG_DIV_IRQ, 0x04); //CRCIrq = 0
TM_MFRC522_SetBitMask(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++) {   
TM_MFRC522_WriteRegister(MFRC522_REG_FIFO_DATA, *(pIndata+i));   
}
TM_MFRC522_WriteRegister(MFRC522_REG_COMMAND, PCD_CALCCRC);

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

//Read CRC calculation result
pOutData[0] = TM_MFRC522_ReadRegister(MFRC522_REG_CRC_RESULT_L);
pOutData[1] = TM_MFRC522_ReadRegister(MFRC522_REG_CRC_RESULT_M);
}
//-------------------------------------------------
uint8_t TM_MFRC522_SelectTag(uint8_t* serNum) {
uint8_t i;
TM_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);
}
TM_MFRC522_CalculateCRC(buffer, 7, &buffer[7]); //??
status = TM_MFRC522_ToCard(PCD_TRANSCEIVE, buffer, 9, buffer, &recvBits);

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

return size;
}
//-------------------------------------------------
TM_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;
}
//-------------------------------------------------
TM_MFRC522_Status_t TM_MFRC522_Read(uint8_t blockAddr, uint8_t* recvData) {
TM_MFRC522_Status_t status;
uint16_t unLen;

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

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

return status;
}
//-------------------------------------------------
TM_MFRC522_Status_t TM_MFRC522_Write(uint8_t blockAddr, uint8_t* writeData) {
TM_MFRC522_Status_t status;
uint16_t recvBits;
uint8_t i;
uint8_t buff[18];

buff[0] = PICC_WRITE;
buff[1] = blockAddr;
TM_MFRC522_CalculateCRC(buff, 2, &buff[2]);
status = TM_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) {
//Data to the FIFO write 16Byte
for (i = 0; i < 16; i++) {   
buff[i] = *(writeData+i);   
}
TM_MFRC522_CalculateCRC(buff, 16, &buff[16]);
status = TM_MFRC522_ToCard(PCD_TRANSCEIVE, buff, 18, buff, &recvBits);

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

return status;
}

void TM_MFRC522_Halt(void) {
uint16_t unLen;
uint8_t buff[4];

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

TM_MFRC522_ToCard(PCD_TRANSCEIVE, buff, 4, buff, &unLen);
}


TM_MFRC522_ToCard fonksiyonuna bakmanız mümkün mü? Orada gecikme ile ilgili bir "i" değişkeni var. Sizde bu değer nedir? Benim MCU 72Mhzde çalışıyor.

Siz STM32F103 de çalıştırabildiniz mi?
Başlık: Ynt: RFID(MFRC522) İncelemesi Hakkında Kısa Kısa
Gönderen: MrDarK - 11 Mart 2019, 14:18:03
Selamlar,

Gördüğüm kadarı ile TM_MFRC522_Check fonksiyonun yaptığı tek işlem kartın id'sini almak gibi görünüyor. Birde o fonksiyon içinde kartın id'sini aldıktan sonra TM_MFRC522_Halt() fonksiyonu çalıştırıyor. Ben halt işlemini çalıştırmıyorum. Birde anticoll işlemi okey fakat sonrasında direkt olarak siz authanticate işlemi yapmaya çalışmışsınız öncesinde select işlemini yapmanız gerekiyor. Yani özetle check fonksiyonundan sonra TM_MFRC522_SelectTag fonksiyonunu çağırın. Birde dipnot bana kalırsa check fonksiyonunun sonundaki halt fonksiyonunu da yoruma alın.

Sonucu buraya da yazarsınız =)

Ayrıca konuyu okuyalım lütfen :)

Alıntı yapılan: MrDarK - 01 Mayıs 2014, 15:17:30Öncelikle RF alana REQA denilen bir bilgi yolluyoruz. Eğer RF alan içinde bir mifare kart var ise bize cevap yolluyor. Ardından RF alana kartın seri numarasını öğrenmek için bir kod yolluyoruz. Kart seri numarasını gönderiyor. Ardından Anticollision (çarpışmama) RF alanda birden başka bir kart olmadığını teyit ettikten sonra Select denilen işlemi yapıyoruz.

Başlık: Ynt: RFID(MFRC522) İncelemesi Hakkında Kısa Kısa
Gönderen: zuzunin - 11 Mart 2019, 14:22:55
CCS C ile yazılmış kütüphane ve örnek devreye buradan ulaşabilirsiniz:

https://youtu.be/htoHSMjgVSE


Kart bilgisini seri haberleşme ile bilgisayar üzerinden  görmek için şu kodu kullanabilirsiniz:

#INCLUDE <16F876.H>
#USE DELAY(CLOCK=20M)
#FUSES PUT,HS,NOWDT,NOPROTECT,NOLVP
#use rs232(baud=9600,xmit=pin_c6,rcv=pin_c7)

#define MFRC522_CS         PIN_C2               
#define MFRC522_SCK        PIN_C3
#define MFRC522_SI         PIN_C1                         
#define MFRC522_SO         PIN_C0             
#define MFRC522_RST        PIN_C4   
#include<Built_in.h>


void main()
{

   CHAR UID[6];
   UNSIGNED int TagType;               
   MFRC522_Init ();
   delay_ms(100);
   
   
   WHILE (true)
   {
     
      IF (MFRC522_isCard (&TagType)) //Check any card
      {                                           
         //Read ID
         IF (MFRC522_ReadCardSerial (&UID))             
         {
           printf("\nUID:");
           FOR (INT i=0; i<5;i++)
           {
           printf("%X",UID[i]);
           }
           printf("");
       
         
            }     
           
         }
       
        MFRC522_Halt () ;
      }   
   }
Başlık: Ynt: RFID(MFRC522) İncelemesi Hakkında Kısa Kısa
Gönderen: Mucit23 - 11 Mart 2019, 15:24:00
TM_MFRC522_SelectTag işlemini denemiştim. Yani ilk önce kart sorgulaması yaptım. Ok aldıktan sonra selec tag işlemini yaptım. Oda OK olduktan sonra Auth işlemi yapıyordum. Fakat bu işlem başarılı bir şekilde sonuçlanmıyor. Anti Coolision işlemini yapmak şartmı çünkü benim testlerimde öyle bir durum gerçekleşmiyor. Ama Halt işlemini pasif yapmayı deneyeceğim. Sonucu yazarım.
Başlık: Ynt: RFID(MFRC522) İncelemesi Hakkında Kısa Kısa
Gönderen: Mucit23 - 12 Mart 2019, 00:06:38
Yahu şu kartlara blok yazma ve okuma yapabilen varmı. İnternette ne kadar uygulama yapan varsa ID kontrol edip led felan yakmış.

@MrDarK Hocam hepsini denedim. Fakat olmadı.

Check yaptıktan sonra TM_MFRC522_Halt işlemini yoruma alırsam bundan sonraki Select Tag işlemi de başarısız oluyor. En son dediğiniz gibi yaptım.

if (TM_MFRC522_Check(CardID) == MI_OK)
{
printf( "[%02x-%02x-%02x-%02x-%02x] \r\n", CardID[0], CardID[1], CardID[2], CardID[3], CardID[4]);
if(TM_MFRC522_SelectTag(CardID) == MI_OK)
{
           printf("OK TAG Selected\r\n");

if( (TM_MFRC522_Auth(PICC_AUTHENT1A,1,KEY,CardID) == MI_OK))
{
    printf("AUTH OK\r\n");
}
else
{
   printf("AUTH ERROR\r\n");
}
}
       else
{
   printf("FAILED TAG SELECT\n\n");
}
}

Ama sorun devam ediyor. Bir türlü Sektöre giriş yapamıyorum. Kafayı yedirtecek.

@MrDarK STM32 için denediğin verebileceğin bir örnek varmı. Rica etsem paylaşabilirmisin. Karşılaştırmak adına bakmak istiyorum.

CCS kütüphanesini inceledim. Oda aynı şekilde çalışıyor. Fonksiyon isimleri bile neredeyse aynı. Sorun nerde çözemiyorum.

Birşey Dikkatimi çekti. Kart ID normalde 4 Byte'dan oluşmuyormu? Ben cep telefonu ile okuduğumda 69:77:DC:06 olarak okuyorum. Benim kendi yazılımda ise CardID 5 Byte'dan oluşuyor. Okuduğum değerler 69:77:DC:06:C4 şeklinde oluyor. Acaba kart farklılığı mı var? C4 değeri nerden geliyor?
Başlık: Ynt: RFID(MFRC522) İncelemesi Hakkında Kısa Kısa
Gönderen: MrDarK - 12 Mart 2019, 12:32:09
Hocam selamlar,

Arduino ile çok güzel çalışan uygulamalar var. Okuma yazma increment decrement. Benim kendi library'im state machine göre uyarlanmış hali o sebeple paylaşılabileceğim gibi alt yapısı yok. Şu an yapabileceğiniz arduino library'sinde işletilen kodlar ile sizin kodları karşılaştırmak olabilir.

Card Id için 5 byte kullanmışım. Aşağıdaki resimdeki şablona göre 4 byte seri no, 1 byte ise crc oluyor.

(https://i.hizliresim.com/MVZAQM.jpg)

Birde şimdi dikkatimi çekti. TM_MFRC522_Auth fonksiyonunda 2. parametre blok numarası. Blok 1 için auth olmaya çalışıyorsanız hata alırsınız. Sadece sector trailer'a auth işlemi yapılabilir. Hatanın temeli sanırım burası. Ayrıca ilk 4 blok (0-1-2-3) Manufacturer specific. Sonraki sektörlere auth işlemi yapmanız gerekiyor. Auth yaparken sektöre değil blok numarasına auth işlemi yapılıyor. 0. sektör manufacturer, 1.sektörde işlem yapalım diyelim blok numaraları (4 - 5 - 6 - 7 ) şeklindedir. Siz 1.sektöre auth yapmak istiyorsanız 7 numaralı bloktan izin istemelisiniz. Onay geldikten sonra 4 - 5 - 6 numaralı bloklar kullanılabilir olacaktır.

MrDarK

Başlık: Ynt: RFID(MFRC522) İncelemesi Hakkında Kısa Kısa
Gönderen: Mucit23 - 12 Mart 2019, 13:25:48
MrDark dediğini anladım ve hemen uyguladım. 1. Sektörde okuma yazma yapabilmek için 7 nolu bloktan giriş izni isteniyor key ile.

Check ve Tag Select işlemi yaptıktan sonra aşağıdaki sorgu ile auth işlemi yapıyorum.

if( (TM_MFRC522_Auth(PICC_AUTHENT1A,7,KEY,CardID) == MI_OK))

Aynı sorun devam ediyor. MI_ERROR alıyorum sonuç olarak.

Siz arduinoyu hatırlatınca hemen 2 dk da aynı modülü arduino ya bağladım ve içerisine "rfid default keys" örneğini yükledim. 5. dakika olmadan sistemi çalıştırdım.  Denediğim 2 farklı kart var elimde, iki karta da 0xFF keyler ile giriş yapılabiliyor.
Alıntı YapTry the most used default keys to print block 0 of a MIFARE PICC.
Card UID: 59 9F F3 4E
PICC type: MIFARE 1KB
Success with key: FF FF FF FF FF FF
Block 0: 59 9F F3 4E 7B 08 04 00 02 3B E4 D8 2C 1E CE 1D

Card UID: 69 77 DC 06
PICC type: MIFARE 1KB
Success with key: FF FF FF FF FF FF
Block 0: 69 77 DC 06 C4 08 04 00 02 A6 80 7B 00 8A 5B 1D


Blok0 daki datalar telefonumda okuduklarımla uyuşuyor. Ayrıca Block yazma ve okuma örneklerini denedim onlarda çalışıyor. Arduino kütüphanesine biraz bakmam lazım.
Başlık: Ynt: RFID(MFRC522) İncelemesi Hakkında Kısa Kısa
Gönderen: Mucit23 - 12 Mart 2019, 17:48:53
Arduino Kütüphanesi Güzel çalışıyor. Ben kendi kütüphanemi biraz debug da inceledim.

Auth İşlemi bu fonksiyonda yapılıyor.
//-------------------------------------------------
TM_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;
}

Program en son burda hataya düşüyor.
if ((status != MI_OK) || (!(TM_MFRC522_ReadRegister(MFRC522_REG_STATUS2) & 0x08))) {   
status = MI_ERR;   
}

TM_MFRC522_ToCard fonksiyonuna cevap olarak MI_OK geliyor fakat MFRC522_REG_STATUS2 registerinin 3. biti 0 olduğu için hataya düşüyor.

İlgili bit MFCrypto1On biti şöyle bir açıklama var.
Alıntı Yapindicates that the MIFARE Crypto1 unit is switched on and
therefore all data communication with the card is encrypted
can only be set to logic 1 by a successful execution of the
MFAuthent command
only valid in Read/Write mode for MIFARE standard cards
this bit is cleared by software

Sanırım şifreli haberleşme yapılmadığı için bu hataya düşüyor. Nasıl düzeltilir pek anlayamadım. Çözenler bu işi nasıl çözmüş onuda bilmiyorum.

Akşam CCS C ve Pic için yazılmış kodları bir deneyeyim. Olmadı Arduino Kütüphanesini satır satır ARM da çalışacak şekilde tekrar yazacam. Bu da baya bi vakit demek.
Başlık: Ynt: RFID(MFRC522) İncelemesi Hakkında Kısa Kısa
Gönderen: görkem - 12 Mart 2019, 21:14:43
Hocam ben haberleştirdim ve veri yazıp okuyabilmiştim blok lara. Pc başına geçince göndereyim kodu f103 için kullanmıştım.sağlam saç baş yolmuştum :)
Başlık: Ynt: RFID(MFRC522) İncelemesi Hakkında Kısa Kısa
Gönderen: Mucit23 - 12 Mart 2019, 21:18:43
@görkem şuan aynı saç baş yolma evresindeyim. Çok makbule geçer.

@MrDarK Ciddi anlamda internette dolaşan örneklerin hepsi sorunlu. Yada kimsenin bilmediği bir hata yapıyorum. (Bu ihtimal daha kuvvetli) Az önce CCS için verilen örneği Pic16F1827 ile denedim aynı şekilde çalışıyor. Check Ve SelectTag işleminde sorun yok Gayet güzel çalışıyor fakat Auth işlemi yaptığımda program donuyor. Çalışmıyor. Auth yapmadan önce başka bir işlem yapılması gerekiyor fakat bununla ilgili pek bir açıklama bulamadım.
Başlık: Ynt: RFID(MFRC522) İncelemesi Hakkında Kısa Kısa
Gönderen: MrDarK - 13 Mart 2019, 11:05:26
Gerçekten ilginç yaşadıklarınız. Bu kadar zor bir cihaz değil MFRC522 abartmayalım :) 2014 yılında dökümanların eksikliği library'lerin az oluşu vs bana çektirmişti ama hala aynı sorunları yaşıyor olmanız enteresan geliyor.

Fakat bana göre yanlış yoldasınız. Hazır şeylere yönelmeyin artık farklı ne yapıyorsunuz onu arayın. Logic analizör ile registerları kontrol ederek ilerlemenizi öneririm.

Sıralamada farklı veya ekstra birşey yok,
Request -> Anticoll -> Select -> Auth -> Read / Write / X

Başlık: Ynt: RFID(MFRC522) İncelemesi Hakkında Kısa Kısa
Gönderen: Mucit23 - 13 Mart 2019, 11:27:47
Kullandığım kütüphane de zaten sırayla bunları yapıyorum.

Request ile sorgu yapıyor. OK gelirse Anticoll işlemi ile ID okunuyor. ID okumada sorun yok. Ardından Select Tag yapıyorum. Bu aşamada da sorun yok. Fakat Auth işleminde MFRC522_REG_STATUS2 registerinin StopCrypto1 biti daima sıfır oluyor. En son çıkarken bu register kontrol ediliyor. Bundan dolayı hataya düşüyor.

Bu sorunu yaşayanlar Auth işleminden sonra mutlaka bu bitin temizlenmesi gerektiğini söylüyor fakat bende hiç set edilmiyor. Sorun temelde bu aslında. Bu muhtemelen eksik bir ayarla ilgili fakat dökümanlarda bununla ilgili bir açıklama bulamadım.
Başlık: Ynt: RFID(MFRC522) İncelemesi Hakkında Kısa Kısa
Gönderen: MrDarK - 13 Mart 2019, 13:24:14
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);
Başlık: Ynt: RFID(MFRC522) İncelemesi Hakkında Kısa Kısa
Gönderen: Mucit23 - 13 Mart 2019, 17:08:06
@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ı?
Başlık: Ynt: RFID(MFRC522) İncelemesi Hakkında Kısa Kısa
Gönderen: MrDarK - 13 Mart 2019, 17:37:13
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);
Başlık: Ynt: RFID(MFRC522) İncelemesi Hakkında Kısa Kısa
Gönderen: gokhangokcen - 13 Mart 2019, 17:48:40
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?
Başlık: Ynt: RFID(MFRC522) İncelemesi Hakkında Kısa Kısa
Gönderen: Mucit23 - 13 Mart 2019, 17:54:27
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.
Başlık: Ynt: RFID(MFRC522) İncelemesi Hakkında Kısa Kısa
Gönderen: görkem - 13 Mart 2019, 18:57:24
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.
Başlık: Ynt: RFID(MFRC522) İncelemesi Hakkında Kısa Kısa
Gönderen: Mucit23 - 13 Mart 2019, 23:44:28
@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.
Başlık: Ynt: RFID(MFRC522) İncelemesi Hakkında Kısa Kısa
Gönderen: MrDarK - 14 Mart 2019, 17:02:35
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.

(https://i.hizliresim.com/oX57V2.jpg)
Başlık: Ynt: RFID(MFRC522) İncelemesi Hakkında Kısa Kısa
Gönderen: Mucit23 - 14 Mart 2019, 18:13:20
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.
Başlık: Ynt: RFID(MFRC522) İncelemesi Hakkında Kısa Kısa
Gönderen: görkem - 15 Mart 2019, 11:47:48
@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 ?
Başlık: Ynt: RFID(MFRC522) İncelemesi Hakkında Kısa Kısa
Gönderen: Mucit23 - 15 Mart 2019, 12:01:38
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ı.
Başlık: Ynt: RFID(MFRC522) İncelemesi Hakkında Kısa Kısa
Gönderen: MrDarK - 15 Mart 2019, 12:57:22
@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..
Başlık: Ynt: RFID(MFRC522) İncelemesi Hakkında Kısa Kısa
Gönderen: Hiko_sv - 24 Nisan 2019, 18:31:41
@ 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 (
Başlık: Ynt: RFID(MFRC522) İncelemesi Hakkında Kısa Kısa
Gönderen: cyber_cemati - 08 Kasım 2019, 12:04:21
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.
Başlık: Ynt: RFID(MFRC522) İncelemesi Hakkında Kısa Kısa
Gönderen: cyber_cemati - 10 Kasım 2019, 11:45:09
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?
Başlık: Ynt: RFID(MFRC522) İncelemesi Hakkında Kısa Kısa
Gönderen: MrDarK - 11 Kasım 2019, 10:37:00
Konu açık aslında 6 sayfa yorum var. Eğer sayfalardaki mesajların hepsini okuduysan takıldığın yeri sorabilirsin.
Başlık: Ynt: RFID(MFRC522) İncelemesi Hakkında Kısa Kısa
Gönderen: cyber_cemati - 11 Kasım 2019, 21:41:02
Sayın MrDark hocam.
Aslında amacım en basitten zora doğru gidip sistemi çözmek. Eğer sizin için de mümkünse sizden ricam bu modül en basit şekilde nasıl çalışır?
Şöyle örnek vereyim. Mesela iki kartın aynı anda çalışmaması için anticollision etiketinden doğrulama yapıyoruz. Bunu geçirmeden okuma yapılabilir mi?
Ya da crc sorgusu yapılmadan bu iş olur mu?

Mesela kod yazacağımda kesmeleri aktif etmeden çalıştığını görmek istiyorum. Ardından anti_coll özelliğini açıp denemelere devam etmek istiyorum.

İnşallah meramımı anlatabilmişimdir.

Cevabınızı merakla bekliyorum MrDark hocam. Hayırlı günler.

Not: Bir de hocam gönderdiğim yazılar (diğer üyeler için de mi böyle bilmiyorum) onaylanmadan gözükmüyor. Bu işlem de biraz zaman alıyor gibi. Benim hesapla ilgili bir sorun mudur bu durum?
Başlık: Ynt: RFID(MFRC522) İncelemesi Hakkında Kısa Kısa
Gönderen: MrDarK - 12 Kasım 2019, 08:55:53
Selamlar,

Yeni üye olduğunuz ve mesaj sayınız düşük olduğundan onaylanması gerekiyor. Mesaj sayınız arttıkça bu kategoriden çıkacaksınız. Haliyle sabırla beklemenizi rica ediyoruz.

Anticollision yapmadan okuma yapabileceğini sanmıyorum (denemedim). Arduino ile çalışan örnek programlar var, oradaki örnekler üzerinden de denemelerinizi yapabilirsiniz.

Her aşamada led yak söndür yaparak kodunuzun ne durumda olduğunu da gözlemleyebilirsiniz.

En basit şekilde nasıl çalışır sorusuna pek bir anlam veremedim, modülü kuruyorsunuz çalışıyor. Kurmadan çalışmaz veya 10 parametre var ise 4'unu kurayım 6'sını kurmayayım çalışır mı şekilde soruyorsanız çalışmaz tabiki :)
Başlık: Ynt: RFID(MFRC522) İncelemesi Hakkında Kısa Kısa
Gönderen: cyber_cemati - 12 Kasım 2019, 21:15:17
MrDark hocam öncelikle sabırla cevap verdiğiniz için teşekkür ederim.
Hocam şöyle bir örnekle açıklayayım. Bir süre önce nrf24l01+ modülü ile çalıştım. Bu modülde aynı rc522 gibi adreslere gidip bazı ayarlamalar yaparak çalışıyor.
Mesela nrf modülünde crc biti var. Bu biti isterseniz kullanmayabilirsiniz. Modül yine de istediğiniz veriyi gönderebilir. Ya da duplex half dublex ayarını yapmanıza da gerek yok. Kesmelerde de durum geçerli. Kesmeleri ayarlamasanız da bu modül çalışır. Kayıtçıları nrf'nin de çok ama hepsini ayarlamanıza gerek yok. Tabi sonradan ihtiyaca binaen register ayarlaması yapabilirsiniz. Bu modülle çalışırken burada anlatmaya çalıştığım gibi önce temel olarak çalıştırdım. Ardından crc bitini denedim. Ya da kesme ile deneme yaptım. Duplex olayını denedim falan.
Tam olarak anlatmaya çalıştığım da buydu. rc522'de de böyle ayarlanmasa da modülün çalıştığı adresler var mıdır?
İyi akşamlar...
Başlık: Ynt: RFID(MFRC522) İncelemesi Hakkında Kısa Kısa
Gönderen: cyber_cemati - 13 Kasım 2019, 08:58:32
'****************************************************************
'*  Name    : UNTITLED.BAS                                      *
'*  Author  : [select VIEW...EDITOR OPTIONS]                    *
'*  Notice  : Copyright (c) 2018 [select VIEW...EDITOR OPTIONS] *
'*          : All Rights Reserved                               *
'*  Date    : 24/08/2018                                        *
'*  Version : 1.0                                               *
'*  Notes   :                                                   *
'*          :                                                   *
'****************************************************************
;-------------------------------------------------------------------------------
;**** Added by Fuse Configurator ****
; Use the Fuse Configurator plug-in to change these settings


@ DEVICE pic16F628a
@ DEVICE pic16F628a, WDT_ON
@ DEVICE pic16F628a, PWRT_ON
@ DEVICE pic16F628a, BOD_ON
@ DEVICE pic16F628a, PROTECT_OFF
@ DEVICE pic16F628a, LVP_OFF
@ DEVICE pic16F628a, CPD_OFF
@ DEVICE pic16F628a, MCLR_OFF
@ DEVICE pic16F628a, INTRC_OSC_NOCLKOUT
TRISA=%01000000  'A portu 6. pin giriş diğerleri çıkış olarak ayarlandı.
TRISB=0  'B portu çıkış olarak ayarlandı.

'mfrc 522 tanımlamaları
miso var porta.6   'master in slave out
mosi var porta.7  'master out slave in
sck var porta.0  'sck pini
nss var porta.1 'sda pini

PORTA=0
PORTB=0

CMCON=7      'komparatörler iptal.
OPTION_REG=7 'pull up direncleri pasif   
 'lcd tanımlamaları
DEFINE LCD_DREG PORTB 'lcd data pinleri portb ye bağlı 
DEFINE LCD_DBIT 0     'lcd data pinleri 0. pinden başlıyor.
DEFINE LCD_EREG PORTB  'enable pini portb de
DEFINE LCD_EBIT 4      'enable portb 4. pine bağlı
DEFINE LCD_RSREG PORTB  ' rs pini portb de
DEFINE LCD_RSBIT 5      ' rs portb 5. pine bağlı
DEFINE LCD_BITS 4       'data 4 pini bağlı
DEFINE LCD_LINES 2       'lcd 2 satır
pause 200

  ' Pin Assignments
  Symbol RC522_PCD_IDLE       = $00
  Symbol RC522_PCD_AUTHENT    = $0E
  Symbol RC522_PCD_RECEIVE    = $08
  Symbol RC522_PCD_TRANSMIT   = $04
  Symbol RC522_PCD_TRANSCEIVE = $0C
  Symbol RC522_PCD_RESETPHASE = $0F
  Symbol RC522_PCD_CALCCRC    = $03

  Symbol RC522_PICC_REQIDL    = $26
  Symbol RC522_PICC_REQALL    = $52
  Symbol RC522_PICC_ANTICOLL_CL1  = $93
  Symbol RC522_PICC_ANTICOLL_CL2  = $95
  Symbol RC522_PICC_ANTICOLL_CL3  = $97

  Symbol RC522_PICC_SELECTTAG_CL1 = $93
  Symbol RC522_PICC_SELECTTAG_CL2 = $95
  Symbol RC522_PICC_SELECTTAG_CL3 = $97
  Symbol RC522_PICC_AUTHENT1A = $60
  Symbol RC522_PICC_AUTHENT1B = $61
  Symbol RC522_PICC_READ      = $30
  Symbol RC522_PICC_WRITE     = $A0
  Symbol RC522_PICC_DECREMENT = $C0
  Symbol RC522_PICC_INCREMENT = $C1
  Symbol RC522_PICC_RESTORE   = $C2
  Symbol RC522_PICC_TRANSFER  = $B0
  Symbol RC522_PICC_HALT      = $50 
 
  Symbol RC522_MI_OK          = 0
  Symbol RC522_MI_NOTAGERR    = 1
  Symbol RC522_MI_ERR         = 2

  Symbol RC522_Reg_Reserved00     = $00
  Symbol RC522_Reg_CommandReg     = $01
  Symbol RC522_Reg_ComIEnReg     = $02
  Symbol RC522_Reg_DivlEnReg      = $03
  Symbol RC522_Reg_ComIrqReg     = $04
  Symbol RC522_Reg_DivIrqReg      = $05
  Symbol RC522_Reg_ErrorReg       = $06
  Symbol RC522_Reg_Status1Reg     = $07
  Symbol RC522_Reg_Status2Reg     = $08
  Symbol RC522_Reg_FIFODataReg    = $09
  Symbol RC522_Reg_FIFOLevelReg   = $0A
  Symbol RC522_Reg_WaterLevelReg  = $0B
  Symbol RC522_Reg_ControlReg     = $0C
  Symbol RC522_Reg_BitFramingReg  = $0D
  Symbol RC522_Reg_CollReg        = $0E
  Symbol RC522_Reg_Reserved01     = $0F
 
  Symbol RC522_Reg_Reserved10     = $10
  Symbol RC522_Reg_ModeReg        = $11
  Symbol RC522_Reg_TxModeReg      = $12
  Symbol RC522_Reg_RxModeReg      = $13
  Symbol RC522_Reg_TxControlReg   = $14
  Symbol RC522_Reg_TxAutoReg      = $15
  Symbol RC522_Reg_TxSelReg       = $16
  Symbol RC522_Reg_RxSelReg       = $17
  Symbol RC522_Reg_RxThresholdReg = $18
  Symbol RC522_Reg_DemodReg       = $19
  Symbol RC522_Reg_Reserved11     = $1A
  Symbol RC522_Reg_Reserved12     = $1B
  Symbol RC522_Reg_MifareReg      = $1C
  Symbol RC522_Reg_Reserved13     = $1D
  Symbol RC522_Reg_Reserved14     = $1E
  Symbol RC522_Reg_SerialSpeedReg = $1F
 
  Symbol RC522_Reg_Reserved20        = $20 
  Symbol RC522_Reg_CRCResultRegM     = $21
  Symbol RC522_Reg_CRCResultRegL     = $22
  Symbol RC522_Reg_Reserved21        = $23
  Symbol RC522_Reg_ModWidthReg       = $24
  Symbol RC522_Reg_Reserved22        = $25
  Symbol RC522_Reg_RFCfgReg          = $26
  Symbol RC522_Reg_GsNReg            = $27
  Symbol RC522_Reg_CWGsPReg          = $28
  Symbol RC522_Reg_ModGsPReg         = $29
  Symbol RC522_Reg_TModeReg          = $2A
  Symbol RC522_Reg_TPrescalerReg     = $2B
  Symbol RC522_Reg_TReloadRegH       = $2C
  Symbol RC522_Reg_TReloadRegL       = $2D
  Symbol RC522_Reg_TCounterValueRegH = $2E
  Symbol RC522_Reg_TCounterValueRegL = $2F
 
  Symbol RC522_Reg_Reserved30      = $30
  Symbol RC522_Reg_TestSel1Reg     = $31
  Symbol RC522_Reg_TestSel2Reg     = $32
  Symbol RC522_Reg_TestPinEnReg    = $33
  Symbol RC522_Reg_TestPinValueReg = $34
  Symbol RC522_Reg_TestBusReg      = $35
  Symbol RC522_Reg_AutoTestReg     = $36
  Symbol RC522_Reg_VersionReg      = $37
  Symbol RC522_Reg_AnalogTestReg   = $38
  Symbol RC522_Reg_TestDAC1Reg     = $39
  Symbol RC522_Reg_TestDAC2Reg     = $3A
  Symbol RC522_Reg_TestADCReg      = $3B
  Symbol RC522_Reg_Reserved31      = $3C
  Symbol RC522_Reg_Reserved32      = $3D
  Symbol RC522_Reg_Reserved33      = $3E
  Symbol RC522_Reg_Reserved34      = $3F
   
  Symbol RC522_MaxLen = 20


  RC522_Temp var Byte
  RC522_ReqMode var Byte



  RC522_Address var Byte
  RC522_Value var Byte
  RC522_BitMask var Byte

  RC522_backLen var Byte
  RC522_bitLen var Byte
  RC522_backData var Byte[20]
  RC522_sendLen var Byte
  RC522_sendData var Byte[20]
  RC522_Status var Byte

  RC522_irqEn var Byte
  RC522_waitIRq var Byte
  RC522_lastBits var Byte
  n var Byte
  i var Word
  RC522_Command var Byte
  serNumCheck var Byte
  RC522_BlockAddress var Byte
  RC522_RequestMode var Byte
  RC522_Level var Byte

  RC522_ATQA var Byte[2]
  RC522_Token var Byte[10]
  RC522_TokenLen var Byte
  RC522_SAK var Byte


lcdout $fe,1,"Modul init."
  GoSub RC522_Init
lcdout $fe,$C0,"Modul ok."
DetectLoop: 
  GoSub RC522_DetectCard
  If RC522_TokenLen=0 Then GoTo DetectLoop
  lcdout $fe,1, "ATQA: ", Hex RC522_ATQA[0] , Hex RC522_ATQA[1]
  pause 1000
  lcdout $fe,$c0, "Token Length: ",Hex RC522_TokenLen
  lcdout $fe,1, "Card read UID: "
  n=0
  While n<RC522_TokenLen
    lcdout $fe,$c0, Hex RC522_Token[n], ","
    n= n +1
  Wend

  'RsOut "SAK: ", Hex RC522_SAK, 13,10
  GoTo DetectLoop

RC522_DetectCard:
  RC522_TokenLen =0
  RC522_RequestMode=RC522_PICC_REQIDL  'kartı ara
  lcdout $fe,1,"dc bolum 1"
  pause 500
  GoSub RC522_Request
  If RC522_Status=RC522_MI_OK Then
    RC522_ATQA[0]=RC522_backData[0]
    RC522_ATQA[1]=RC522_backData[1]
  Else
    Return 
  EndIf
  lcdout $fe,1,"bolum 2 dc"
  pause 500
 
  RC522_Level=RC522_PICC_ANTICOLL_CL1
  GoSub RC522_Anticoll                  ' başka kart var mı?
  If RC522_Status=RC522_MI_OK Then
    If RC522_backData[0]=$88 Then
      ' More data to come
      RC522_Token[0]=RC522_backData[1]
      RC522_Token[1]=RC522_backData[2]
      RC522_Token[2]=RC522_backData[3]
      RC522_Level=RC522_PICC_SELECTTAG_CL1
      GoSub RC522_SelectTag
      RC522_Level=RC522_PICC_ANTICOLL_CL2
      GoSub RC522_Anticoll
      If RC522_Status=RC522_MI_OK Then
        If RC522_backData[0]=$88 Then
        lcdout $fe,1,"bolum 3 dc"
  pause 500
          RC522_Token[3]=RC522_backData[1]
          RC522_Token[4]=RC522_backData[2]
          RC522_Token[5]=RC522_backData[3]
          RC522_Level=RC522_PICC_SELECTTAG_CL2
          GoSub RC522_SelectTag
          RC522_Level=RC522_PICC_ANTICOLL_CL3
          GoSub RC522_Anticoll
          If RC522_Status=RC522_MI_OK Then
            RC522_Token[6]=RC522_backData[0]
            RC522_Token[7]=RC522_backData[1]
            RC522_Token[8]=RC522_backData[2]
            RC522_Token[9]=RC522_backData[3]
            RC522_TokenLen=10
            RC522_Level=RC522_PICC_SELECTTAG_CL3
            GoSub RC522_SelectTag
            RC522_SAK=RC522_backData[0]
          EndIf
        Else
          RC522_Token[3]=RC522_backData[0]
          RC522_Token[4]=RC522_backData[1]
          RC522_Token[5]=RC522_backData[2]
          RC522_Token[6]=RC522_backData[3]
          RC522_TokenLen=7
          RC522_Level=RC522_PICC_SELECTTAG_CL2
          GoSub RC522_SelectTag
          RC522_SAK=RC522_backData[0]
        EndIf
      EndIf
    Else
    lcdout $fe,1,"bolum 4 dc"
  pause 500
      For n=0 To 3
        RC522_Token[n]=RC522_backData[n]
      Next 
      RC522_TokenLen=4
      RC522_Level=RC522_PICC_SELECTTAG_CL1
      GoSub RC522_SelectTag
      RC522_SAK=RC522_backData[0]
    EndIf
  EndIf 
Return

RC522_ToCard:
  RC522_backLen =0
  RC522_Status=RC522_MI_ERR
   RC522_irqEn =0
   RC522_waitIRq =0
   RC522_lastBits =0
   n=0
   i=0
 
  If RC522_Command=RC522_PCD_AUTHENT Then 'MIFARE standart kimlik doğrulamasını bir okuyucu olarak gerçekleştirir.
    RC522_irqEn=$12
    RC522_waitIRq=$10
  EndIf
  If RC522_Command=RC522_PCD_TRANSCEIVE Then  'FIFO tampondan antene veri iletir ve iletimden sonra alıcıyı otomatik olarak etkinleştirir.
    RC522_irqEn=$77
    RC522_waitIRq=$30
  EndIf
  lcdout $fe,1,"bolum 1 tocard"
   pause 500
  RC522_Address=RC522_Reg_ComIEnReg 'donanım kesmeler aktif. status kesme
  RC522_Value=RC522_irqEn | $80
  GoSub RC522_Write
  RC522_Address=RC522_Reg_ComIrqReg   'tüm kesmeler açık
  RC522_BitMask=$80
  GoSub RC522_ClearBitMask
  RC522_Address=RC522_Reg_FIFOLevelReg  'flush fifo
  RC522_BitMask=$80
  GoSub RC522_SetBitMask
  RC522_Address=RC522_Reg_CommandReg 'mifare boşta komutu gönderdik.
  RC522_Value=RC522_PCD_IDLE
  GoSub RC522_Write
  While i<RC522_sendLen
    RC522_Address=RC522_Reg_FIFODataReg
    RC522_Value=RC522_sendData[i] 'fifodatareg e 1 gönderiyor. sebep? Fifodaki dataları oku
    GoSub RC522_Write
    i= i + 1     
  Wend
  lcdout $fe,1,"bolum 2 tocard"
   pause 500
  RC522_Address=RC522_Reg_CommandReg
  RC522_Value=RC522_Command      'commangreg e hangi komut verilecek
  GoSub RC522_Write
  If RC522_Command=RC522_PCD_TRANSCEIVE Then 'eger komut transceive ise
    RC522_Address=RC522_Reg_BitFramingReg
    RC522_BitMask=$80
    GoSub RC522_SetBitMask         'bitframe reg in 7. biti 1 yaparak transceive başlat.
  EndIf
  i = 2000   '25ms gecikme süresi
  While i>0
    RC522_Address=RC522_Reg_ComIrqReg  'adresi kesmeye ayarla
    GoSub RC522_Read
    n=RC522_Value   'gelen value değişkenini n e aktar.
   i=i-1    'bunu sor.
    RC522_Temp=RC522_Value & RC522_waitIRq 'başta bununla ilgili atama yapılmıştı.
    If RC522_Temp>0 Then goto devam
  Wend
  lcdout $fe,1,"bolum 3 tocard"
  pause 500
  devam:
  RC522_Address=RC522_Reg_BitFramingReg
  RC522_BitMask=$80
  GoSub RC522_ClearBitMask   'bitframingreg in 7. biti sanırım 0 yapılıyor.
  If i=0 Then Return
  RC522_Address=RC522_Reg_ErrorReg 'hata registerine bak
  GoSub RC522_Read
  RC522_Temp=RC522_Value & $1B  'hatalara bak 11011
  If RC522_Temp=0 Then        'eger hata yoksa
    RC522_Status=RC522_MI_OK   'durumu tamam yap.
    RC522_Temp=n & RC522_irqEn & $01   'bunu anlamadım.
    If RC522_Temp>0 Then RC522_Status=RC522_MI_NOTAGERR
    If RC522_Command=RC522_PCD_TRANSCEIVE Then
      RC522_Address=RC522_Reg_FIFOLevelReg
      GoSub RC522_Read
      RC522_backLen=RC522_Value    'fifo data boyutu
      RC522_Address=RC522_Reg_ControlReg
      GoSub RC522_Read
      RC522_lastBits=RC522_Value & $07 'son bit değerine bak 7 ile neden and işlemi yaptık?
      RC522_bitLen=RC522_backLen * 8
      If RC522_lastBits<>0 Then
        RC522_bitLen=RC522_bitLen - 8 + RC522_lastBits  'bu işlem neden yapıldı?
      EndIf
      lcdout $fe,1,"bolum 4 tocard"
      pause 500
      If n=0 Then n=1
      If n>RC522_MaxLen Then n=RC522_MaxLen
      i=0
      While i<n  'n 0 ve 1 değer alacak.
        RC522_Address=RC522_Reg_FIFODataReg
        GoSub RC522_Read
        RC522_backData[i]=RC522_Value 'burada fifodatareg den 2 veri alınıyor.
        i= i + 1
      Wend
    EndIf
  Else
    RC522_Status=RC522_MI_ERR
  EndIf
Return

' Must have RC522_RequestMode set
RC522_Request:
 lcdout $fe,1,"bolum 1 rq gir"
 pause 500
  RC522_Status=0
  RC522_Address=RC522_Reg_BitFramingReg
  RC522_Value=$07
  GoSub RC522_Write
  RC522_Command=RC522_PCD_TRANSCEIVE
  RC522_sendData[0]=RC522_RequestMode
  RC522_sendLen=1
  GoSub RC522_ToCard
  If RC522_bitLen<>$10 Then RC522_Status=RC522_MI_ERR
  If RC522_Status<>RC522_MI_OK Then RC522_Status=RC522_MI_ERR
   lcdout $fe,1,"bolum 1 rq cik"
   pause 500
Return

' Must have RC522_AnticollLevel set
RC522_Anticoll:
  RC522_backLen =0
  serNumCheck=0
  RC522_Address=RC522_Reg_BitFramingReg
  RC522_Value=0
  GoSub RC522_Write
  RC522_sendData[0]=RC522_Level
  RC522_sendData[1]=$20
  RC522_sendLen=2
  RC522_Command=RC522_PCD_TRANSCEIVE
  GoSub RC522_ToCard
  If RC522_Status=RC522_MI_OK Then
    i =0
        'RsOut "backlen: ", Hex RC522_backLen, 13,10
    If RC522_backLen=5 Then  'kart seri numara kontrolü
      While i<4
         serNumCheck=serNumCheck ^ RC522_backData[i]
         i= i+1
      Wend
      If serNumCheck<>RC522_backData[i] Then RC522_Status=RC522_MI_ERR
    Else
      RC522_Status=RC522_MI_ERR
    EndIf
  EndIf
  lcdout $fe,1,"bolum 2 anticoll"
  pause 520
Return

' Must have the RC522_sendData and RC522_sendLen variables populated.  CRC saved at end of send buffer.
RC522_CalculateCRC:
  RC522_Address=RC522_Reg_DivIrqReg
  RC522_BitMask=$04
  GoSub RC522_ClearBitMask
  RC522_Address=RC522_Reg_FIFOLevelReg
  RC522_BitMask=$80
  GoSub RC522_SetBitMask
  i=0
  While i<RC522_sendLen
    RC522_Address=RC522_Reg_FIFODataReg
    RC522_Value=RC522_sendData[i]
    GoSub RC522_Write
    i= i+1
  Wend
  RC522_Address=RC522_Reg_CommandReg
  RC522_Value=RC522_PCD_CALCCRC
  GoSub RC522_Write
  i=$FF
  CRCWait:
    RC522_Address=RC522_Reg_DivIrqReg
    GoSub RC522_Read
    i= i -1
    If RC522_Value.2=1 Then GoTo CRCFound
  If i>0 Then GoTo CRCWait 
  CRCFound:
  RC522_Address=RC522_Reg_CRCResultRegL
  GoSub RC522_Read
  RC522_sendData[RC522_sendLen]=RC522_Value
  rc522_sendlen= RC522_sendLen+1
  RC522_Address=RC522_Reg_CRCResultRegM
  GoSub RC522_Read
  RC522_sendData[RC522_sendLen]=RC522_Value
  RC522_sendLen = RC522_sendLen +1
  lcdout $fe,1,"sd slen"
  pause 500
Return

' RC522_backData must contain the 4 byte UID
RC522_SelectTag:
  RC522_sendData[0]=RC522_Level
  RC522_sendData[1]=$70
  i=0
  n=2
  While i<5
    RC522_Temp=RC522_backData[i]
    RC522_sendData[n]=RC522_Temp
    i= i+1
    n= n+1
  Wend
  RC522_sendLen=7
  GoSub RC522_CalculateCRC
  RC522_Command=RC522_PCD_TRANSCEIVE
  GoSub RC522_ToCard
Return

' Must set RC522_BlockAddress before calling
RC522_ReadSector:
  RC522_sendData[0]=RC522_PICC_READ
  RC522_sendData[1]=RC522_BlockAddress
  RC522_sendLen=2
  GoSub RC522_CalculateCRC
  RC522_Command=RC522_PCD_TRANSCEIVE
  GoSub RC522_ToCard
Return

RC522_Init:
  GoSub RC522_Reset
  RC522_Address=RC522_Reg_TModeReg
  RC522_Value=$8D
  GoSub RC522_Write
  RC522_Address=RC522_Reg_TPrescalerReg
  RC522_Value=$3E
  GoSub RC522_Write
  RC522_Address=RC522_Reg_TReloadRegL
  RC522_Value=30
  GoSub RC522_Write
  RC522_Address=RC522_Reg_TReloadRegH
  RC522_Value=0
  GoSub RC522_Write
  RC522_Address=RC522_Reg_TxAutoReg
  RC522_Value=$40
  GoSub RC522_Write
  RC522_Address=RC522_Reg_ModeReg
  RC522_Value=$3D
  GoSub RC522_Write
  RC522_Address=RC522_Reg_RFCfgReg
  RC522_Value=($07<<4)
  GoSub RC522_Write
  GoSub RC522_AntennaOn
Return

RC522_Reset:
  RC522_Address=RC522_Reg_CommandReg
  RC522_Value=RC522_PCD_RESETPHASE
  GoSub RC522_Write
Return

RC522_AntennaOn:
  RC522_Address=RC522_Reg_TxControlReg
  GoSub RC522_Read
  If RC522_Value.0=0 Or RC522_Value.1=0 Then
      RC522_BitMask=3
      GoSub RC522_SetBitMask
  EndIf
Return

RC522_AntennaOff:
  RC522_Address=RC522_Reg_TxControlReg
  RC522_BitMask=3
  GoSub RC522_ClearBitMask
Return

RC522_SetBitMask:
  RC522_Value=0
  GoSub RC522_Read
  RC522_Value=RC522_Value | RC522_BitMask
  GoSub RC522_Write
  Return

RC522_ClearBitMask:
  RC522_Value=0
  GoSub RC522_Read
  RC522_Value=RC522_Value & (~RC522_BitMask)
  GoSub RC522_Write
Return

RC522_Write:
  RC522_Temp=RC522_Address << 1
 ' RC522_Temp=RC522_Temp & $7E
shiftout mosi,sck,1,[rc522_temp]
pause 1
shiftin miso,sck,0,[rc522_value]
pause 1
Return

RC522_Read:

  RC522_Temp=RC522_Address << 1
 ' RC522_Temp=RC522_Temp & $7E
  RC522_Temp=RC522_Temp | $80
shiftout mosi,sck,1,[rc522_temp]
pause 1
shiftin miso,sck,0,[rc522_value]
pause 1
Return
Hocam denediğim kodlar bunlar. Kart okuma yapmadı. Pbp'de yazdım. İncelemeniz mümkün mü?
Sizde daha sade bir anlatımı olan kodunuz varsa beklerim. Şimdiden teşekkür ederim.
cyber_cemati@yahoo.com
Başlık: Ynt: RFID(MFRC522) İncelemesi Hakkında Kısa Kısa
Gönderen: MrDarK - 13 Kasım 2019, 15:28:42
Selamlar,

Pbp dilini bilmiyorum. Mevcuttaki library kodlardan pbp'a transfer edebilirsiniz. NFC ve Mifare standartlarından eksik birşey yapamazsınız çünkü okumak istediğiniz kart mifare protokolüne sabitlenmiş. Yani alıcı ve vericiyi siz tasarlamıyorsunuz. Önceki mesajlarımda söylediğim gibi herhangi bir işlemi atlayarak çalışmasını bekleyemezsiniz.
Başlık: Ynt: RFID(MFRC522) İncelemesi Hakkında Kısa Kısa
Gönderen: cyber_cemati - 13 Kasım 2019, 16:55:26
Hocam bir de ilk baştaki gönderinizde detaylı anlatımın olduğunu söylediğiniz, linkini verdiğiniz library vardı. O linkte sorun var sanırım. Yenilemeniz mümkün mü? İnşaAllah başarabilirim.
Başlık: Ynt: RFID(MFRC522) İncelemesi Hakkında Kısa Kısa
Gönderen: ahuramazda - 29 Ağustos 2020, 17:06:49
Alıntı yapılan: Mucit23 - 15 Mart 2019, 12:01:38Birş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ı.

merhaba,
modülle çalışmaya yeni başladım, elimdeki kartların UID'sini okuyorum şimdilik. sizin de yukarıda belirtmiş olduğunuz durumla karşı karşıyayım. kartı okuyucudan ayırmadığımda sürekli okuma yapıyor. sürekli değil de 1 defa okuma yapabilmesi için nasıl bir yöntem izlediniz?