STM32 NUCLEO-G431RB Mikrodenetleyici ve RC522 RFID Okuyucu ile RFID Kartlarının Tanımlanması ve UID Bilgilerinin Okunması

       

 Merhaba ben Barış! Bu yazıda 2024 yılı Bahar dönemi stajımda yaptığım RFID kart kuyucu uygulamasından bahsedeceğim.

         Bu projede, STM32 mikrodenetleyicisi ve RC522 RFID okuyucu modülünü kullanarak RFID kartlarının algılanması ve UID (Benzersiz Kimlik Numarası) bilgilerinin okunmasını amaçlamaktayız. Aşağıda, RFID teknolojisinin ne olduğu, nasıl çalıştığı ve kullanılan bileşenlerin işlevleri hakkında ayrıntılı açıklamalar bulunmaktadır.

RFID Nedir?

RFID, “Radyo Frekansı ile Tanımlama” anlamına gelir ve RFID etiketlerine kodlanan dijital verilerin bir RFID okuyucu tarafından radyo dalgaları aracılığıyla tanımlanmasını ifade eder. RFID, etiketlerden gelen verilerin bir veri tabanında depolanarak izlenmesini sağlar. RFID’nin barkodlara göre en önemli avantajlarından biri, etiketlerin görüş hattının dışından da okunabilmesidir, bu da optik tarayıcıların hizalanma gereksinimini ortadan kaldırır.

RFID’nin Çalışma Prensibi

Her RFID sistemi üç ana bileşenden oluşur:

  1. Tarama Anteni

  2. Alıcı-Verici

  3. Aktarıcı (RFID Etiketi)

Tarama Anteni ve Alıcı-Verici

Tarama anteni ve alıcı-verici birlikte RFID okuyucu veya sorgulayıcı olarak adlandırılır. İki tür RFID okuyucu vardır:

  • Sabit Okuyucular: Kalıcı olarak bir yere monte edilir.

  • Mobil Okuyucular: Taşınabilir cihazlardır.

RFID okuyucu, etiketleri etkinleştiren sinyalleri iletmek için radyo dalgalarını kullanır. Etiket, bu sinyalleri alarak okuyucuya geri gönderir ve veriye dönüştürülür.

Aktarıcı (RFID Etiketi)

RFID etiketleri, okuma aralığı ve güç kaynağına bağlı olarak çeşitli türlerde olabilir. Etiket türü, okuyucu türü, RFID frekansı ve çevresel faktörler gibi etkenler okuma aralığını etkiler. Daha güçlü güç kaynağına sahip etiketlerin okuma aralığı da daha uzundur.

STM32 ve RC522 Kullanımı

Proje kapsamında STM32 mikrodenetleyicisi, RFID okuyucu olarak RC522 modülü ile entegre edilmiştir. Bu entegrasyon, RFID kartlarının tanımlanması ve UID bilgilerinin okunmasını sağlar. STM32 mikrodenetleyici, RC522 modülünden gelen sinyalleri işler ve UID bilgilerini alır.

 

RC522 RFID Okuyucu Modülü ve Özellikleri:

RC522 RFID modülü, NXP’nin MFRC522 IC’sine dayanmaktadır ve çevrimiçi olarak dört dolardan daha düşük bir fiyata satın alınabilir. Bu uygun fiyatlı RFID çözümü, genellikle bir RFID kart etiketi ve 1KB belleğe sahip bir anahtarlık etiketi ile birlikte gelir. Ayrıca, etiketlere veri yazma yeteneği sayesinde, kişisel bilgilerinizi veya gizli mesajlarınızı bu etiketlerde saklayabilirsiniz.

Özellikler ve Çalışma Prensibi

RC522 RFID Okuyucu modülü, ISO 14443A standart etiketleriyle iletişim kurmak için 13.56MHz frekansında bir elektromanyetik alan oluşturur. Modül, mikrokontrolör ile 10Mbps’ye kadar veri hızını destekleyen 4 pinli Seri Çevresel Arayüz (SPI) üzerinden iletişim kurar. Ayrıca, I2C ve UART protokolleri üzerinden de iletişimi destekler, bu da esnek kullanım seçenekleri sunar.

Kesme Pimi ve Çalışma Voltajı

