Kapitel 4 - Serielle Schnittstelle: I²C & USART

Startseite · Kap. 3 PIO · 4 Serielle Schnittstelle · → Kap. 5 Timer Verwandt: Kap. 6 Interrupts · Kap. 10 Leitungscodes · Glossar Quellen: [Q: I2] ES-04-I2 I2C-Bus · [Q: ZF §4/§4a I²C] · [Q: ZF §5/§5a USART] · [Q: KL20 Aufg. 6]


Inhalt


Teil A - Grundlagen serielle Übertragung

Seriell vs. parallel

SeriellParallel
ÜbertragungBits nacheinander über 1 Leitungmehrere Bits gleichzeitig über mehrere Leitungen
Vorteilwenige Leitungen, billig, keine Laufzeitunterschiedehöhere Datenrate bei gleichem Takt
Nachteilpro Takt nur 1 Bitteuer, Platz, Skew (Laufzeitunterschiede) begrenzt Speed

Typische serielle Schnittstellen: RS-232, I²C, SPI, CAN, USB, Ethernet, Firewire.

Synchron vs. asynchron

SynchronAsynchron
Taktleitungja - separate Clock gibt gültigen Bit-Zeitpunkt vornein
Synchronisationüber TaktsignalSender/Empfänger einigen sich auf Baudrate; Startbit synchronisiert
BeispieleSPI, I²CRS-232, CAN

Teil B - I²C / TWI-Bus

I²C (Inter-Integrated-Circuit), 1982 von Philips eingeführt. Atmel nennt es TWI (Two-Wire Interface) - funktional identisch (Namensrecht). Serieller synchroner Bus, verbindet ICs eines Geräts (µC ↔ Displays, Sensoren).

Aufbau & Elektrik

  • 2 Leitungen:
    • SCL (Serial Clock, bei Atmel TWCK) - Taktleitung
    • SDA (Serial Data, bei Atmel TWD) - Datenleitung, bidirektional (Halbduplex)
  • Pull-Up-Widerstände an beiden Leitungen; Open-Collector/Open-Drain: Teilnehmer können nur aktiv auf Low ziehen, „High" entsteht passiv → idle high (im Ruhezustand SCL & SDA = High).
  • Positive Logik: High = 1, Low = 0.
  • Master-Slave / Multi-Master: Bis zu 127 Slaves über 7-Bit-Adresse. Ein Master (Controller) initiiert; Slaves (Targets) antworten nur auf Aufforderung.

Protokollablauf

sequenceDiagram
    participant M as Master (Mikrocontroller)
    participant S as Slave (z. B. LED-Matrix)
    M->>S: Start + 7-Bit-Adresse + R/W=0 (Write)
    S-->>M: ACK (Low)
    M->>S: Datenbyte (8 Bit, MSB zuerst)
    S-->>M: ACK
    M->>S: weiteres Datenbyte
    S-->>M: ACK
    M->>S: Stop
  1. Start-Condition: Master zieht SDA auf Low, während SCL High ist (fallende SDA-Flanke bei SCL=High).
  2. Adresse (7 Bit) + R/W-Bit: 0 = Write (Master→Slave), 1 = Read (Slave→Master).
  3. Acknowledge (ACK): Empfänger bestätigt jedes Byte mit Low (0). NACK = High (1) = keine Reaktion.
  4. Datenpaket: 8 Bit, MSB zuerst, jeweils gefolgt von ACK. Beliebig viele Bytes.
  5. Stop-Condition: Master lässt SDA auf High steigen, während SCL High ist (steigende SDA-Flanke bei SCL=High).

Gültigkeitsregel: SDA darf sich nur ändern, wenn SCL = Low ist - Ausnahme: bei Start/Stop ändert sich SDA bei SCL = High. (Das ist genau der Trick, wie Start/Stop von normalen Datenbits unterscheidbar sind.)

Arbitrierung (Multi-Master)

  • Bei Bus-Leerlauf (SCL & SDA High) darf ein Master eine Start-Condition erzeugen.
  • Kollision: Beide Master beobachten SDA beim Senden. Sendet ein Master „1", liest aber „0" → er hat verloren (ein anderer zieht SDA auf Low) → stoppt sofort, wartet auf freien Bus.
  • Kein zentraler Taktgeber nötig; Taktfrequenz wird pro Übertragung vom aktiven Master bestimmt.

Geschwindigkeits-Modi

ModusRate
Standard Mode100 kBit/s
Fast Mode400 kBit/s
Fast Mode Plus1 MBit/s
High Speed Mode3,4 MBit/s (rückwärtskompatibel, Umschaltung per Bytesequenz)
Ultra Fast Mode5 MBit/s (unidirektional, nur Schreiben)

TWI auf SAM3X (Register-Überblick)

Angebunden über APB, Takt vom PMC, Interrupts über NVIC, DMA über PDC. Pins gemuxt (z. B. TWD1=PB12, TWCK1=PB13).

RegisterFunktion
TWI_CR (Control)Start/Stop/Reset, Master/Slave aktivieren (MSEN, SVEN)
TWI_MMR (Master Mode)Slave-Adresse DADR, Richtung MREAD (0=Write,1=Read), interne Adresslänge IADRSZ
TWI_SR (Status)TXRDY, RXRDY, TXCOMP, Fehler NACK
TWI_CWGR (Clock Waveform)Busgeschwindigkeit: Teiler CKDIV, Low/High-Zeiten CLDIV/CHDIV
TWI_THR / TWI_RHRTransmit/Receive Holding Register (Byte senden/empfangen)

