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
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.
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ı :)
keşke CCS C veya C dili ile başlasaydınız :)
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
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.
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.
kitle beraber gelen kart ayrıca anahtarlık şeklinde gelen vardı onuda denedim hocam onuda okuyamadım.
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ğ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?
aynı durumu stm32 için bende yaşıyorum.
bende yurtdışından RC522 aldım.
if (TM_MFRC522_Check(CardID) == MI_OK)
burdan geçemiyor benimki hocam.Ya sizinki
Bekleme süreleri önemli authenticate olma sırasındaki beklemeleri kontrol ediniz.
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.
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.
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.
SPI pinlerinden 3.3v mu çıkış alıyorsunuz hocam siz?
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.
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ı
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;
}
(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 ?
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.
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
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 :)
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 ?
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)
(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.
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 ?
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)
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.
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.
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..
mesela protonda data.7 gibi bişe yapabiliyormusun?
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 ?
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.
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ış.
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.
Hocam kütüphane kaynak kodları incelenirse fayalı olur diye düşünüyorum.
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.
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)
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.
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.
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.
Hocam aynı kütüphaneyi (stm32f4-discovery.com) daha önceden denedim ve istanbul kartı okudum. Tabi sadece ID kısmını.
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.
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.
MFRC522 pinlerini pic e direkmi bağlıyorsunuz ? pic5volt modül 3.3 volt
Transistörler ile level shifter yapılmalı, veya direnç ile gerilim bölücü yapılabilir bazı pinlere.
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)
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 :)
@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();
}
}
}
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.
@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.:)
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ış.
Haliyle çalışan,denenmiş MFRC522 için PIC16F877 CCS C ile yazılmış kod varsa paylaşabilirmisiniz?
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?
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)
lütfen "stm32f103" için "MFRC522" kütüphanesi sizde var mı ?
lütfen yardimcı olunuz.
teşekkür ederim
bbk.bstn@gmail.com
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ü?
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.
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.
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?
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");
}
İ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?
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.
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 () ;
}
}
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.
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?
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
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.
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.
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 :)
@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.
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
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.
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);
@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ı?
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);
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?
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.
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.
@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.
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)
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.
@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 ?
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ı.
@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..
@ 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 (
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.
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?
Konu açık aslında 6 sayfa yorum var. Eğer sayfalardaki mesajların hepsini okuduysan takıldığın yeri sorabilirsin.
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?
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 :)
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...
'****************************************************************
'* 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
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.
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.
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?