Modül, bir kesme pimi ile birlikte gelir. Bu, modüle sürekli olarak “bir kart var mı?” diye sormak yerine, etiketin modül yakınına geldiğinde uyarı alınmasını sağlar, bu da sistemin etkinliğini artırır.

RC522 modülünün çalışma voltajı 2.5V ile 3.3V arasındadır. Bununla birlikte, mantık pinleri 5V toleranslıdır, bu da modülü herhangi bir mantık seviyesi dönüştürücü kullanmadan doğrudan 5V mantık seviyesindeki mikrodenetleyicilere bağlamayı mümkün kılar.

Uygulamalar ve Kullanım Alanları

Bu modül, düşük maliyeti ve esnekliği nedeniyle çeşitli RFID uygulamalarında kullanılabilir. Envanter yönetimi, erişim kontrolü ve otomatik tanımlama sistemleri gibi birçok alanda kullanılabilir. Etiket yazma yeteneği sayesinde, kullanıcılar modülü daha yaratıcı ve kişiselleştirilmiş projelerde de kullanabilirler.

RC522 RFID modülü, uygun fiyatı ve geniş özellik yelpazesiyle, RFID uygulamalarına başlamak isteyenler için ideal bir seçimdir. Kolay entegrasyonu ve esnek iletişim protokolleri ile birçok farklı projede kullanılabilir.

İşte tam özellikler:

Frekans aralığı 13,56 MHz ISM Bandı
Ana Bilgisayar Arayüzü SPI / I2C / UART
Çalışma Besleme Gerilimi 2,5 V ila 3,3 V
Maks. Çalışma Akımı 13-26mA
Min. Akım (Güç kapatma) 10μA
Lojik Girişler 5V Toleranslı
Okuma Aralığı 5 cm

DATASHEAT: 13.56 MHz RC522 RFID Okuyucu Datasheet

RC522 PİN OUT Tanım
VCC modüle güç sağlar. Bu, 2,5 ila 3,3 volt arasında herhangi bir yerde olabilir. 3.3V çıkışa bağlayabilirsiniz. 5V pinine bağlamanın muhtemelen modülünüzü tahrip edeceğini unutmayın!
RST Sıfırlama ve kapatma için bir giriş. Bu pin azaldığında, sert güç kapatma etkinleştirilir. Bu, osilatör dahil tüm dahili akım alıcılarını kapatır ve giriş pinlerinin dış dünyayla bağlantısı kesilir. Yükselen kenarda modül sıfırlanır.
GND Toprak Pimi ve Arduino’daki GND pinine bağlanması gerekiyor.
IRQ pin, SPI arayüzü etkinleştirildiğinde Master-In-Slave-Out görevi görür, I2C arayüzü etkinleştirildiğinde seri saat görevi görür ve UART arayüzü etkinleştirildiğinde seri veri çıkışı görevi görür.
MİSO RC522 modülüne SPI girişidir.
MOSI  RC522 modülüne SPI girişidir.
SCK SPI bus Master tarafından sağlanan saat darbelerini kabul eder.
SS pin, SPI arayüzü etkinleştirildiğinde Sinyal girişi görevi görür, I2C arayüzü etkinleştirildiğinde seri veri görevi görür ve UART arayüzü etkinleştirildiğinde seri veri girişi görevi görür. Bu pin genellikle pinin bir kare içine yerleştirilmesiyle işaretlenir, böylece diğer pinleri tanımlamak için referans olarak kullanılabilir.

 

STM32 Nucleo G431RB ile RFID-RC522 Bağlantısı:

RC522 STM32G431
Vcc 3V3
RST PA8 (D7)
GND GND
MOSI PA7 (D11)
MİSO PA6 (D12)
SCK PA5 (D13)
CS PA4 (A2)
IRQ Bağlı değil

 

 

 

KOD:

Uygulamada mfrc522.h ve mrfc522.c kütüphanleri kullandım öncelikle onların kodunu verdim sizlere. main.c dosyasınıda en sonda belirttim. 

mfrc522.h

Bu dosya, RFID-RC522 ile ilgili fonksiyonların prototiplerini ve bazı gerekli makro tanımlarını içerir.

#ifndef TM_MFRC522_H
#define TM_MFRC522_H 100