Ablauf Master Transmitter: Start → Adresse+Write → Daten (auf TXRDY warten, in THR schreiben) → beim letzten Byte STOP im CR → auf TXCOMP warten.

Laborhardware

  • AT91: keine I²C-Unterstützung.
  • SAM3X: 2× TWI, Standard/Fast Mode, 7/10-Bit-Adressen, Interrupt-fähig.
  • RP2040: 2× I²C, bis Fast Mode Plus.

Teil C - USART

  • UART = Universal Asynchronous Receiver/Transmitter (nur asynchron, z. B. RS-232).
  • USART = Universal Synchronous/Asynchronous … - Erweiterung, unterstützt auch synchronen Betrieb (kann Protokolle wie SPI bedienen).

Zeichenrahmen (Frame) asynchron - „9600 8N1"

 idle(High) | Startbit(Low) | D0 D1 ... D7 (LSB zuerst) | [Parität] | Stoppbit(e)(High) | idle
  1. Ruhezustand: Leitung High (Mark).
  2. Startbit: ein Low (Space) signalisiert Beginn.
  3. Datenbits: meist 7 oder 8, LSB zuerst.
  4. Paritätsbit (optional): Fehlererkennung (Even/Odd/None).
  5. Stoppbit(e): 1 oder 2 High-Pegel, stellen Ruhezustand wieder her.

„9600 8N1" = 9600 Baud, 8 Datenbits, No Parity, 1 Stoppbit. Abtastung (Sampling): Empfänger tastet mit Vielfachem der Baudrate (z. B. 16×) ab → erkennt Startbit sicher und liest Bits in der Bit-Mitte.

Elektrik RS-232

  • Negative Logik, höhere Spannungen: z. B. −15 V = logisch 1, +15 V = logisch 0 (Störsicherheit über lange Kabel). µC (TTL/CMOS) braucht Pegelwandler (z. B. MAX232).
  • Leitungen: TXD (senden), RXD (empfangen), + Handshake RTS/CTS (Request/Clear to Send), DCD. Mindestens braucht man außer Masse 2 Leitungen (TXD, RXD); TXD des einen an RXD des anderen (gekreuzt).

USART-Register (AT91/SAM3X, weitgehend gleich)

RegisterFunktion
US_CR (Control, write)Reset, TXEN/TXDIS, RXEN/RXDIS
US_MR (Mode)Protokoll: Parität PAR, Zeichenlänge CHRL, Stoppbits NBSTOP, Loopback-Modi
US_CSR (Status, read)TXRDY (Sender bereit), RXRDY (Byte empfangen), Fehler OVRE/FRAME/PARE
US_BRGR (Baud Rate)Baudrate über Teiler CD (SAM3X zusätzlich Fractional Part FP)
US_THR / US_RHRTransmit/Receive Holding Register

Doppelte Pufferung: Shift-Register (TSR/RSR, Serialisierung) + Holding-Register (THR/RHR, CPU-Zugriff).

Baudrate: vom MCK abgeleitet (AT91: einfacher Divisor CD; SAM3X: Fractional Baud Rate Generator für präzisere Takte).

Übertragungsmethoden

  • Polling: senden → auf TXRDY warten, dann US_THR schreiben; empfangen → auf RXRDY warten, US_RHR lesen.
  • DMA (PDC): Pointer (US_TPR/US_RPR) + Counter (US_TCR/US_RCR); HW dekrementiert Counter, bei 0 Interrupt (ENDTX/ENDRX).

Test-/Loopback-Modi (US_MR)

  • Automatic Echo: empfangene Daten direkt zurücksenden.
  • Local Loopback: Sender intern mit Empfänger verbunden (Softwaretest ohne HW).
  • Remote Loopback: RXD-Pin intern mit TXD-Pin verbunden.

Init-Ablauf USART

  1. PMC: Takt für USART an. 2. PIO: Pins freigeben (PIO_PDR, PIO_ABSR). 3. Reset (US_CR). 4. Baudrate (US_BRGR) + Modus (US_MR). 5. Sender/Empfänger aktivieren (TXEN,RXEN).

Laborhardware

  • AT91: 3 USART, programmierbare Baudrate, Paritäts-/Fehlererkennung, Echo/Loopback.
  • SAM3X: wie AT91 + konfigurierbar als SPI/IrDA/LIN + Fractional Baud Rate.
  • RP2040: 2 UART, große FIFOs, HW-Flusssteuerung, PIO für weitere Protokolle.

Prüfungsrelevanz

  • I²C: Start/Stop-Bedingung präzise (SDA-Flanke bei SCL=High); ACK=Low/NACK=High; 7-Bit-Adresse+R/W; Gültigkeitsregel (SDA nur bei SCL=Low ändern); Arbitrierung (1 gesendet, 0 gelesen → verloren); idle high durch Pull-Ups; synchron.
  • USART (KL20 Aufg. 6, Wahr/Falsch): RxD empfängt; RSR deserialisiert → RHR lesen; THR → TSR serialisiert ( nicht „THR serialisiert"); CTS/DCD/RTS nicht bei jeder Schnittstelle; Mode/Control-Register konfigurieren; Sync erfolgt mit Startbit (nicht davor).
  • „9600 8N1" erklären · seriell/parallel · sync/async · Skew.

Typische Fehler: Start/Stop mit SCL=Low statt High · ACK/NACK vertauschen · MSB/LSB-Reihenfolge (I²C = MSB zuerst, UART-Daten = LSB zuerst!) · „das THR serialisiert" (falsch - das Shift-Register serialisiert).

Kap. 3 PIO · → Kap. 5 Timer