STM32F401 (Black Pill) ve ENC28J60 Ethernet Modülü

👤 Yazar: ozcan 📅 Tarih: 26.08.2026 16:59 👁️ Görüntüleme: 11

STM32F401 (Black Pill) ve ENC28J60 Ethernet Bağlantı Rehberi

STM32F401CCU6 (Black Pill) mikrodenetleyicisi, üzerinde yer alan donanımsal SPI1 çevre birimini kullanarak ENC28J60 Ethernet modülü üzerinden kablolu ağ (10Base-T) iletişimi gerçekleştirebilir. Bu mimaride STM32F401 ana işlemci (Master), ENC28J60 ise SPI hattı üzerindeki bağımlı birim (Slave) olarak görev yapar.

STM32F401 ve ENC28J60 Bağlantı Şeması


1. Donanım Pin Eşleşme Tablosu

Görseldeki devre şemasına göre STM32F401 (Black Pill) kartı ile ENC28J60 modülü arasındaki pin bağlantıları aşağıdaki gibidir:

ENC28J60 Pin STM32F401 Pin Sinyal / İşlev Açıklama / Kablo Rengi
VCC 3.3V (3V3) 3.3V Güç Beslemesi Yeşil Kablo
GND GND (G) Ortak Toprak Hattı Mavi/Turkuaz Kablo
CS PA4 SPI1 Chip Select (NSS) Pembe Kablo
SCK PA5 SPI1 Serial Clock Kahverengi Kablo
SO (MISO) PA6 SPI1 Master In Slave Out Mor Kablo
SI (MOSI) PA7 SPI1 Master Out Slave In Açık Pembe Kablo
Donanım ve SPI Frekans Notu:
ENC28J60 modülü maksimum 20 MHz SPI saat frekansını destekler. STM32F401 84 MHz sistem saatinde çalışırken SPI1 ön bölücüsünün (Prescaler) SPI_BAUDRATEPRESCALER_8 veya SPI_BAUDRATEPRESCALER_16 olarak ayarlanması sinyal kararlılığı açısından önerilir.

2. STM32CubeIDE / HAL C Kod Örneği (SPI1 & GPIO Başlatma)

Şemadaki pin haritasına uygun olarak STM32 HAL kütüphanesi ile SPI1 arabiriminin ve CS pininin yapılandırılması:

C / STM32 HAL SPI1 & ENC28J60 CS Init

#include "stm32f4xx_hal.h"

// Şemadaki Pin Tanımlamaları (PA4 - PA7)
#define ENC28J60_CS_PORT    GPIOA
#define ENC28J60_CS_PIN     GPIO_PIN_4

SPI_HandleTypeDef hspi1;

// CS Pini Kontrol Makroları
#define ENC28J60_CS_LOW()   HAL_GPIO_WritePin(ENC28J60_CS_PORT, ENC28J60_CS_PIN, GPIO_PIN_RESET)
#define ENC28J60_CS_HIGH()  HAL_GPIO_WritePin(ENC28J60_CS_PORT, ENC28J60_CS_PIN, GPIO_PIN_SET)

void MX_GPIO_Init(void) {
  GPIO_InitTypeDef GPIO_InitStruct = {0};

  /* GPIO Ports Clock Enable */
  __HAL_RCC_GPIOA_CLK_ENABLE();

  /* PA4 Chip Select Pin Yapılandırması */
  HAL_GPIO_WritePin(ENC28J60_CS_PORT, ENC28J60_CS_PIN, GPIO_PIN_SET);
  GPIO_InitStruct.Pin = ENC28J60_CS_PIN;
  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  GPIO_InitStruct.Pull = GPIO_NOPULL;
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
  HAL_GPIO_Init(ENC28J60_CS_PORT, &GPIO_InitStruct);
}

void MX_SPI1_Init(void) {
  /* SPI1 Clock Enable */
  __HAL_RCC_SPI1_CLK_ENABLE();

  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;   // CPOL = 0
  hspi1.Init.CLKPhase = SPI_PHASE_1EDGE;        // CPHA = 0 (Mode 0)
  hspi1.Init.NSS = SPI_NSS_SOFT;
  hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_8; // 84 MHz / 8 = ~10.5 MHz
  hspi1.Init.FirstBit = SPI_FIRSTBIT_MSB;
  hspi1.Init.TIMode = SPI_TIMODE_DISABLE;
  hspi1.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;
  
  if (HAL_SPI_Init(&hspi1) != HAL_OK) {
    // Başlatma Hatası
    Error_Handler();
  }
}

// Low-Level Düşük Seviye SPI Okuma/Yazma Fonksiyonu
uint8_t ENC28J60_SPI_ReadWrite(uint8_t data) {
  uint8_t rx_data = 0;
  HAL_SPI_TransmitReceive(&hspi1, &data, &rx_data, 1, HAL_MAX_DELAY);
  return rx_data;
}

3. STM32duino / Arduino IDE Kod Örneği

STM32F401 kartını Arduino çekirdeği (STM32duino) ile programlarken EthernetENC veya UIPEthernet kütüphanesi kullanılarak yazılan web sunucu örneği:

C++ / STM32F401 Arduino IDE ENC28J60 Example

#include <SPI.h>
#include <EthernetENC.h>

// Şemadaki Pin Tanımları
#define ETH_CS_PIN PA4

byte mac[] = { 0x00, 0x80, 0xE1, 0x00, 0x00, 0x01 };
EthernetServer server(80);

void setup() {
  Serial.begin(115200);
  
  // SPI1 Pinleri PA5 (SCK), PA6 (MISO), PA7 (MOSI) varsayılan olarak seçilir
  Ethernet.init(ETH_CS_PIN);

  Serial.println("STM32F401 ENC28J60 Ağ Bağlantısı Başlatılıyor...");

  if (Ethernet.begin(mac) == 0) {
    Serial.println("DHCP Üzerinden IP Alınamadı!");
    while (1);
  }

  server.begin();
  Serial.print("Ethernet Bağlantısı Başarılı! STM32 IP: ");
  Serial.println(Ethernet.localIP());
}

void loop() {
  EthernetClient client = server.available();
  if (client) {
    boolean currentLineIsBlank = true;
    while (client.connected()) {
      if (client.available()) {
        char c = client.read();
        if (c == '\n' && currentLineIsBlank) {
          client.println("HTTP/1.1 200 OK");
          client.println("Content-Type: text/html");
          client.println("Connection: close");
          client.println();
          
          client.println("<!DOCTYPE HTML><html><body style='font-family:sans-serif;'>");
          client.println("<h2>STM32F401CCU6 (Black Pill) Ethernet Server</h2>");
          client.println("<p>SPI1 Arayüzü (PA4-PA7) üzerinden ENC28J60 Bağlantısı Aktif!</p>");
          client.println("</body></html>");
          break;
        }
        if (c == '\n') {
          currentLineIsBlank = true;
        } else if (c != '\r') {
          currentLineIsBlank = false;
        }
      }
    }
    delay(1);
    client.stop();
  }
}

💬 Yorumlar

Henüz yorum yapılmamış. İlk yorumu siz yapın!

Bir Yorum Bırakın

Güvenlik Kontrolü:

Yenidir.com
↑ Sayfa Başı
📞 İletişim ✉ E-Posta Gönder 🟥 YouTube
© 2026 Yenidir.com
Yenidir CMS V0.1