( Csab | 2019. 09. 22., v – 06:11 )

Volt beszélgetés az I2C rendszerek problémáiról, a terepasztalon valószínűleg USART-ra fogom cserélni. Maga a terepasztal úgy megy, hogy van egy központi hálózat, az leadja a vonatok jeleit, a sorompó vezérlő, jelző vezérlő, meg miegymás ennek megfelelően állítja a fényeket, sorompókat.

Teljesen elosztott mikrovezérlős rendszer, ahol broadcast üzenetekkel értesülnek az egyes elemek, hogy mi a helyzet. Van egy központi mester, az tolja az üzeneteket.

Az architektúra durván így nézne ki:
https://people.ece.cornell.edu/land/courses/ece4760/PIC32/uart/multiple…

Half-duplex vonal lenne, a diódák miatt kb. open collectorosan működne, bár működhetne push-pull módon is. Egy dolog hiányzik belőle: az interrupt, amikor egy eszköz jelezni akar, hogy üzenete van. Ezt egy másik open collectoros vezetéken oldanám meg, amikor van üzenet, lehúzza a vonalat, a mester meg körbekérdez mindenkit, hogy mi történt.

Erre az I2C rendszer is jó lenne, akkor mi a baj vele:
- körülményes. Miközben az USART-on kiadom, hogy ezt a puffert DMA-val told át, vagy olvasd be, addig I2C alatt semmi nem megy tapsra. Nem lehet egy rendes DMA-t ráállítani. Ezer dolog történhet az I2C buszon, nem úgy megy, hogy itt egy puffer, küldd át, vagy töltsd fel.
- gyorsabb: még open collectorosan is 2X sebességgel megy (kevesebb szintátmenet), push-pull módban 20X is lehetne
- ha push-pull módban megy, akkor kevésbé zavarérzékeny
- az USART egyszerűbb hardver, sem az Atmel, sem az STM32 nem bug mentes. Lehetnek versenyhelyzetek, néha a chip is kiakad.
- a slave nem tudja jelezni, hogy vége az üzenetnek. Max az lehet, hogy az első bájt az üzenetból elmondja, hogy milyen hosszú lesz.
- az I2C előnye, hogy képes késleltetni a mestert, de ez egyben hátrány is, mert miközben vár, mást is csinálhatna a buszon.