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.

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 |
SPI_BAUDRATEPRESCALER_8 veya SPI_BAUDRATEPRESCALER_16 olarak ayarlanması sinyal kararlılığı açısından önerilir.
Şemadaki pin haritasına uygun olarak STM32 HAL kütüphanesi ile SPI1 arabiriminin ve CS pininin yapılandırılması:
#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;
}
STM32F401 kartını Arduino çekirdeği (STM32duino) ile programlarken EthernetENC veya UIPEthernet kütüphanesi kullanılarak yazılan web sunucu örneği:
#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();
}
}
Henüz yorum yapılmamış. İlk yorumu siz yapın!