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

Komunikacja USART w trybie synchronicznym

aju_cor 17 Sie 2010 11:02 2271 11
REKLAMA
  • #1 8406619
    aju_cor
    Poziom 12  
    Witam!

    W aplikacji muszę zastosować port szeregowy w trybie synchronicznym.
    Napisałem procedury zgodnie z dokumentacją procka (ATMEGA128).
    Wyniki są, zegar taktuje, dane są wysyłane (na razie sprawdzam tylko co się dzieje na TX i linii zegarowej).

    Podglądając transmisję na oscloskopie, zauważam że po wysłaniu 1 Bajtu danych zegar taktuje linię bez przerwy mimo, że znaki już nie są nadawane... A oczywiście chciałbym, aby zegar włączał się tylko na czas trwania nadawania...

    Drugi problem to dane , które są poprzedzone bitem startu... (po co???)

    Jak sobie z tymi 2 problemami poradzić?
  • REKLAMA
  • #2 8406912
    Maciekqbn
    Poziom 15  
    W transmisji szeregowej synchronicznej po UART to normalne, że zegar idzie cały czas.
    Moim zdaniem jeśli chcesz to zmienić to jedynym sposobem jest deaktywacja UARTu pomiędzy transmisjami, ale czy to ma sens?

    Może w Twoim przypadku użycie SPI byłoby lepszym wyborem? Tam tez masz transmisję synchroniczną i zegar jest gdy "idą" dane.
  • REKLAMA
  • #3 8407193
    aju_cor
    Poziom 12  
    Dzięki za odpowiedź...

    Pal licho ten zegar, ale co z z bitami start i stop które obserwuję na skopie?

    P.S. SPI odpada, bo inne peryferia gadają po serialu synchronicznym.

    Pozdrawiam!
  • #4 8407223
    _Robak_
    Poziom 33  
    Skoro clock leci cały czas a nie w przypadku rzeczywistej transmisji, to jak sobie wyobrażasz żeby zacząć transmisję?
  • #5 8407309
    aju_cor
    Poziom 12  
    no właśnie... tu pytanie, czy można uruchomić na AVR usart synchroniczny taki jak pamiętam z '51 - coś a'la SPI z taktowaniem zewnętrznym w przypadku odbioru danych...

    Dane na liniach RX / TX 8bitowe, bez bitów start/stop. Syncho po włączonym na czas transmisji 1B zegarze...

    Pozdrawiam.
  • REKLAMA
  • #6 8407323
    _Robak_
    Poziom 33  
    Wszystko się da, wystarczy napisać odpowiedni algorytm do software usart i już;]
  • #7 8407425
    Maciekqbn
    Poziom 15  
    W transmisji synchronicznej nie ma czegoś takiego jak bity startu i stopu. To są bity charakterystyczne dla transmisji znakowej (asynchronicznej).
    Transmisja synchroniczna jest zorientowana bitowo i dane odbiera się analizując odebraną ramkę - np. określony ciąg bitów jako znacznik początku czy końca ramki/transmisji.
  • #8 8407477
    aju_cor
    Poziom 12  
    1. @_Robak_ "Wystarczy napisać algorytm" - nie powiem, bardzo odkrywcze...

    2. "W transmisji synchonicznej nie ma b. startu i stopu... - właśnie o tym ciągle piszę... chciałbym taką mieć, zaś a AVR otrzymuję dziwoląga - ramka jak dla asynchoniczej komunikacji i dodatkowo zegar...

    Aby nie dublować. Czy jest mozliwa konfiguracja AVR-owskiego USARTU tak aby otrzymać poprawną "czystą" transmisje (bez start i stop).

    Pozdrawiam.
  • #9 8407514
    _Robak_
    Poziom 33  
    Ja ponawiam pytanie, skoro clk działa ciągle to jak chcesz odebrać znak 0xFF?
  • #10 8407565
    Maciekqbn
    Poziom 15  
    Tworzysz ramkę, w którą pakujesz właściwe dane.
    Czyli poprzedzasz właściwe dane ciągiem bitów sygnalizujących początek ramki. Zwykle tez daje się znacznik końca ramki. Zegar spełnia tylko i wyłącznie rolę synchronizacji bitowej.

    Wysyłanie pojedynczych znaków, choć jest mozliwe, nie ma sensu w transmisji synchronicznej (zorientowanej bitowo). Do tego lepiej/efektywniej wykorzystać transmisję asynchroniczną (zorientowaną znakowo).

    Transmisja synchroniczna ma sens w przypadku konieczności przesłania większej ilości danych, oszczędza wówczas czas na przesłanie "balastowych" bitów startu i stopu co kilka bitów właściwych danych.
  • REKLAMA
  • #11 8407969
    aju_cor
    Poziom 12  
    Procesor ma spełniać rolę programarki innego procesora z dużą pamięcią flash (Dużo danych, łącze szeregowe synchro jest najszybsze). Ten drugi procesor ma z góry narzucony uart szeregowy synchroniczny do programowania. Zatem nie chodzi tu o stworzenie własnego protokołu w oparciu o interfejes , tylko o ścisłe dopasowanie się do wymagań i możliwości drugiego proca. Nota tego procesora mówi o interfejsie UART szeregowym synchonicznym. Podglądam na oscyloskopie i widzę że: dane (8bitów) wysyłane są zgodnie z zegarem, który włączany jest tylko na czas trwania transmisji tych 8 bitów.

    Gdybym mógł, zrobiłbym to na '51, gdzie UART synchro tak właśnie wygląda. Niestety mam to zrobić na AVR...

    No nic, napiszę programowego UARTA synchro. Z nadawaniem nie będzie problemu ale z odbiorem nie wiem czy zdążę próbkować to jakoś sensownie.

    Myślę, że temat zamknięty.

    Dziękuję za chęci i pomoc.
    Pozdrawiam!
  • #12 8409498
    Maciekqbn
    Poziom 15  
    Ja tam bym do tego użył SPI (synchroniczna transmisja pojedynczych bajtów), ale nie znam szczegółów Twojego projektu, więc mogę się mylić w ocenie. Popatrz na wykresy czasowe SPI i synchronicznego UART (w chwili przesyłania znaku) - może się nada.
REKLAMA