Seri Protokoller
TEKNİK REHBER SERİ PROTOKOLLER CAN XL 2026

CAN XL
ISO 11898-1:2024 — Extra Large

20 Mbit/s, 2048 byte payload, VCID ile sanal ağlar — CAN ailesi en büyük sıçramasını CAN XL ile yapıyor. Linux 6.2+ desteği ve uygulama detayları.

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

ÖzellikCAN CC (Klasik)CAN FDCAN XL
Maks. bitrate1 Mbit/s8 Mbit/s20 Mbit/s
Maks. payload8 byte64 byte2048 byte
ID uzunluğu11/29 bit11/29 bit11 bit
Sanal ağlarHayırHayırEvet (VCID)
SDU type alanıHayırHayırEvet
IP tünellemeHayırZorDoğal destek
StandartISO 11898-1ISO 11898-7ISO 11898-1:2024

Kullanım alanları

Zonal architectureModern araçlarda ECU'lar bölgesel zone controller'lara bağlanır. CAN XL, zone içi yüksek bant genişliği talebini karşılar; ayrıca IP paket taşıyarak Ethernet ile entegrasyon kolaylaşır.
OTA güncellemeleri2048 byte payload ile büyük firmware güncellemeleri mevcut CAN kablo altyapısı korunarak aktarılabilir. Yeni kablo döşeme maliyeti ortadan kalkar.
Kamera ve sensör verisiOtonom sürüş için gerekli yüksek frekanslı sensör verisi, mevcut CAN topolojisi üzerinden aktarılabilir hale gelir.
Backbone iletişimiAraç içi backbone ağ olarak 100Base-T1 Ethernet'e alternatif. Mevcut CAN kablolama altyapısını korur, yatırımı maksimize eder.
NOT

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)
    
PRIO — Öncelik11-bit arbitration ID. CAN XL yalnızca 11-bit ID kullanır (29-bit EFF yoktur). Arbitration mekanizması Classical CAN ile aynı prensipte çalışır.
VCID — Virtual CAN ID8-bit sanal ağ tanımlayıcısı. Aynı fiziksel bus üzerinde 256 farklı sanal ağ tanımlanabilir. Ethernet VLAN konseptinin CAN'a uyarlanmış halidir.
SDU_TYPE8-bit servis veri birimi türü. Taşınan payload'ın üst katman protokolünü belirtir: IPv4, IPv6, CAN CC, CAN FD tüneli veya uygulama tanımlı tipler.
DLC11-bit veri uzunluk kodu — 0 ile 2048 arası değer alır. CAN FD'deki DLC tablosu gerekliliği ortadan kalkmıştır; doğrudan byte sayısı belirtilir.
SEC — Special Error CheckCAN XL'e özel hata kontrol biti. Yüksek veri hızında ek güvenilirlik sağlamak için tasarlanmıştır.
CRC3232-bit CRC, büyük payload için güvenilir hata tespiti sağlar. CAN FD'nin 17/21-bit CRC'sine kıyasla çok daha güçlü.

CAN FD frame'den farklar

ÖzellikCAN FDCAN XL
Başlatma bitiEDL=1 ile tanınırXLFL=1 ile tanınır
EFF (29-bit ID)DesteklenirDesteklenmez, sadece 11-bit
Payload max64 byte2048 byte
CRC17-bit (≤16 byte), 21-bit (>16)32-bit sabit
Sanal ağYokVCID (8-bit)
Protokol multiplexingUygulama 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ı

ParametreDeğerNot
Maks. bus uzunluğu (20 Mbit/s)~10 mArbitration delay kısıtı
Maks. bus uzunluğu (10 Mbit/s)~20 mDaha uzun bus için düşük bitrate
Node sayısıTeorik 2048Kablo kapasitansına bağlı
Terminasyon2 × 100ΩCAN XL yeni empedans: 100Ω
Kablo tipiBükümlü çift120–130Ω karakteristik empedans
Infineon TLE9255Wİlk ticari CAN XL transceiver'larından biri. CAN CC, CAN FD ve CAN XL modlarını destekler. 3.3V/5V uyumlu.
NXP TJA1153NXP'nin CAN XL transceiver'ı. CAN XL yanı sıra CAN FD ve Classical CAN backward uyumluluğu. Otomotiv AEC-Q100.
DİKKAT

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ı

include/uapi/linux/can.h (Linux 6.2+)
/* 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

canxl_send.c
#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

bash — kernel ve vcan kontrolü
# 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_TYPEProtokolAçıklama
0x00CAN CC tüneliClassical CAN frame'ini XL içinde taşır
0x01CAN FD tüneliCAN FD frame'ini XL içinde taşır
0x02Uygulama verisiGenel uygulama tanımlı veri
0x03IEEE 802.3 (Ethernet)Ethernet frame taşıma
0x04IPv4IP paket doğrudan taşıma
0x05IPv6IPv6 paket taşıma
0x06–0xFERezerv/özelStandart veya üretici tanımlı
0xFFTest/debugGeliş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_example.c
/* 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.10Temel CAN FD stabil, XL tartışmaları başladı
Linux 6.1CAN XL hazırlık patch'leri, vcan genişlemesi
Linux 6.2canxl_frame struct, CAN_RAW_XL_FRAMES socket seçeneği eklendi
Linux 6.6CAN 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

canxl_full_example.c
#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

bash — candump CAN XL
# 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 TipiCAN CC nodeCAN FD nodeCAN XL node
Saf CAN CC busÇalışırCAN CC frame gönderebilirDesteklemez
Mixed CAN CC+FD busÇalışır (FD frame = error)Her ikisini gönderirDesteklemez
CAN XL busDesteklemezDesteklemezTam destek
Gateway üzerindenTüm kombinasyonlarTüm kombinasyonlarGateway 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

Aşama 1: EnvanterMevcut araç mimarisindeki tüm CAN node'larını, bitrate'leri ve kablo uzunluklarını belgeleyin. CAN XL'e geçişin getireceği kablo değişikliği maliyetini hesaplayın.
Aşama 2: Gateway yerleştirmeZone controller'lar veya merkezi gateway ECU'lar, CAN XL backbone ile mevcut CAN CC/FD alt ağlarını köprüler. Bu aşamada eski donanım değiştirilmez.
Aşama 3: Node güncellemeYeni ECU'lar tasarlanırken doğrudan CAN XL transceiver (TJA1153, TLE9255W) entegre edilir. Eski node'lar ömürleri dolana kadar gateway üzerinden çalışmaya devam eder.

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

bash — vcan kurulumu
# 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

bash — cangen 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

bash — Wireshark ile CAN XL capture
# 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)
    
ip_over_canxl.py — konsept örneği
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

Özellik100Base-T1CAN XL (20 Mbit/s)
Bant genişliği100 Mbit/s20 Mbit/s
KabloÖzel Ethernet kablosuMevcut CAN kablo
Node sayısıPoint-to-point (switch gerekli)Multi-drop bus
DeterminizmTSN ileYerleşik arbitration
GüvenilirlikOrta (switch bağımlı)Yüksek (bus yapısı)
MaliyetYüksek (switch + kablo)Düşük (mevcut kablo)
SONUÇ

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.