Seri Protokoller
TEKNİK REHBER SERİ PROTOKOLLER SPACEWIRE 2026

SpaceWire
uzay araçları veri ağı.

Mars Express'ten James Webb Uzay Teleskobu'na, BepiColombo'dan Euclid'e — ESA/NASA uzay araçlarının on-board veri omurgası. DS-LVDS, 400 Mbps, RMAP, deterministik yönlendirme.

00 SpaceWire nedir?

SpaceWire (ECSS-E-ST-50-12C), Avrupa Uzay Ajansı (ESA) tarafından 2003'te standardize edilen yüksek hızlı uzay araçları veri ağı standardıdır. NASA, JAXA ve diğer uzay ajansları tarafından da benimsenmiştir.

SpaceWire, NASA'nın IEEE 1355 DS-LVDS standardı ile ESA'nın uzay uygulamaları gereksinimlerini birleştirerek tasarlanmıştır. Temel tasarım hedefleri şunlardır: düşük güç tüketimi, yüksek veri hızı, uzay ortamının radyasyon ve sıcaklık aşırılıklarına dayanım ve standart bir ağ katmanı ile yeniden kullanılabilir avionik mimarisi.

Uzay aracıAjansKullanımSpaceWire hızı
Mars ExpressESAHRSC kamera verisi, payload kontrolü10–100 Mbps
RosettaESAOSIRIS kamera, COSIMA mass spectr.10–100 Mbps
BepiColomboESA/JAXASIXS X-ray, ISA ivme ölçer100 Mbps
James Webb Uzay TeleskobuNASA/ESA/CSANIRCam, MIRI, NIRSpec payload verisi40–200 Mbps
EuclidESAVIS ve NISP araç veri yönetim üniteleri200 Mbps
Solar OrbiterESA/NASAEUI solar görüntüleyici payload100 Mbps
JUICE (Jupiter)ESAJMAG manyetometre, UVS tayfölçer200 Mbps
JAMES WEBB NOT

James Webb Uzay Teleskobu (JWST), SpaceWire ağını dört bilim aleti (NIRCam, NIRSpec, MIRI, FGS/NIRISS) ile Komuta ve Veri İşleme Birimi (C&DH) arasındaki veri aktarımı için kullanır. NIRCam'ın 40 Mpixel görüntülerini 1,5 milyon km uzaktaki L2 yörüngesinden Dünya'ya indirmeden önce, SpaceWire ağı veriyi sıkıştırma ve kalibrasyon işlemcilerine aktarır. Uzayda yazılım güncellemesi ve komuta, RMAP protokolü üzerinden gerçekleştirilir.

01 Fiziksel katman (DS-LVDS)

SpaceWire, Differential Signaling — Low Voltage Differential Signaling (DS-LVDS) tabanlı bir fiziksel katman kullanır. Her SpaceWire bağlantısı iki çift diferansiyel hattan oluşur: veri (D) ve strobes (S).

Hat yapısı

  Bir SpaceWire bağlantısı (link) — unidirectional çift:

  Node A                              Node B
  ──────────────────────────────────────────────
  TX_DATA+  ──────────────────────→  RX_DATA+
  TX_DATA-  ──────────────────────→  RX_DATA-
  TX_STROBE+ ─────────────────────→  RX_STROBE+
  TX_STROBE- ─────────────────────→  RX_STROBE-

  RX_DATA+  ←──────────────────────  TX_DATA+
  RX_DATA-  ←──────────────────────  TX_DATA-
  RX_STROBE+ ←─────────────────────  TX_STROBE+
  RX_STROBE- ←─────────────────────  TX_STROBE-

  Tam çift yönlü (full-duplex): 4 diferansiyel çift = 8 iletken
    

DS-LVDS bit kodlaması