#include "stm32g4xx.h"

#ifndef MFRC522_SPI
#define MFRC522_SPI SPI1
#endif

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

#define PCD_IDLE 0x00
#define PCD_AUTHENT 0x0E
#define PCD_RECEIVE 0x08
#define PCD_TRANSMIT 0x04
#define PCD_TRANSCEIVE 0x0C
#define PCD_RESETPHASE 0x0F
#define PCD_CALCCRC 0x03

#define PICC_REQIDL 0x26
#define PICC_REQALL 0x52
#define PICC_ANTICOLL 0x93
#define PICC_SElECTTAG 0x93
#define PICC_AUTHENT1A 0x60
#define PICC_AUTHENT1B 0x61
#define PICC_READ 0x30
#define PICC_WRITE 0xA0
#define PICC_DECREMENT 0xC0
#define PICC_INCREMENT 0xC1
#define PICC_RESTORE 0xC2
#define PICC_TRANSFER 0xB0
#define PICC_HALT 0x50

#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

#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

#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

#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

#define MFRC522_DUMMY 0x00

#define MFRC522_MAX_LEN 16
#define MFRC522_CS_PORT GPIOA
#define MFRC522_CS_PIN GPIO_PIN_4

extern void TM_MFRC522_Init(void);
extern TM_MFRC522_Status_t TM_MFRC522_Check(uint8_t* id);
extern TM_MFRC522_Status_t TM_MFRC522_Compare(uint8_t* CardID, uint8_t* CompareID);
extern void TM_MFRC522_InitPins(void);
extern void TM_MFRC522_WriteRegister(uint8_t addr, uint8_t val);
extern uint8_t TM_MFRC522_ReadRegister(uint8_t addr);
extern void TM_MFRC522_SetBitMask(uint8_t reg, uint8_t mask);
extern void TM_MFRC522_ClearBitMask(uint8_t reg, uint8_t mask);
extern void TM_MFRC522_AntennaOn(void);
extern void TM_MFRC522_AntennaOff(void);
extern void TM_MFRC522_Reset(void);
extern TM_MFRC522_Status_t TM_MFRC522_Request(uint8_t reqMode, uint8_t* TagType);
extern TM_MFRC522_Status_t TM_MFRC522_ToCard(uint8_t command, uint8_t* sendData, uint8_t sendLen, uint8_t* backData, uint16_t* backLen);
extern TM_MFRC522_Status_t TM_MFRC522_Anticoll(uint8_t* serNum);
extern void TM_MFRC522_CalculateCRC(uint8_t* pIndata, uint8_t len, uint8_t* pOutData);
extern uint8_t TM_MFRC522_SelectTag(uint8_t* serNum);
extern TM_MFRC522_Status_t TM_MFRC522_Auth(uint8_t authMode, uint8_t BlockAddr, uint8_t* Sectorkey, uint8_t* serNum);
extern TM_MFRC522_Status_t TM_MFRC522_Read(uint8_t blockAddr, uint8_t* recvData);
extern TM_MFRC522_Status_t TM_MFRC522_Write(uint8_t blockAddr, uint8_t* writeData);
extern void TM_MFRC522_Halt(void);

#endif

Önemli Makro Tanımlamaları

  • MFRC522_REG_COMMAND
    • MFRC522’nin komut register’ını belirtir.
  • MFRC522_REG_COMM_IE_N
    • MFRC522’nin iletişim kesme etkinleştirme register’ını belirtir.

Fonksiyon Prototipleri

  • RC522_Init(SPI_HandleTypeDef hspi)*

    • MFRC522 modülünü başlatır ve gerekli ayarları yapar.
  • RC522_CheckCardPresent(void)

    • Bir kartın varlığını kontrol eder.
  • RC522_ReadCardSerial(uint8_t id, uint8_t idSize)**

    • Kartın seri numarasını okur ve id dizisine yazar.
    •  

mfrc522.c

Bu dosya, RFID-RC522 modülüne ait fonksiyonların tanımlarını içerir.

#include "mfrc522.h"

#define MFRC522_CS_RCC RCC_AHB1Periph_GPIOA
#define MFRC522_CS_PORT GPIOA
#define MFRC522_CS_PIN GPIO_Pin_4

