CAN Bus (Controller Area Network), 1983 yılında Bosch tarafından otomotiv sektöründeki karmaşık kablo demetlerini azaltmak ve modüller arası güvenilir veri iletimi sağlamak amacıyla geliştirilmiş, 1986 yılında resmi olarak duyurulmuş mesaj tabanlı (message-based) bir haberleşme protokolüdür. Otomotiv (ECU'lar arası iletişim), havacılık, tıbbi cihazlar ve endüstriyel otomasyon sistemlerinde standart olarak kullanılır.

CAN Bus, elektriksel gürültülere karşı üstün koruma sağlamak için diferansiyel sinyalleşme tekniği kullanır. Veriyolu temel olarak iki adet sinyal hattı ve ortak bir referans (GND) hattından oluşur:

CAN veriyolunun karakteristiği 120 Ω empedansa sahiptir. Yüksek hızlı veri transferinde hatta oluşan sinyal yansımalarını (reflection) engellemek için bus hattının en başındaki ve en sonundaki iki uç noktaya 120 Ω paralel sonlandırma direnci bağlanmalıdır. (İki direnç paralel olduğu için veriyolunun boştaki eşdeğer direnci yaklaşık 60 Ω ölçülmelidir).
CAN protokolü Master/Slave mimarisi kullanmaz; bunun yerine veriyoluna bağlı tüm düğümler eşit haklara sahiptir (Multi-Master / Peer-to-Peer). Cihazlar hedef adrese değil, gönderilen mesajın içeriğini tanımlayan CAN ID (Identifier) değerine bakarak veriyi süzerler.
| Saha / Alan | Bit Sayısı | Açıklama |
|---|---|---|
| SOF (Start of Frame) | 1 Bit | Paket başlangıcını gösteren Dominant (0) biti. |
| Arbitration Field (CAN ID) | 11 Bit (Standard) / 29 Bit (Extended) | Mesajın öncelik seviyesini ve kimliğini belirleyen kimlik numarası. |
| RTR (Remote Transmission Request) | 1 Bit | Veri çerçevesi mi (0) yoksa başka düğümden veri isteme çerçevesi mi (1) olduğunu belirtir. |
| Control Field (DLC) | 6 Bit (4 Biti DLC) | Gönderilecek verinin uzunluğunu belirtir (0 - 8 Bayt arası). |
| Data Field | 0 - 64 Bit (0 - 8 Bayt) | Taşınan ham veri yükü (Payload). CAN FD standardında bu 64 bayta kadar çıkar. |
| CRC Field | 15 Bit + 1 Bit Delimiter | Hata denetimi ve veri doğrulaması için döngüsel aşırılık kontrolü. |
| ACK Field | 2 Bit (ACK + Delimiter) | Veriyi hatasız alan herhangi bir düğümün hattı Dominant (0) yaparak gönderdiği onay biti. |
| EOF (End of Frame) | 7 Bit | Paketin bittiğini gösteren 7 adet Recessive (1) biti. |
Dahili CAN denetleyicisi olmayan mikrokontrolcülerde sıklıkla MCP2515 (CAN Controller) ve TJA1050 / SN65HVD230 (CAN Transceiver) modülleri kullanılır. MCP2515 çipi mikrokontrolcü ile SPI üzerinden haberleşir.
#include <SPI.h>
#include <mcp_can.h>
const int SPI_CS_PIN = 5; // MCP2515 Chip Select Pini
MCP_CAN CAN0(SPI_CS_PIN); // CAN nesnesi oluştur
void setup() {
Serial.begin(115200);
// MCP2515 Başlat: 8MHz Kristal, 500kbps CAN Bus Hızı
if (CAN0.begin(MCP_ANY, CAN_500KBPS, MCP_8MHZ) == CAN_OK) {
Serial.println("MCP2515 Başarıyla Başlatıldı!");
} else {
Serial.println("MCP2515 Başlatılamadı...");
while (1);
}
// Modülü Normal Çalışma Moduna Al
CAN0.setMode(MCP_NORMAL);
}
void loop() {
// 1. CAN Bus Üzerinden Veri Gönderme Örneği (ID: 0x0123)
byte gonderilecekVeri[8] = {0x01, 0x02, 0x03, 0x04, 0xAA, 0xBB, 0xCC, 0xDD};
// sendMsgBuf(ID, Standard/Extended, DLC, Data)
byte sendStatus = CAN0.sendMsgBuf(0x0123, 0, 8, gonderilecekVeri);
if (sendStatus == CAN_OK) {
Serial.println("CAN Paket Gönderildi.");
} else {
Serial.println("Paket Gönderim Hatası!");
}
// 2. CAN Bus Üzerinden Veri Dinleme Örneği
long unsigned int rxId;
unsigned char len = 0;
unsigned char rxBuf[8];
if (CAN0.checkReceive() == CAN_MSGAVAIL) {
CAN0.readMsgBuf(&rxId, &len, rxBuf);
Serial.printf("\nYeni Mesaj Alındı! ID: 0x%03X - DLC: %d - Veri: ", rxId, len);
for (int i = 0; i < len; i++) {
Serial.printf("0x%02X ", rxBuf[i]);
}
Serial.println();
}
delay(1000);
}
| Özellik | CAN Bus | RS-485 | RS-422 |
|---|---|---|---|
| Katman Seviyesi | Fiziksel + Veri Bağı Katmanı (MAC) | Sadece Fiziksel Katman | Sadece Fiziksel Katman |
| Çakışma Önleme (Arbitration) | Donanımsal (Bitwise Arbitration) | Yok (Yazılımsal/Protokol seviyesinde) | Gerekmez (Tek Verici) |
| Hata Yönetimi (Error Handling) | Donanımsal CRC, Bit Stuffing, ACK | Yok (Modbus vb. yazılım yönetir) | Yok |
| Adresleme Mantığı | Mesaj Odaklı (CAN ID) | Cihaz Odaklı (Slave ID) | Noktadan Noktaya / Çoğullamalı |
| Maksimum Hız | 1 Mbit/s (CAN 2.0) / 8+ Mbit/s (CAN FD) | 10 - 35 Mbit/s | 10 Mbit/s |
| Maksimum Mesafe | 40 Metre (1 Mbps) - 1000 Metre (50 kbps) | 1200 Metre | 1200 Metre |
Henüz yorum yapılmamış. İlk yorumu siz yapın!