Analiza awarii: moduł UART + DMA

/diagnozy/modul-uart-dma/ wersja raportu: 1.0 ID sprawy: UART-DMA-25-733

Zakres: interfejs UART 3,3 V (8N1/8E1) z odbiorem w trybie DMA (circular/normal) w modułach AGD: komunikacja z Wi-Fi/BLE, panelem HMI, licznikiem energii. Przepływności: 115200–921600 Bd. Funkcje: IDLE line detect, RTS/CTS (sprzętowe), „ring buffer” w RAM, parsowanie ramek (SLIP/CBOR/JSON). Badane zjawiska: ORE/FE/PE, utraty ramek przy kolizjach IRQ, błędy przy sleep/wake, ripple 3,3 V i zakłócenia 150 kHz–10 MHz.

Objawy i kody błędów

KodWarunek zapisuSkutek
E:UART-24FE+ORE > 8/1000 ramekrestart interfejsu
E:DMA-11brak obsługi HT/TC > 5 msutrata segmentu
E:SLP-07brak IDLE→TTM < 1 ms po wakeutrata 2–8 bajtów
W:CTS-03CTS=DEASSERT przy RX busylog ostrzegawczy
W:IRQ-05IRQ Wi-Fi > IRQ DMA w NVICpreempcja handlera
W:PSU-04ripple > 80 mVppderating peryferiów

Stanowisko i metodyka

Analizator logiczny 200 MHz (trigger na IDLE i CTS), generator ramek 0,5–2,0 kB @115–921 kBd, oscyloskop 500 MHz, sonda prądowa 10 A, generator zakłóceń przewodzonych 150 kHz–10 MHz, komora 20/55 °C. Konfiguracje: DMA circular 1–4 kB z przerwaniami HT/TC, DMA normal + IDLE, z/bez RTS/CTS. Firmware z logiką: wskaźniki wr/rd ring-buffera, watermarki, timeouty i parser SLIP.

ParametrWartość ref.Uwagi
Baud115200–921600 Bdbłąd clk < ±1,5%
Ring buffer≥ 2×MTUMTU=2048 B
IRQ latency< 25 µspoziom DMA > Wi-Fi
Ripple 3,3 V< 50 mVpp1–500 kHz

Wyniki i obserwacje

  1. Kolizje IRQ i DMA: przy NVIC (Wi-Fi>DMA) i burstach 1,5–2,0 kB obserwowano opóźnienie obsługi HT/TC 3,8–6,4 ms — DMA nadpisywał ring o 256–512 B → E:DMA-11, E:UART-24. Zmiana priorytetów i włączenie FIFO threshold wyeliminowały zjawisko.
  2. Sleep/wake race: wybudzenie MCU (~280 µs) + spóźnione włączenie IDLE line (po EN RX) skutkowało utratą pierwszych bajtów ramki (2–8 B), flaga E:SLP-07. Naprawa: „pre-arm” IDLE, opóźnienie TX partnera 1–2 ms lub ping-keepalive.
  3. Brak RTS/CTS: przy 921600 Bd i kablu 40 cm bez rezystorów szeregowych sygnał CTS nieobecny → „glitch” 1,5–3,2 µs na RX, FE/ORE 10–14/1000 → W:CTS-03. Dodano RTS/CTS i Rser 33–68 Ω.
  4. Ripple zasilania: buck 400 kHz generował 110–140 mVpp na 3,3 V podczas TX Wi-Fi, co podnosiło BER i liczbę FE; W:PSU-04. Po LC 10 µH/47 µF i MLCC 2×10 µF przy MCU ripple spadł do 36–44 mVpp.
  5. Zakłócenia 150 kHz–10 MHz: sprzęganie z mostka BLDC (18–22 kHz + harmoniczne) indukowało krótkie impulsy < 2 µs; filtr RC 47–100 Ω/100–470 pF i ferryt 600 Ω@100 MHz przy RX/TX ograniczył FE/NE >85%.
LOG START [UART-DMA-25-733]
t[ms]  Baud   RX_bytes  ORE  FE  PE  DMA_HT/TC[µs]  RB_wr/RB_rd  Ripple[mVpp]  Flags
0.0    115200 1024      0    0   0   18/36         512/0        22            OK
41.6   921600 2048      7    11  0   3840/6410     3584/1024     118           E:DMA-11,E:UART-24,W:PSU-04
63.2   921600 2048      0    2   0   14/29         4096/2048     44            RECOVER
128.5  460800 512       0    0   0   12/24         8192/7696     36            OK
LOG END

Hipotezy przyczynowe (ranking)

  1. PRIORYTETY NVIC/FIFO: preempcja przez IRQ Wi-Fi → spóźnione HT/TC i nadpisania bufora (wysoki).
  2. SLEEP/IDLE RACE: brak pre-arm IDLE i opóźniony EN RX po wake (wysoki).
  3. FLOW CONTROL/INTEGRACJA: brak RTS/CTS, brak Rser → FE/ORE (średni/wysoki).
  4. PSU RIPPLE: zasilanie 3,3 V zbyt „miękkie” przy burstach RF (średni).
  5. EMI/ROUTING: brak RC/ferryta, długie pętle UART (średni).

Wycinek procedury serwisowej

  1. DMA + NVIC: ustaw DMA_RX IRQ > Wi-Fi/BT i > parser; włącz FIFO 1/4–1/2; HT/TC obsłużyć < 25 µs; ring ≥ 4 kB dla 921600 Bd.
  2. IDLE line: tryb „normal” + przerwanie IDLE do ramek o zmiennej długości; po wake najpierw EN RX, potem czyszczenie IDLE i start timera TTM=0,5–1,0 ms.
  3. RTS/CTS: włączyć sprzętowo; dodać Rser 33–68 Ω w RX/TX, ferryt 600 Ω@100 MHz, TVS ESD ±5 V; przewody skręcone < 30–40 cm.
  4. Zasilanie: LC 10 µH/47–100 µF + MLCC 2×10 µF przy MCU/uart; ripple < 50 mVpp; masa gwiazdą.
  5. EMI: RC 47–100 Ω / 100–470 pF przy pinach; test 150 kHz–10 MHz; FE/NE=0 w 10 min logu.
  6. Test końcowy: burst 2 kB @921600 Bd, sleep/wake co 5 s — brak E:DMA-11/E:UART-24/E:SLP-07, PER=0, BER<10⁻⁶.

Wnioski

Utraty ramek w torze UART+DMA wynikają głównie z nieprawidłowej hierarchii przerwań (preempcja), wyścigu podczas wybudzenia (IDLE/EN RX), braku sprzętowego flow-control przy wysokich prędkościach, zbyt dużego ripple zasilania oraz niedostatecznej filtracji EMI. Korekta priorytetów NVIC, włączenie FIFO i RTS/CTS, „pre-arm” IDLE po wybudzeniu oraz wzmocnienie sekcji 3,3 V przywracają ciągłość transmisji i eliminują E:DMA-11/E:UART-24.

Przypadki nawracające kierować do diagnostyki lokalnej w serwisie AGD w Katowicach z logami HT/TC/IDLE, mapą NVIC, przebiegami 3,3 V i pełnym trace z analizatora logicznego.