void TM_MFRC522_Init(void) {
TM_MFRC522_InitPins();
TM_SPI_Init(MFRC522_SPI, MFRC522_SPI_PINSPACK);
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);
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();
}

TM_MFRC522_Status_t TM_MFRC522_Check(uint8_t* id) {
TM_MFRC522_Status_t status;
status = TM_MFRC522_Request(PICC_REQIDL, id);
if (status == MI_OK) {
status = TM_MFRC522_Anticoll(id);
}
TM_MFRC522_Halt();
return status;
}

void TM_MFRC522_InitPins(void) {
GPIO_InitTypeDef GPIO_InitStruct;
RCC_AHB1PeriphClockCmd(MFRC522_CS_RCC, ENABLE);
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStruct.GPIO_OType = GPIO_OType_PP;
GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_InitStruct.GPIO_Pin = MFRC522_CS_PIN;
GPIO_Init(MFRC522_CS_PORT, &GPIO_InitStruct);
MFRC522_CS_HIGH;
}

void TM_MFRC522_WriteRegister(uint8_t addr, uint8_t val) {
MFRC522_CS_LOW;
TM_SPI_Send(MFRC522_SPI, (addr << 1) & 0x7E);
TM_SPI_Send(MFRC522_SPI, val);
MFRC522_CS_HIGH;
}

uint8_t TM_MFRC522_ReadRegister(uint8_t addr) {
uint8_t val;
MFRC522_CS_LOW;
TM_SPI_Send(MFRC522_SPI, ((addr << 1) & 0x7E) | 0x80);
val = TM_SPI_Send(MFRC522_SPI, MFRC522_DUMMY);
MFRC522_CS_HIGH;
return val;
}

 

Fonksiyonların Detaylı Açıklamaları

  1. RC522_Init(SPI_HandleTypeDef hspi)*

    • Bu fonksiyon, MFRC522 modülünü başlatır ve gerekli ayarları yapar. SPI iletişimi için gerekli konfigürasyonlar yapılır.
  2. RC522_CheckCardPresent(void)

    • Bu fonksiyon, bir RFID kartının varlığını kontrol eder. Kart algılandığında MI_OK değeri döner.
  3. RC522_ReadCardSerial(uint8_t id, uint8_t idSize)**

    • Bu fonksiyon, kartın UID bilgisini okur. UID, id dizisine yazılır ve idSize değişkeni, UID’nin boyutunu belirtir.

SPI İletişimi

MFRC522 ve STM32 arasındaki iletişim, SPI protokolü üzerinden gerçekleştirilir. SPI, hızlı ve senkronize bir veri iletim protokolüdür ve genellikle mikrodenetleyici ile çevresel cihazlar arasında veri alışverişi için kullanılır.

Genel Çalışma Prensibi
  1. Başlatma ve Yapılandırma
    • STM32 mikrodenetleyicisi başlatılır ve sistem saatleri yapılandırılır.
    • GPIO ve SPI modülleri başlatılır ve gerekli pinler konfigüre edilir.
    • MFRC522 modülü başlatılır ve SPI iletişimi kurulur.
  2. Kart Tespiti
    • Ana döngüde (while döngüsü), sürekli olarak bir kartın varlığı kontrol edilir.
    • Bir kart tespit edildiğinde, UID okunur ve gerekli işlemler yapılır.
  3. UID Okuma
    • Kartın UID bilgisi, RC522_ReadCardSerial fonksiyonu kullanılarak okunur.
    • Okunan UID, güvenlik ve erişim kontrolü gibi uygulamalarda kullanılabilir.

main.c

main.c dosyası, sistemin başlangıç noktasıdır ve temel fonksiyonları içerir.

