logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

Ile cykli trwa przesłanie bajtu przez SPI?

Mad Bekon 23 Lip 2011 14:06 1558 4
REKLAMA
  • #1 9749599
    Mad Bekon
    Poziom 23  
    Witam kolegów.

    Chciałbym, żeby ktoś pomógł mi zrozumieć skąd się bierze i ile jest cykli podczas wysyłania/odbierania jednego bajtu przez SPI? Z tego co zrozumiałem to przy podzielniku SPI / 2, dla 8MHz, powinienem móc wysłać trochę poniżej 500kB/s.

    Zegar SPI ustawiłem na Fcpu / 2. Robię:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    I wychodzi na to, że kod długo dość wisi na funkcji while.
    Po podejrzeniu w debugerze, cała pętla while to tylko 3 instrukcje assemblera, ale kod skacze przynajmniej kilkadziesiąt razy w tej pętli. W sumie pokazał 134 cykle na jedną iterecję pętli:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
    co przy 8MHz daje jakieś ok 59 Kbajtów.
    Jaką rzeczywistą prędkość przesyłania danych można uzyskać na zegarze 8MHz?

    Pozdrawiam
  • REKLAMA
  • REKLAMA
  • #3 9755722
    nsvinc
    Poziom 35  
    Dlatego też popychanie danych po SPI realizuje się z użyciem FIFOów i przerwań, w szczególności na AVR czy PIC, gdzie wejscie i wyjscie z ISRa ma prawo trwać krótko...

    Procki które na wejscie i wyjscie z ISRa zużywają dużo cennych cykli, przeważnie mają już DMA no i temat rozwiązuje się sam...
  • REKLAMA
  • #4 9757822
    Mad Bekon
    Poziom 23  
    Ustawiałem SPI w ten sposób:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    Właśnie zauważyłem gdzie był błąd... Ale mi wstyd....
    Jednak jak się coś czasami odstawi na bok, to odpowiedź przyjdzie sama.
    Dzięki Light-I, za pchnięcie znów do zastanowienia oraz koledze nsvinc, za cenne uwagi.
    Pozdrawiam
  • #5 9758049
    tmf
    VIP Zasłużony dla elektroda
    nsvinc napisał:
    Dlatego też popychanie danych po SPI realizuje się z użyciem FIFOów i przerwań, w szczególności na AVR czy PIC, gdzie wejscie i wyjscie z ISRa ma prawo trwać krótko...

    Procki które na wejscie i wyjscie z ISRa zużywają dużo cennych cykli, przeważnie mają już DMA no i temat rozwiązuje się sam...


    No i tu jest ból straszny, bo AVR na SPI nie mają FIFO (na innych zresztą też nie, co szczególnie w przypadku UARTów wydaje się być kretynizmem). A DMA mają tylko XMega...
    No i wejście i wyjście z przerwania, ze względu na potężny prolog i epilog, generowany przez debilnie działające w tym przypadku gcc, powoduje, że obsługa SPI na przerwaniach praktycznie nie ma sensu.

    Dodano po 1 [godziny] 37 [minuty]:

    BTW, pojęcia debil i kretyn nie są obraźliwe, ani niestosowne. Są, obecnie praktycznie niestosowanymi, określeniami medycznymi na lekkie upośledzenie umysłowe, lub głębokie wywołane niektórymi endokrynopatiami. W tym przypadku zastosowanymi z premedytacją - w XXI w. robienie UART bez FIFO trudno inaczej nazwać. Prolog i epilog w przypadku ISR generowany przez avr-gcc, jest powiedzmy mniejszym problemem, stąd użyłem łagodniejszego terminu.
REKLAMA