00 CAN XL nedir: hedefler ve CAN FD'den farklar
CAN XL (Extra Large), CAN FD'nin 64 byte ve 8 Mbit/s sınırlarını aşmak için tasarlandı. ISO 11898-1:2024 kapsamında standardize edilen bu protokol, otomotiv Ethernet alternatifi olmayı hedefliyor.
CAN FD'nin sınırları ve CAN XL hedefleri
| Özellik | CAN CC (Klasik) | CAN FD | CAN XL |
|---|---|---|---|
| Maks. bitrate | 1 Mbit/s | 8 Mbit/s | 20 Mbit/s |
| Maks. payload | 8 byte | 64 byte | 2048 byte |
| ID uzunluğu | 11/29 bit | 11/29 bit | 11 bit |
| Sanal ağlar | Hayır | Hayır | Evet (VCID) |
| SDU type alanı | Hayır | Hayır | Evet |
| IP tünelleme | Hayır | Zor | Doğal destek |
| Standart | ISO 11898-1 | ISO 11898-7 | ISO 11898-1:2024 |
Kullanım alanları
CAN XL, Automotive Ethernet'in yerini almayı değil, araç içi ağ hiyerarşisinde CAN FD ile Ethernet arasındaki boşluğu doldurmayı hedefler. Gigabit gerektiren uygulamalar için hala Ethernet tercih edilir.
01 Frame formatı: SFF/XFF, VCID, SDU_TYPE
CAN XL yeni bir frame formatı tanımlar. XFF (CAN XL Frame Format) ile 2048 byte payload ve yeni kontrol alanları sunar; backward uyumluluk için klasik SFF/EFF tanımaya devam eder.
CAN XL frame yapısı
CAN XL Frame (XFF):
┌────┬────────┬──────┬────────┬──────────┬──────┬──────┬──────────┬──────┐
│SOF │ PRIO │ VCID │SDU_TYPE│ DLC │ SEC │ Data │ CRC32 │ ACK │
│ │ 11-bit │ 8bit │ 8bit │ 11bit │ │0-2048│ │ │
└────┴────────┴──────┴────────┴──────────┴──────┴──────┴──────────┴──────┘
Arbitration phase (Nominal bitrate) │ Data phase (XL bitrate)
CAN FD frame'den farklar
| Özellik | CAN FD | CAN XL |
|---|---|---|
| Başlatma biti | EDL=1 ile tanınır | XLFL=1 ile tanınır |
| EFF (29-bit ID) | Desteklenir | Desteklenmez, sadece 11-bit |
| Payload max | 64 byte | 2048 byte |
| CRC | 17-bit (≤16 byte), 21-bit (>16) | 32-bit sabit |
| Sanal ağ | Yok | VCID (8-bit) |
| Protokol multiplexing | Uygulama tanımlı | SDU_TYPE (8-bit) |
02 PHY katmanı: yeni transceiver teknolojisi
CAN XL, 20 Mbit/s data bitrate elde edebilmek için yeni bir PHY sinyal kodlaması kullanır. Classical CAN ve CAN FD transceiver'ları CAN XL ile uyumlu değildir.
Yeni dominant/recessive seviyeleri
CAN XL, veri fazında farklı sinyal seviyeleri kullanır. Bu durum yeni transceiver tasarımı gerektirir:
Arbitration fazı (CAN XL — klasik ile uyumlu):
Dominant: CAN_H ≈ 3.5V, CAN_L ≈ 1.5V, Vdiff ≈ +2.0V
Recessive: CAN_H ≈ 2.5V, CAN_L ≈ 2.5V, Vdiff ≈ 0.0V
Veri fazı (CAN XL PHY — yeni):
Logic 1: CAN_H ≈ 3.2V, CAN_L ≈ 1.8V, Vdiff ≈ +1.4V
Logic 0: CAN_H ≈ 1.8V, CAN_L ≈ 3.2V, Vdiff ≈ -1.4V
(aktif diferansiyel sürüş, her iki polaritede)
Topoloji kısıtları
| Parametre | Değer | Not |
|---|---|---|
| Maks. bus uzunluğu (20 Mbit/s) | ~10 m | Arbitration delay kısıtı |
| Maks. bus uzunluğu (10 Mbit/s) | ~20 m | Daha uzun bus için düşük bitrate |
| Node sayısı | Teorik 2048 | Kablo kapasitansına bağlı |
| Terminasyon | 2 × 100Ω | CAN XL yeni empedans: 100Ω |
| Kablo tipi | Bükümlü çift | 120–130Ω karakteristik empedans |
CAN XL veri fazında farklı sinyal seviyeleri kullandığından, mevcut CAN CC veya CAN FD node'ları CAN XL veri fazındaki sinyalleri tanıyamaz ve hata üretir. Mixed bus (karma CAN CC/FD/XL) senaryolarında gateway kullanımı zorunludur.
03 Linux desteği: Kernel 6.2+ CAN XL API
CAN XL desteği Linux 6.2 kernel'ine dahil edildi. Yeni canxl_frame struct ve CANXL_MTU sabiti ile CAN XL frame'leri gönderilip alınabilir.
canxl_frame yapısı
/* CAN XL frame — Linux 6.2+ */
struct canxl_frame {
canid_t prio; /* 11-bit öncelik (CAN_XL_PRIO_MASK = 0x7FF) */
__u8 flags; /* CANXL_SEC ve diğer flag'lar */
__u8 sdt; /* SDU Type (servis veri birimi türü) */
__u16 len; /* payload uzunluğu: 1-2048 */
__u32 af; /* Acceptance Field (VCID + ek bilgi) */
__u8 data[CANXL_MAX_DLEN]; /* CANXL_MAX_DLEN = 2048 */
};
/* Sabitleri */
#define CANXL_MAX_DLEN 2048
#define CANXL_MTU (sizeof(struct canxl_frame))
/* CANXL_MTU = sizeof(canxl_frame) = 4+1+1+2+4+2048 = 2060 byte */
/* prio alanındaki XL tanımlama flag'ı */
#define CAN_XL_PRIO_MASK 0x000007FFU
#define CANXL_XLF 0x80000000U /* XL Frame flag — prio içinde */
/* flags bitleri */
#define CANXL_SEC 0x01 /* Special Error Check */
Socket kurulumu ve CAN XL gönderme
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <net/if.h>
#include <sys/socket.h>
#include <sys/ioctl.h>
#include <linux/can.h>
#include <linux/can/raw.h>
int main(void) {
int s = socket(PF_CAN, SOCK_RAW, CAN_RAW);
struct ifreq ifr;
strcpy(ifr.ifr_name, "vcan0");
ioctl(s, SIOCGIFINDEX, &ifr);
struct sockaddr_can addr = {
.can_family = AF_CAN,
.can_ifindex = ifr.ifr_ifindex,
};
bind(s, (struct sockaddr *)&addr, sizeof(addr));
/* CAN XL frame desteğini etkinleştir */
int enable_xl = 1;
setsockopt(s, SOL_CAN_RAW, CAN_RAW_XL_FRAMES,
&enable_xl, sizeof(enable_xl));
/* CAN XL frame hazırla */
struct canxl_frame xframe;
memset(&xframe, 0, sizeof(xframe));
xframe.prio = 0x042 | CANXL_XLF; /* öncelik=0x042, XL flag set */
xframe.sdt = 0x01; /* SDU type (uygulama tanımlı) */
xframe.len = 128; /* 128 byte payload */
xframe.af = 0x00010000; /* VCID=1 (üst 8 bit) */
for (int i = 0; i < 128; i++)
xframe.data[i] = (uint8_t)i;
ssize_t nbytes = write(s, &xframe, CANXL_MTU);
if (nbytes != CANXL_MTU) {
perror("write canxl");
return 1;
}
printf("CAN XL frame gönderildi: PRIO=0x%03X SDT=0x%02X LEN=%d\n",
xframe.prio & CAN_XL_PRIO_MASK, xframe.sdt, xframe.len);
close(s);
return 0;
}
Kernel sürüm gereksinimleri
# Kernel sürümünü kontrol et (6.2+ gerekli)
uname -r
# 6.6.31-1-rpi (Raspberry Pi için örnek)
# CAN XL header varlığını kontrol et
grep -r "CANXL_MTU" /usr/include/linux/can.h
# Yoksa güncel kernel-headers paketi yükle
sudo apt install linux-headers-$(uname -r)
# vcan modülü yükle (simülasyon için)
sudo modprobe vcan
sudo ip link add type vcan
sudo ip link set vcan0 mtu 2072 # CANXL_MTU + headroom
sudo ip link set vcan0 up
04 SDU type ve üst katmanlar
SDU_TYPE alanı, CAN XL'in en güçlü özelliklerinden biridir. 256 farklı protokol türü tanımlanabilir; bu sayede tek bir fiziksel bus üzerinde birden fazla üst katman protokolü çalışabilir.
Tanımlı SDU type değerleri
| SDU_TYPE | Protokol | Açıklama |
|---|---|---|
| 0x00 | CAN CC tüneli | Classical CAN frame'ini XL içinde taşır |
| 0x01 | CAN FD tüneli | CAN FD frame'ini XL içinde taşır |
| 0x02 | Uygulama verisi | Genel uygulama tanımlı veri |
| 0x03 | IEEE 802.3 (Ethernet) | Ethernet frame taşıma |
| 0x04 | IPv4 | IP paket doğrudan taşıma |
| 0x05 | IPv6 | IPv6 paket taşıma |
| 0x06–0xFE | Rezerv/özel | Standart veya üretici tanımlı |
| 0xFF | Test/debug | Geliştirme amaçlı |
VCID ile sanal ağlar
VCID (Virtual CAN ID), 8-bit değeri ile tek fiziksel bus üzerinde 256 sanal ağ (VLAN benzeri) tanımlar. Her VCID bağımsız trafik ayrımı sağlar.
/* VCID — af alanının üst 8 biti */
#define VCID_POWERTRAIN 0x01
#define VCID_CHASSIS 0x02
#define VCID_INFOTAINMENT 0x03
static inline void set_vcid(struct canxl_frame *f, uint8_t vcid) {
f->af = (f->af & 0x00FFFFFF) | ((uint32_t)vcid << 24);
}
static inline uint8_t get_vcid(const struct canxl_frame *f) {
return (uint8_t)(f->af >> 24);
}
/* Kullanım: powertrain verisi gönder */
xframe.prio = 0x100 | CANXL_XLF;
xframe.sdt = 0x02; /* uygulama verisi */
set_vcid(&xframe, VCID_POWERTRAIN);
xframe.len = 64;
05 Geliştirme durumu ve kernel API
CAN XL Linux entegrasyonu aktif gelişim aşamasındadır. Kernel 6.2 ile temel destek geldi; sonraki sürümlerde API ve araç desteği genişledi.
Kernel patch geçmişi
| Kernel Sürümü | CAN XL gelişmesi |
|---|---|
| Linux 5.10 | Temel CAN FD stabil, XL tartışmaları başladı |
| Linux 6.1 | CAN XL hazırlık patch'leri, vcan genişlemesi |
| Linux 6.2 | canxl_frame struct, CAN_RAW_XL_FRAMES socket seçeneği eklendi |
| Linux 6.6 | CAN XL vcan stabilitesi, candump CAN XL görüntüleme |
| Linux 6.8+ | CAN XL araç desteği genişlemesi devam ediyor |
canxl_frame C struct tam örneği
#include <linux/can.h>
#include <linux/can/raw.h>
#include <string.h>
void prepare_canxl_frame(struct canxl_frame *xf,
uint16_t prio, uint8_t vcid,
uint8_t sdt, const void *payload,
uint16_t payload_len)
{
memset(xf, 0, sizeof(*xf));
xf->prio = (prio & CAN_XL_PRIO_MASK) | CANXL_XLF;
xf->sdt = sdt;
xf->len = payload_len;
xf->af = (uint32_t)vcid << 24; /* VCID üst 8 bit */
if (payload_len > 0 && payload_len <= CANXL_MAX_DLEN)
memcpy(xf->data, payload, payload_len);
}
/* socket seçeneği */
int enable_xl = 1;
setsockopt(s, SOL_CAN_RAW, CAN_RAW_XL_FRAMES,
&enable_xl, sizeof(enable_xl));
/* Gönderme — CANXL_MTU = 2060 byte */
struct canxl_frame xf;
prepare_canxl_frame(&xf, 0x042, 0x01, 0x04,
ip_packet, ip_packet_len);
write(s, &xf, CANXL_MTU);
can-utils ile CAN XL desteği
# can-utils güncel sürümde CAN XL frame gösterimi
# CAN XL çıktı formatı:
# (timestamp) vcan0 042#XL#01#01#00010000#0001020304...
# prio XL sdt af(vcid) data
candump vcan0
# cansend ile CAN XL (can-utils 2022.02.0+)
# Syntax: ID#XL#SDT#FLAGS#AF#DATA
cansend vcan0 042#XL#01#00#00010000#0102030405060708
06 CAN CC → CAN FD → CAN XL migration
Her nesil CAN protokolü backward uyumluluğu sınırlı şekilde sunar. Mixed bus senaryoları dikkatli planlama gerektirir.
Backward uyumluluk tablosu
| Bus Tipi | CAN CC node | CAN FD node | CAN XL node |
|---|---|---|---|
| Saf CAN CC bus | Çalışır | CAN CC frame gönderebilir | Desteklemez |
| Mixed CAN CC+FD bus | Çalışır (FD frame = error) | Her ikisini gönderir | Desteklemez |
| CAN XL bus | Desteklemez | Desteklemez | Tam destek |
| Gateway üzerinden | Tüm kombinasyonlar | Tüm kombinasyonlar | Gateway gerekir |
Gateway ihtiyacı
CAN XL'in yeni PHY seviyesi nedeniyle, mevcut CAN CC veya CAN FD bus'ları ile doğrudan entegrasyon mümkün değildir. Köprüleme için gateway (ağ geçidi) ECU kullanılır:
CAN CC Bus ───┐
├── Gateway ECU ── CAN XL Bus
CAN FD Bus ───┘ (protokol
dönüşüm)
Migration stratejisi
07 Test ve simülasyon
CAN XL donanımı henüz yaygın değildir. Linux vcan driver'ı ile yazılım simülasyonu, geliştirme ve test için pratik bir başlangıç noktası sunar.
vcan ile CAN XL simülasyonu
# vcan kernel modülü yükle
sudo modprobe vcan
# CAN XL destekli vcan arayüzü oluştur
# MTU 2072 = CANXL_MTU(2060) + headroom
sudo ip link add dev vcan0 type vcan
sudo ip link set vcan0 mtu 2072
sudo ip link set vcan0 up
# İkinci vcan (iki node simülasyonu)
sudo ip link add dev vcan1 type vcan
sudo ip link set vcan1 mtu 2072
sudo ip link set vcan1 up
# Arayüz durumu
ip link show vcan0
cangen ile yük testi
# Rastgele CAN frame üret (saniyede 1000 frame)
cangen vcan0 -g 1 -i -e
# Sabit ID ve veri boyutuyla test
cangen vcan0 -g 5 -I 0x100 -L 8
# Paralel terminalde izle
candump vcan0
pcap-ng ile CAN XL yakalama
# tcpdump ile pcap kaydı
tcpdump -i vcan0 -w /tmp/canxl_capture.pcap
# Wireshark — CAN XL dissector (3.6+)
wireshark -i vcan0 -k
# candump log formatına kaydet ve sonra analiz
candump -l vcan0
# candump-YYYY-MM-DD_HHMMSS.log dosyası oluşturulur
08 Pratik: CAN XL ile IP paket taşıma
CAN XL'in en dikkat çekici özelliği SDU_TYPE=0x04 ile IPv4 paketlerini doğrudan taşıyabilmesidir. Bu bölümde vcan üzerinde IP over CAN XL konsept örneği inceleniyor.
IP over CAN XL konsepti
Standart bir IPv4 paketi maksimum 1500 byte (MTU) boyutundadır. CAN XL'in 2048 byte payload'ı bu paketi tek frame'de taşıyabilir. Fragmantasyon gerekmez.
Uygulama (UDP/TCP)
↓
IPv4 datagram (≤1500 byte)
↓ SDU_TYPE=0x04
CAN XL frame (payload = IPv4 paketi)
↓
CAN XL bus (fiziksel veya vcan)
import socket, struct, ctypes
# Linux canxl_frame struct (Python ctypes ile)
class CanxlFrame(ctypes.Structure):
_fields_ = [
('prio', ctypes.c_uint32), # 11-bit öncelik + CANXL_XLF
('flags', ctypes.c_uint8),
('sdt', ctypes.c_uint8),
('len', ctypes.c_uint16),
('af', ctypes.c_uint32),
('data', ctypes.c_uint8 * 2048),
]
CANXL_XLF = 0x80000000
SDU_TYPE_IPV4 = 0x04
CANXL_MTU = ctypes.sizeof(CanxlFrame) # 2060
def send_ip_over_canxl(can_sock, ip_packet: bytes, vcid: int = 0x01):
assert len(ip_packet) <= 2048, "IP paketi 2048 byte'ı aşamaz"
frame = CanxlFrame()
frame.prio = 0x010 | CANXL_XLF # öncelik = 0x010
frame.sdt = SDU_TYPE_IPV4
frame.len = len(ip_packet)
frame.af = vcid << 24 # VCID üst 8 bit
ctypes.memmove(frame.data, ip_packet, len(ip_packet))
sent = can_sock.send(bytes(frame)[:CANXL_MTU])
print(ff"Gönderildi: {sent} byte (IP payload {len(ip_packet)} byte)")
# Socket oluştur
s = socket.socket(socket.AF_CAN, socket.SOCK_RAW, socket.CAN_RAW)
# CAN XL etkinleştir
CAN_RAW_XL_FRAMES = 7 # Linux 6.2+
s.setsockopt(socket.SOL_CAN_RAW, CAN_RAW_XL_FRAMES, 1)
s.bind(('vcan0',))
# Örnek IP paketi (sahte, gerçek IP header değil)
fake_ip_pkt = b'\x45\x00' + b'\x00' * 18 + b'\xDE\xAD\xBE\xEF' * 10
send_ip_over_canxl(s, fake_ip_pkt, vcid=0x01)
s.close()
Otomotiv zonal architecture bağlamı
┌─────────────────────────────────────────────────────┐
│ Merkezi Compute Platform │
│ (Automotive Ethernet 1000Base-T1) │
└────────────────────┬────────────────────────────────┘
│
┌────────────┼────────────┐
↓ ↓ ↓
Zone A GW Zone B GW Zone C GW
(CAN XL) (CAN XL) (CAN XL)
│ │ │
CAN CC/FD CAN CC/FD CAN FD
node'lar node'lar node'lar
Automotive Ethernet ile karşılaştırma
| Özellik | 100Base-T1 | CAN XL (20 Mbit/s) |
|---|---|---|
| Bant genişliği | 100 Mbit/s | 20 Mbit/s |
| Kablo | Özel Ethernet kablosu | Mevcut CAN kablo |
| Node sayısı | Point-to-point (switch gerekli) | Multi-drop bus |
| Determinizm | TSN ile | Yerleşik arbitration |
| Güvenilirlik | Orta (switch bağımlı) | Yüksek (bus yapısı) |
| Maliyet | Yüksek (switch + kablo) | Düşük (mevcut kablo) |
CAN XL, mevcut araç CAN altyapısını 20 Mbit/s ve 2048 byte kapasitesine taşımanın ekonomik yolunu sunar. 2026 itibarıyla donanım ekosistemi olgunlaşmakta; Linux kernel desteği ise aktif gelişim sürmektedir. Yeni projeler için kernel 6.6+ ve can-utils 2023+ kullanmanız önerilir.