```c
#include "stm32g4xx_hal.h"
#include "mfrc522.h" // Bu kütüphane, RC522'nin işlevlerini sağlar

SPI_HandleTypeDef hspi1;

void SystemClock_Config(void);
static void MX_GPIO_Init(void);
static void MX_SPI1_Init(void);

int main(void) {
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_SPI1_Init();

RC522_Init(&hspi1); // RC522'yi başlat

while (1) {
if (RC522_CheckCardPresent() == MI_OK) { // Kart tespit edildi mi?
uint8_t uid[10];
uint8_t uidSize;
if (RC522_ReadCardSerial(uid, &uidSize) == MI_OK) { // Kartın seri numarasını oku
// UID okundu
}
}
HAL_Delay(500);
}
}

void SystemClock_Config(void) {
RCC_OscInitTypeDef RCC_OscInitStruct = {0};
RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
__HAL_RCC_PWR_CLK_ENABLE();
__HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;
RCC_OscInitStruct.HSIState = RCC_HSI_ON;
RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI;
RCC_OscInitStruct.PLL.PLLM = 8;
RCC_OscInitStruct.PLL.PLLN = 192;
RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV4;
RCC_OscInitStruct.PLL.PLLQ = 4;
if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) {
// Hata işleme
}
RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK|RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2;
RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_3) != HAL_OK) {
Error_Handler();
}
}

static void MX_SPI1_Init(void) {
hspi1.Instance = SPI1;
hspi1.Init.Mode = SPI_MODE_MASTER;
hspi1.Init.Direction = SPI_DIRECTION_2LINES;
hspi1.Init.DataSize = SPI_DATASIZE_8BIT;
hspi1.Init.CLKPolarity = SPI_POLARITY_LOW;
hspi1.Init.CLKPhase = SPI_PHASE_1EDGE;
hspi1.Init.NSS = SPI_NSS_SOFT;
hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_256;
hspi1.Init.FirstBit = SPI_FIRSTBIT_MSB;
hspi1.Init.TIMode = SPI_TIMODE_DISABLE;
hspi1.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;
hspi1.Init.CRCPolynomial = 10;
if (HAL_SPI_Init(&hspi1) != HAL_OK) {
Error_Handler();
}
}

static void MX_GPIO_Init(void) {
GPIO_InitTypeDef GPIO_InitStruct = {0};
__HAL_RCC_GPIOC_CLK_ENABLE();
__HAL_RCC_GPIOA_CLK_ENABLE();
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_7, GPIO_PIN_RESET);
GPIO_InitStruct.Pin = GPIO_PIN_7;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
}
```

“main.c” İçindeki Fonksiyonların Detaylı Açıklamaları
  1. HAL_Init()

    • Bu fonksiyon, HAL (Hardware Abstraction Layer) kütüphanesini başlatır. HAL, STM32 donanımının kontrolünü kolaylaştırmak için kullanılan bir soyutlama katmanıdır.
  2. SystemClock_Config()

    • Bu fonksiyon, sistem saatini yapılandırır. HSI (High-Speed Internal) osilatör kullanılarak PLL (Phase-Locked Loop) ayarları yapılır.
  3. MX_GPIO_Init()

    • GPIO pinlerini yapılandırır. Bu örnekte, GPIOC portunun 7. pini çıkış olarak ayarlanmıştır.
  4. MX_SPI1_Init()

    • SPI1 modülünü başlatır ve yapılandırır. SPI (Serial Peripheral Interface) protokolü, MFRC522 ile STM32 arasındaki iletişimi sağlar.
  5. RC522_Init(&hspi1)

    • MFRC522 modülünü başlatır ve SPI iletişimini yapılandırır.
  6. RC522_CheckCardPresent()

    • Bu fonksiyon, bir kartın varlığını kontrol eder. Eğer bir kart tespit edilirse, MI_OK değeri döner.
  7. RC522_ReadCardSerial(uid, &uidSize)

    • Kartın seri numarasını (UID) okur ve uid dizisine yazar. uidSize değişkeni, UID’nin boyutunu belirtir.

 

 

Sonuç

Bu yazıda, STM32 mikrodenetleyicisi ve RFID-RC522 RFID modülünü kullanarak bir RFID okuyucu sistemi nasıl tasarlayabileceğimizi ve uygulayabileceğimizi detaylandırdık. Bu sistem, RFID teknolojisinin temel prensiplerini anlamak ve çeşitli uygulamalarda kullanmak için sağlam bir temel oluşturur. STM32 ve RFID-RC522 kombinasyonu, düşük maliyetli ve esnek bir çözüm sunarak, kullanıcıların RFID tabanlı projeler geliştirmesine olanak tanır. Bu tür projeler, güvenlik sistemleri, envanter yönetimi ve otomasyon gibi birçok alanda geniş uygulama alanı bulabilir.