Analiza awarii: moduł UART + DMA
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
- Losowe przerwy w strumieniu (drop 10–80 ms) i reset modułu peryferyjnego.
- Błędy CRC i „dziury” w ramkach przy dużych burstach >2 kB oraz przy 921600 Bd.
- Po wybudzeniu z STOP/DS: brak pierwszych 2–8 bajtów (race na IDLE/EN UART).
- Kody:
E:UART-24(framing_overrun),E:DMA-11(missed_half_tc),E:SLP-07(wake_loss),W:CTS-03(no_flow_ctrl),W:PSU-04(ripple_high),W:IRQ-05(prio_conflict).
| Kod | Warunek zapisu | Skutek |
|---|---|---|
E:UART-24 | FE+ORE > 8/1000 ramek | restart interfejsu |
E:DMA-11 | brak obsługi HT/TC > 5 ms | utrata segmentu |
E:SLP-07 | brak IDLE→TTM < 1 ms po wake | utrata 2–8 bajtów |
W:CTS-03 | CTS=DEASSERT przy RX busy | log ostrzegawczy |
W:IRQ-05 | IRQ Wi-Fi > IRQ DMA w NVIC | preempcja handlera |
W:PSU-04 | ripple > 80 mVpp | derating 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.
| Parametr | Wartość ref. | Uwagi |
|---|---|---|
| Baud | 115200–921600 Bd | błąd clk < ±1,5% |
| Ring buffer | ≥ 2×MTU | MTU=2048 B |
| IRQ latency | < 25 µs | poziom DMA > Wi-Fi |
| Ripple 3,3 V | < 50 mVpp | 1–500 kHz |
Wyniki i obserwacje
- 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. - 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. - 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 Ω. - 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. - 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)
- PRIORYTETY NVIC/FIFO: preempcja przez IRQ Wi-Fi → spóźnione HT/TC i nadpisania bufora (wysoki).
- SLEEP/IDLE RACE: brak pre-arm IDLE i opóźniony EN RX po wake (wysoki).
- FLOW CONTROL/INTEGRACJA: brak RTS/CTS, brak Rser → FE/ORE (średni/wysoki).
- PSU RIPPLE: zasilanie 3,3 V zbyt „miękkie” przy burstach RF (średni).
- EMI/ROUTING: brak RC/ferryta, długie pętle UART (średni).
Wycinek procedury serwisowej
- 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.
- 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.
- 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.
- Zasilanie: LC 10 µH/47–100 µF + MLCC 2×10 µF przy MCU/uart; ripple < 50 mVpp; masa gwiazdą.
- EMI: RC 47–100 Ω / 100–470 pF przy pinach; test 150 kHz–10 MHz; FE/NE=0 w 10 min logu.
- 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.