SpaceWire, Data-Strobe (DS) encoding kullanır. Strobe sinyali, data ve strobe XOR'ının her bit geçişinde değişmesiyle elde edilen gömülü bir saattir. Bu, alıcının saat kaynağına ihtiyaç duymadan veriden saati geri kazanmasını sağlar.

  DS Encoding:
    DATA   :  0  1  1  0  1  0  0  1
    STROBE :  0  0  1  1  1  0  0  0   (Data XOR önceki Strobe'a göre)
    DATA XOR STROBE: her bit geçişinde değişir = gömülü saat

  Alici: CLK = DATA XOR STROBE (her geçiş 1 bit sınırı)
    
ParametreDeğerAçıklama
Sinyal standardıDS-LVDS (IEEE 1355)±125 mV swing, diferansiyel
Hız aralığı2 Mbps – 400 MbpsAuto-negotiation ile ayarlanır
Tipik uzay hızı100–200 MbpsBepiColombo, JWST, Euclid
Kablo tipiShielded twisted pair (özel uzay kablosu)MIL-C-27500 veya ESA spec
Konnektör9-pin Micro-D (MDM-9)MIL-DTL-83513 konnektör standardı
Maks. kablo uzunluğu10 m (yer segment) / 1–2 m (uzay)Uzayda ısıl genleşme ve radyasyon
Güç tüketimi~50 mW/link (100 Mbps)Uzay uygulamaları için düşük güç

Konnektör ve kablo standartları

9-pin Micro-D (MDM-9)Tüm SpaceWire uygulamalarının standart konnektörü. Her konnektör: D+, D-, S+, S-, 2 × power, 2 × GND, shield. Amphenol, Glenair ve ITT Cannon ürün aileleri ESA uyumludur.
Uzay kablosuUzay araçlarında PEEK veya Kapton kılıflı, radyasyon dirençli kablo kullanılır. Gövde içi SpaceWire kablolarında toplam uzunluk genellikle 1–3 m ile sınırlıdır — bu hem radyasyon zayıflamasını hem de ısıl kontraksiyonu minimize eder.

02 Protokol katmanları

SpaceWire, ECSS-E-ST-50-12C standardında dört katmanlı bir model tanımlar: sinyal, karakter, paket ve ağ katmanı. Her katman belirli işlevleri kapsüller.

ECSS katman modeli

  ┌────────────────────────────────────────────────┐
  │  Ağ Katmanı (Network Layer)                    │
  │  Yönlendirme: Logical Address / Path Address   │
  ├────────────────────────────────────────────────┤
  │  Paket Katmanı (Packet Layer)                  │
  │  Başlık, veri, EOP/EEP                        │
  ├────────────────────────────────────────────────┤
  │  Karakter Katmanı (Character Layer)            │
  │  Data char, NULL, Time code, FCT               │
  ├────────────────────────────────────────────────┤
  │  Sinyal Katmanı (Signal Layer)                 │
  │  DS-LVDS, Manchester II, link init             │
  └────────────────────────────────────────────────┘
    

Karakter türleri

KarakterKodAçıklama
DATA0XXXXXXX (10 bit: parity+X+8 data)Normal 8-bit veri baytı
EOP00x (end of packet, normal)Paket normal sonu
EEP01x (end of packet, error)Paket hata ile sonlandı
FCTFlow Control Token — 001Alıcının 8 byte daha alabileceğini bildirir (flow control)
NULLLink idle karakteriLink başlatma ve hizalamasında kullanılır
ESCEscape prefixTime code ve link komutu öneki
Time CodeESC + 0XXXXXXX6-bit time code + 2-bit kontrol flag — saat senkronizasyonu

Paket yapısı

  Logical Address routing paketi:
  ┌──────────────┬────────────┬──────────────────────┬─────┐
  │ Dest. Addr.  │ Dest. Key  │   Payload (data)     │ EOP │
  │  (1–n byte)  │  (1 byte)  │   (0–16 MB)          │     │
  └──────────────┴────────────┴──────────────────────┴─────┘

  Path Address routing:
  ┌──────────┬──────────┬──────────┬────────────────┬─────┐
  │ Port 1   │ Port 2   │ Port 3   │   Payload      │ EOP │
  │ (1 byte) │ (1 byte) │ (1 byte) │                │     │
  └──────────┴──────────┴──────────┴────────────────┴─────┘
  Yönlendirici her adım'da bir prefix byte'ı soyar.
    

Flow control — Credit-based

SpaceWire, donanım akış kontrolü için kredi tabanlı (credit-based) FCT mekanizması kullanır. Alıcı, gönderene "8 byte daha gönderebilirsin" şeklinde FCT karakterleri gönderir. Bu, donanım seviyesinde veri kaybını önler — uzay araçlarında yazılım katmanı müdahalesi olmadan.

03 RMAP — Remote Memory Access Protocol

RMAP (Remote Memory Access Protocol), SpaceWire ağı üzerinde uzak düğümlerin belleğine okuma/yazma yapılmasını sağlayan bir uygulama katmanı protokolüdür. Uzay araçlarında komuta ve veri alma temel mekanizmasıdır.

RMAP temel kavramlar

InitiatorRMAP komutunu gönderen taraf. Genellikle On-Board Computer (OBC) veya Data Management Unit (DMU). Okuma/yazma komutunu oluşturur ve hedef adresini belirtir.
TargetRMAP komutunu alan ve çalıştıran taraf. Genellikle bir payload (kamera, spektrometre vb.) veya alt sistem kontrolcüsü. Komuta yanıt olarak Reply paket gönderir.
Transaction ID16-bit değer — her işleme özgü tanımlayıcı. Initiator, birden fazla bekleyen işlemi Transaction ID ile eşleştirir. JWST'de aynı anda onlarca bekleyen RMAP işlemi olabilir.
KeyTarget'a erişim için güvenlik anahtarı. Target, gelen komuttaki key'i kendi kayıtlı değeriyle karşılaştırır. Eşleşmezse komut reddedilir — yetkisiz bellek erişimini önler.

RMAP paket yapısı — Write Command

  RMAP Write Command (Verified, Reply, Increment):
  ┌──────────┬───────┬───────────────┬────────┬──────────────┐
  │ Dest.    │ Proto │  Instruction  │  Key   │ Reply Addr.  │
  │ Address  │ (0x01)│    Byte       │ (1 byte│ (0–12 bytes) │
  └──────────┴───────┴───────────────┴────────┴──────────────┘
  ┌────────────┬─────────────┬────────────┬─────────────────┐
  │ Initiator  │ Transaction │ Extended   │ Memory Address  │
  │ Logical    │     ID      │  Address   │   (4 bytes)     │
  │ Address    │  (2 bytes)  │  (1 byte)  │                 │
  └────────────┴─────────────┴────────────┴─────────────────┘
  ┌────────────┬─────────────────────────────────────────────┐
  │ Data Length│             Data                            │
  │ (3 bytes)  │           + Header CRC                      │
  └────────────┴─────────────────────────────────────────────┘
  Data bytes ... Data CRC ... EOP
    

Instruction Byte

BitAlanDeğer / Açıklama
7–6Packet Type01 = Command, 00 = Reply
5Write/Read1 = Write, 0 = Read
4Verify Data Before Write1 = CRC'yi verify et, sonra yaz
3Acknowledge1 = Reply paketi gönder
2Increment Address1 = Her byte'ta adresi artır, 0 = FIFO modu
1–0Reply Address Length0–3: reply adresi için ayrılan byte sayısı

RMAP hata kodları

StatusAnlamı
0x00Successfully executed
0x01General error code
0x02Unused RMAP packet type
0x03Invalid key
0x04Invalid Data CRC
0x05Early EOP
0x06Too much data
0x07EEP
0x09Verify buffer overrun
0x0ARMAP command not implemented
0x0BRMW data length error
0x0CInvalid target logical address
python — RMAP Write komutu oluşturma
import struct

def rmap_crc8(data: bytes) -> int:
    """RMAP CRC-8 (CCITT polynomial 0x07)"""
    crc = 0
    for byte in data:
        for _ in range(8):
            xor_val = (crc ^ byte) & 0x80
            crc = (crc << 1) & 0xFF
            if xor_val:
                crc ^= 0x07
            byte = (byte << 1) & 0xFF
    return crc

def rmap_write_cmd(target_logical_addr: int,
                    initiator_logical_addr: int,
                    key: int,
                    transaction_id: int,
                    mem_addr: int,
                    data: bytes) -> bytes:
    """
    RMAP Write Command paketi oluştur (Verified, Reply, Increment).
    Donus: SpaceWire payload olarak gönderilecek bytes
    """
    # Instruction byte: 0x6C = Write | Verify | Reply | Increment
    instruction = 0b01101100

    header = bytearray()
    header += bytes([target_logical_addr])  # Dest. logical addr
    header += bytes([0x01])               # Protocol ID (RMAP=1)
    header += bytes([instruction])
    header += bytes([key])
    header += bytes([initiator_logical_addr])  # Reply addr (1 byte)
    header += struct.pack(">H", transaction_id)  # Tx ID (2 bytes)
    header += bytes([0x00])               # Extended addr
    header += struct.pack(">I", mem_addr)[0:4]  # Memory addr (4 bytes)
    header += struct.pack(">I", len(data))[1:4]  # Data length (3 bytes)

    header_crc = rmap_crc8(bytes(header))
    header += bytes([header_crc])

    data_crc = rmap_crc8(data)
    packet = bytes(header) + data + bytes([data_crc])
    return packet

# Örnek: OBC (addr=0xFE) target instrument'a (addr=0x20) yaz
payload_data = bytes([0x01, 0x02, 0x03, 0x04])
pkt = rmap_write_cmd(
    target_logical_addr=0x20,
    initiator_logical_addr=0xFE,
    key=0xD1,
    transaction_id=42,
    mem_addr=0x40001000,
    data=payload_data
)
print(f"RMAP Write pkt ({len(pkt)} bytes): {pkt.hex()}")

04 Router ve topoloji

SpaceWire router'lar, birden fazla link'i birbirine bağlayan ağ cihazlarıdır. Routing table bazlı logical address yönlendirmesi veya path address soyma (wormhole routing) mekanizmalarını destekler.

Topoloji seçenekleri

  Yıldız (Star) topoloji:           Daisy Chain:
       [Router]                  [Node A]─[Router]─[Node B]─[Router]─[Node C]
      /    |    \
  [N1]  [N2]  [N3]               Mesh:
                                 [N1]─[R1]─[N2]
                                   \   |   /
                                    [R2]─[R3]
    

SpaceWire Router — Cobham RTAX FPGA

Cobham (eski adıyla Aeroflex) RTAX series FPGA'lar, radyasyon sertleştirilmiş SpaceWire router implementasyonu için standart bir seçimdir. ESA'nın GR712RC işlemcisi de yerleşik SpaceWire router içerir.

RouterPort sayısıMaks. hızKullanım
Cobham UT8RSPW-10 router10200 Mbps/portESA BepiColombo, Solar Orbiter
Aeroflex UT200RSPWRTR32400 Mbps/portBüyük uydu veri sistemleri
GR712RC (GRLIB yazılım router)6 (dahili)200 MbpsEntegre OBC+router
STAR-Dundee STAR-System on Chip32400 MbpsYer segment simülatörleri

Routing table yapılandırması

c — GR712RC router konfigürasyonu (GRLIB)
/* GRLIB SpaceWire router konfigurasyonu */
#include "grspwrouter.h"

void configure_router(void) {
    spwrouter_dev_t *router = grspwrouter_open(0);

    /* Logical address routing table:
       Addr 0x20 -> Port 1 (Kamera)
       Addr 0x21 -> Port 2 (Spektrometre)
       Addr 0xFE -> Port 0 (OBC)              */
    spwrouter_set_route(router, 0x20, 1);  /* camera port */
    spwrouter_set_route(router, 0x21, 2);  /* spectro port */
    spwrouter_set_route(router, 0xFE, 0);  /* OBC port */

    /* Port hız ayarı: 100 Mbps */
    for (int i = 0; i < 6; i++) {
        spwrouter_set_link_speed(router, i, 100000000);
    }

    /* Time code yayinlama: port 0'dan gelen time code
       tüm aktif portlara ilet */
    spwrouter_timecode_enable(router, 0x3F);  /* tüm portlar */

    printf("SpaceWire router yapılandırıldı.\n");
}

Logical Address vs. Path Address

Logical Address (önerilen)Her düğüme 0x00–0xFF arası benzersiz bir adres atanır. Router, kendi tablosuna göre paketi doğru porta yönlendirir. Adres alanı sınırlı (254 düğüm) ancak basit ve esnek. James Webb ve Euclid bu yöntemi kullanır.
Path Address (wormhole)Paketin başında tam rota port numaraları listesi bulunur. Router, ilk byte'ı okuyup ilgili porta yönlendirir ve byte'ı siler (wormhole routing). Büyük ağlarda esneklik sağlar ancak daha fazla başlık verisi gerektirir.

05 Linux SpaceWire sürücüleri

Linux altında SpaceWire donanımı GRSPW (Gaisler Research SpaceWire) çekirdeği veya USB/PCI köprüleri üzerinden erişilebilir.

GRSPW Linux sürücüsü (Cobham/Gaisler GRLIB)

bash — GRSPW sürücü yükleme
# GRLIB Linux sürücü paketi (Cobham tarafından sağlanır):
tar -xzf grlib-linux-driver-v3.x.tar.gz
cd grlib-linux-driver/
make KERNEL_DIR=/lib/modules/$(uname -r)/build
sudo make install

# Modülleri yükle:
sudo modprobe grspw
sudo modprobe grspwrouter

# SpaceWire cihazlarını kontrol et:
dmesg | grep spw
# [ 2.14] grspw 0: SpaceWire link, ports: 4, DMA channels: 4
# [ 2.15] grspwrouter 0: SpaceWire router, 6 ports

# Cihaz dosyaları:
ls /dev/spw*
# /dev/spw0  /dev/spw1  /dev/spw2  /dev/spw3
c — /dev/spw0 ile paket gönderme/alma
#include <fcntl.h>
#include <unistd.h>
#include <sys/ioctl.h>
#include "grspw.h"   /* GRLIB sürücü başlığı */

int main(void) {
    int fd = open("/dev/spw0", O_RDWR);
    if (fd < 0) { perror("open"); return -1; }

    /* Link hızını ayarla: 100 Mbps */
    spw_ioctl_speed_t speed = { .speed = 100000000 };
    ioctl(fd, GRSPW_IOCTL_SET_SPEED, &speed);

    /* Link'i başlat */
    ioctl(fd, GRSPW_IOCTL_LINK_START, NULL);

    /* Paket gönder: Logical Address=0x20, data */
    uint8_t pkt[] = { 0x20, 0xDE, 0xAD, 0xBE, 0xEF };
    ssize_t n = write(fd, pkt, sizeof(pkt));
    printf("Gönderildi: %zd byte\n", n);

    /* Paket al (blocking): */
    uint8_t rxbuf[1024];
    ssize_t rcv = read(fd, rxbuf, sizeof(rxbuf));
    printf("Alındı: %zd byte, ilk byte: 0x%02X\n", rcv, rxbuf[0]);

    close(fd);
    return 0;
}

STAR-Dundee USB SpaceWire Brick

STAR-Dundee'nin USB SpaceWire Brick arayüzü, bir Linux PC'yi SpaceWire ağına bağlamak için yaygın kullanılan bir yer segment aracıdır. Açık kaynak STAR-USB sürücüsü ile çalışır.

bash — STAR-Dundee USB sürücüsü
# STAR-Dundee açık kaynak Linux sürücüsü:
git clone https://github.com/star-dundee/star-dundee-linux
cd star-dundee-linux/
make && sudo make install

# USB Brick'i bağla ve tespit et:
dmesg | grep -i star
# [ 10.5] usb 1-1.3: STAR-Dundee SpaceWire USB Brick detected

# Cihaz dosyası:
ls /dev/star*
# /dev/starspw0

# RMAP araçları (gr-rmap Python kütüphanesi):
pip install gr-rmap

gr-rmap ile RMAP işlemleri

python — gr-rmap kütüphanesi kullanımı
from grrmap import RMAPInitiator, RMAPTarget

# SpaceWire link aç (/dev/starspw0 veya /dev/spw0)
initiator = RMAPInitiator(device="/dev/starspw0",
                           logical_addr=0xFE,
                           link_speed=100e6)
initiator.start_link()

# Target: Kamera kontrolcüsü, addr=0x20, key=0xD1
target = RMAPTarget(logical_addr=0x20, key=0xD1)

# Memory read: 16 byte, adres 0x40000000
data = initiator.read(target, mem_addr=0x40000000,
                       length=16, timeout_ms=1000)
print(f"Okunan veri: {data.hex()}")

# Memory write: kamera başlatma komutu
cmd_bytes = bytes([0x01, 0x00, 0x00, 0x01])
result = initiator.write(target, mem_addr=0x40001000,
                          data=cmd_bytes, verify=True, reply=True)
print(f"Yazma sonucu: 0x{result.status:02X}")
if result.status == 0x00:
    print("Başarılı!")
else:
    print(f"Hata: {result.status_str}")

initiator.close()

06 FPGA implementasyonu

SpaceWire, özellikle radyasyon sertleştirilmiş uzay FPGA'larına uygulanır. Açık kaynak IP çekirdeği alternatifleri ve ticari radyasyon-sertleştirilmiş FPGA seçenekleri mevcuttur.

opencores.org SpaceWire IP Core

bash — opencores SpaceWire IP kurulumu
# SpaceWire VHDL IP core (opencores.org):
git clone https://github.com/nicowillis/spw_fpga.git
# Temel dosyalar:
# spw_link.vhd         - Link katmanı FSM
# spw_recv.vhd         - Alici DS-LVDS demodülatör
# spw_send.vhd         - Verici DS-LVDS modülatör
# spw_fifo.vhd         - TX/RX FIFO tamponları
# spw_routerport.vhd   - Router port mantığı
vhdl — SpaceWire top-level entity örneği
-- SpaceWire fiziksel arayuz: 4 diferansiyel hat
entity spw_top is
  port (
    clk         : in  std_logic;
    rst         : in  std_logic;
    -- SpaceWire fiziksel pinler
    spw_di_p    : in  std_logic;   -- Data In +
    spw_di_n    : in  std_logic;   -- Data In -
    spw_si_p    : in  std_logic;   -- Strobe In +
    spw_si_n    : in  std_logic;   -- Strobe In -
    spw_do_p    : out std_logic;   -- Data Out +
    spw_do_n    : out std_logic;   -- Data Out -
    spw_so_p    : out std_logic;   -- Strobe Out +
    spw_so_n    : out std_logic;   -- Strobe Out -
    -- Kullanici arayuzu (AXI4-Stream)
    tx_data     : in  std_logic_vector(7 downto 0);
    tx_valid    : in  std_logic;
    tx_ready    : out std_logic;
    tx_eop      : in  std_logic;   -- End of Packet
    rx_data     : out std_logic_vector(7 downto 0);
    rx_valid    : out std_logic;
    rx_ready    : in  std_logic;
    rx_eop      : out std_logic;
    -- Status
    link_running : out std_logic
  );
end entity spw_top;

Radyasyon sertleştirilmiş FPGA seçenekleri

FPGAÜreticiTeknolojiTID (krad)SEL immuneKullanım
RTG4 RT4G150Microchip (Microsemi)Flash tabanlı>300EvetESA Euclid, JUICE
RTAX-SMicrochip (Microsemi)Anti-fuse>300EvetMars Express, Rosetta
Xilinx QPRO VirtexAMD (Xilinx)SRAM (QML)>300KısmiNASA uygulamaları
NanoXplore NG-UltraNanoXploreRHBD CMOS>300EvetYeni ESA misyonları

RTEMS RTOS ile SpaceWire

RTEMS (Real-Time Executive for Multiprocessor Systems), ESA'nın uzay araçlarında standart RTOS'u olarak benimsenmiştir. GRLIB BSP ile GRSPW sürücüsü doğrudan RTEMS altında kullanılır.

c — RTEMS üzerinde SpaceWire task
/* RTEMS GRSPW kullanimi */
#include <rtems.h>
#include "grspw.h"

void spw_task(rtems_task_argument arg) {
    void *spw_dev = grspw_open(0);
    if (!spw_dev) { rtems_task_delete(RTEMS_SELF); }

    grspw_set_speed(spw_dev, 100000000);
    grspw_link_start(spw_dev);

    while (1) {
        /* Paket al (50 ms zaman asimi) */
        uint8_t buf[512];
        int n = grspw_recv(spw_dev, buf, sizeof(buf),
                            50 * GRSPW_TICKS_PER_MS);
        if (n > 0) {
            process_packet(buf, n);
        }
    }
}
ECSS-Q-ST-80 NOTU

Uzay yazılımı ECSS-Q-ST-80 standardına (Software Product Assurance) göre geliştirilir. Bu standart, gereksinim izlenebilirliği, kod incelemesi, statik analiz (MISRA-C, Polyspace), test kapsamı ve konfigürasyon yönetimini kapsar. RTEMS üzerinde çalışan SpaceWire sürücü kodu bu süreçten geçer ve genellikle DAL-B eşdeğeri seviyede sertifikalandırılır.

07 Test ve analiz araçları

SpaceWire test ekipmanı hem yer segment testleri hem de entegrasyon doğrulaması için kritik öneme sahiptir.

STAR-Dundee SpaceWire Analyser

bash — STAR-Dundee analiz araçları
# STAR-Dundee Python API ile link analizi:
pip install star-dundee-api

# Link istatistiklerini oku:
python3 - <<'EOF'
import star_dundee as sd

brick = sd.open_brick(0)  # USB Brick
brick.set_link_speed(1, 100e6)  # Port 1, 100 Mbps
brick.link_start(1)

stats = brick.get_link_stats(1)
print(f"Packets TX: {stats.tx_count}")
print(f"Packets RX: {stats.rx_count}")
print(f"Error count: {stats.error_count}")
print(f"Disconnect count: {stats.disconnect_count}")
EOF
python — SpaceWire loopback testi
import star_dundee as sd
import time

def loopback_test(brick, port: int = 1,
                   n_packets: int = 1000) -> dict:
    """SpaceWire loopback testi: n_packets gönder ve al"""
    errors = 0
    latencies = []

    for i in range(n_packets):
        payload = bytes([i & 0xFF] * 64)  # 64-byte test paketi
        t0 = time.perf_counter()
        brick.send_packet(port, payload + b'\x00')  # EOP
        rcv = brick.recv_packet(port, timeout_ms=100)
        t1 = time.perf_counter()

        if rcv is None or rcv != payload:
            errors += 1
        else:
            latencies.append((t1 - t0) * 1e6)  # µs

    avg_lat = sum(latencies) / len(latencies) if latencies else float('inf')
    return {
        "total"   : n_packets,
        "errors"  : errors,
        "ber"     : errors / n_packets,
        "avg_lat_us": avg_lat,
        "min_lat_us": min(latencies, default=0),
        "max_lat_us": max(latencies, default=0),
    }

brick = sd.open_brick(0)
brick.set_loopback_mode(1, enable=True)  # dahili loopback
result = loopback_test(brick, n_packets=10000)
print(f"BER: {result['ber']:.2e}  Avg latency: {result['avg_lat_us']:.1f} µs")

Python spacewire-tools

bash — spacewire-tools kurulumu
pip install spacewire-tools

# SpaceWire link analizi komut satırı:
spw-link-test --device /dev/starspw0 --speed 100M --loopback \
              --packets 10000 --size 256

# RMAP bellek dökümü:
spw-rmap-dump --device /dev/starspw0 --target 0x20 --key 0xD1 \
              --addr 0x40000000 --length 256 --output memory.bin

08 Pratik: GR712RC üzerinde payload arayüzü

Cobham GR712RC çift çekirdekli LEON3 SoC, 6 SpaceWire port ve RMAP desteğiyle ESA'nın standart On-Board Computer (OBC) işlemcisidir. Bu bölümde bir uydu payload entegrasyon senaryosu incelenmektedir.

GR712RC SpaceWire mimarisi

  GR712RC SoC:
  ┌─────────────────────────────────────────────────────────┐
  │  LEON3 Core 0  │  LEON3 Core 1  │  AMBA AHB/APB Bus   │
  ├─────────────────┼────────────────┼─────────────────────┤
  │  GRSPW Port 0  │  GRSPW Port 1  │  GRSPW Port 2       │
  │  GRSPW Port 3  │  GRSPW Port 4  │  GRSPW Port 5       │
  ├─────────────────┴────────────────┴─────────────────────┤
  │  SpaceWire Router (6 port)                              │
  │  Time code distribution                                 │
  └─────────────────────────────────────────────────────────┘
    
c — GR712RC uydu OBSW SpaceWire senaryosu
/*
 * Örnek uydu On-Board Software (OBSW) — SpaceWire payload arayüzü
 * Platform: GR712RC, RTEMS 5.x
 *
 * Topoloji:
 *   Port 0: Yer istasyonu uplink (telekomanda) / downlink (telemetri)
 *   Port 1: Kamera payload (RMAP okuma)
 *   Port 2: Spektrometre payload (RMAP okuma/yazma)
 *   Port 3-5: Rezerv
 */

#include <rtems.h>
#include "grspw.h"
#include "rmap.h"
#include "pus.h"       /* ESA Packet Utilisation Standard */

#define SPW_PORT_GS      0   /* Yer istasyonu */
#define SPW_PORT_CAM     1   /* Kamera */
#define SPW_PORT_SPECT   2   /* Spektrometre */

#define ADDR_OBC         0xFE
#define ADDR_CAMERA      0x20
#define ADDR_SPECTRO     0x21

#define CAM_CTRL_REG     0x40001000   /* Kamera kontrol register */
#define CAM_DATA_REG     0x40002000   /* Kamera veri tamponu */

static void *spw_port[3];
static rmap_ctx_t rmap;

void obsw_spw_init(void) {
    int i;
    for (i = 0; i < 3; i++) {
        spw_port[i] = grspw_open(i);
        grspw_set_speed(spw_port[i], 100000000); /* 100 Mbps */
        grspw_set_addr(spw_port[i], ADDR_OBC);
        grspw_link_start(spw_port[i]);
        rtems_task_wake_after(100);             /* link init bekle */
    }
    rmap_init(&rmap, spw_port[SPW_PORT_CAM], ADDR_OBC);
    printf("OBSW SpaceWire başlatıldı.\n");
}

/* Kamera başlatma: RMAP write ile kontrol register'ı set et */
rtems_status_code obsw_camera_init(void) {
    uint32_t ctrl_val = 0x00000001;  /* ENABLE bit */
    rmap_status_t st  = rmap_write(&rmap,
                                    ADDR_CAMERA, 0xD1,   /* key */
                                    CAM_CTRL_REG,
                                    (uint8_t *)&ctrl_val, 4,
                                    500);               /* 500 ms timeout */
    if (st.status != 0) {
        printf("Kamera başlatma HATA: 0x%02X\n", st.status);
        return RTEMS_IO_ERROR;
    }
    printf("Kamera başlatıldı.\n");
    return RTEMS_SUCCESSFUL;
}

/* Kameradan veri al: RMAP read */
int obsw_camera_read_frame(uint8_t *frame_buf, uint32_t max_len) {
    rmap_status_t st = rmap_read(&rmap,
                                  ADDR_CAMERA, 0xD1,
                                  CAM_DATA_REG,
                                  frame_buf, max_len,
                                  2000);  /* 2 sn timeout */
    if (st.status == 0) {
        printf("Frame alındı: %u byte\n", st.data_length);
        return (int)st.data_length;
    }
    printf("Frame okuma HATA: 0x%02X\n", st.status);
    return -1;
}

ESA PUS ile SpaceWire entegrasyonu

ESA Packet Utilisation Standard (PUS — ECSS-E-ST-70-41C), uydu telekomanda/telemetri paketi formatını tanımlar. SpaceWire ağı, PUS paketlerini taşıyan transport katmanı görevi üstlenir.

TC (Telecommand)Yer istasyonundan gelen komutlar PUS TC paketleri olarak SpaceWire port 0'dan alınır ve router aracılığıyla ilgili payload'a yönlendirilir.
TM (Telemetri)Payload'lardan toplanan veriler PUS TM paketlerine sarılır ve port 0 üzerinden yer istasyonuna iletilir. JWST'de günde ~57 GB telemetri veri bu şekilde işlenir.
Time DistributionSpaceWire time code mekanizması, tüm payload'lara saniye bazında zaman senkronizasyonu sağlar. Bu, çok araçlı ölçümlerde kritik önem taşır (örn. manyetometre + ivme ölçer korelasyonu).
ECSS-Q-ST-80 SERTİFİKASYON

Uzay araçlarının OBSW kodu, ECSS-Q-ST-80 (Software Product Assurance) standardına göre sertifikalandırılır. Bu süreç: software management plan, gereksinim doğrulama matrisi, MISRA-C uyumluluk analizi (Polyspace veya CodeSonar), yüksek geçerlilik yazılım tanımlama (HRTL), dinamik analiz ve bağımsız doğrulama incelemesini kapsar. Tipik bir ESA misyonu için bu süreç 2–4 yıl alır.