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

[Atmega328] USART in SPI mode - MSPIM - czy ktoś tego próbował?

manekinen 01 Kwi 2011 12:17 2672 7
REKLAMA
  • #1 9348046
    manekinen
    Poziom 29  
    Sporo procesorów ma taką dodatkową opcję, mnie akurat interesuje Atmega328/168.

    Chodzi o to że USART może pracować jako HW-SPI po ustawieniu odpowiednich rejestrów. Wtedy mamy dwa sprzętowe SPI. Różnice nie są duże:
    -nazwy rejestrów
    -tylko tryb master
    -brak pinu SS
    -i może jeszcze coś co przeoczyłem

    A piny łączymy:
    MOSI = TX
    MISO = RX
    SCK = XCK

    Czy ktoś tego próbował użyć jako zwykłego SPI i co z tego wyszło? Głównie to interesuje mnie podpięcie do tego karty SD bo ten "prawdziwy" SPI będzie zajęty przez urządzenie które nie ma pinu CS, a też wymaga szybkiego przesyłu danych więc nie może być na softowym.

    Ogólnie mało informacji można o tym znaleźć, czyżby to jakiś bubel był?
  • REKLAMA
  • #2 9357723
    asembler
    Poziom 32  
    A dokładnie w czym problem bo całośc informacji zawarta w PDF?
  • REKLAMA
  • #3 9365892
    manekinen
    Poziom 29  
    Problemu brak, przynajmniej na razie. Liczyłem na to że ktoś się podzieli jakimiś spostrzeżeniami czy uwagami - bo tematów o tym trybie to ze świecą szukać. No trudno :(
  • Pomocny post
    #4 9365899
    asembler
    Poziom 32  
    To w czym problem jak nie ma problemu, a skoro tak to podziel sie swoimi doświadczeniami.
    Ja w tym trybie wypycham dane z pamieci RAM w jedną stronę a ponieważ bajty idą sobie sprzetowo to mam 16 taktów na incrmentacje warunki itp. czyli na przygotowanie nastepnego bajtu. Oczywiście bez sensu jest sprawdzać czy już procek skonczyl transmisje a wystarczy własnie zasmiast sprawdzania wykorzystać takty jak napisałem wyżej.
    Troszkę brakuje sprzetowej negacji bitów no ale trudno. (A może jest?)

    Sprawa jest super ze wzgledu na szybkośc (10MHz) a "zwykły" SPI mam oczywiscie do innych zadań.
    Ustawienia banalne kilka dosłownie bajtów.
  • REKLAMA
  • #5 9529704
    manekinen
    Poziom 29  
    Ten "durny" temat założyłem dla tego że nie miałem jak sprawdzić tej funkcji w praktyce, a musiałem zlecić płytki do produkcji.

    Uruchomiłem dzisiaj ten USART in SPI mode, działa super. Trochę namieszane z rejestrami jest i trzeba dobrze doczytać.

    Przykład w bascom który u mnie działa, myślę że komuś się przyda :)

    Kod: text
    Zaloguj się, aby zobaczyć kod


    Jest jeszcze flaga TXC (UCSR0A.6) której można używać zamiast UDRE (UCSR0A.5), ale trzeba ją manualnie resetować po odczycie. W datasheet jest chyba błąd, bo każą wklepywać do niej "1" aby ją zresetować - gdzie tu logika?
    [Atmega328] USART in SPI mode - MSPIM - czy ktoś tego próbował?
  • REKLAMA
  • #6 9529794
    tmf
    VIP Zasłużony dla elektroda
    Wbrew pozorom jest tu logika, wystarczy pomyśleć jak to jest sprzętowo realizowane. Zresztą Atmel w jednej z not wyjaśnia skąd resetowanie poprzez wpisanie jedynki się wzięło.
  • #7 9529838
    manekinen
    Poziom 29  
    Mógłbyś podesłać jakiś link na ten temat? :)

    Mam natomiast problem podczas słania z włączonym samym pinem nadającym. Otóż wg tego co napisano, przy wyłączonym odbiorniku, flaga RXC w rejestrze UCSRnA będzie automatycznie zerowana, a odebrane dane automatycznie uznane za odczytane z rejestru UDR - no chyba że źle coś zrozumiałem?

    Tak więc nie sprawdzam flagi gotowości bufora odbierającego, ani jego nie czytam - bo odczyt ten spowalnia mi komunikację. Wygląda na to że procek dane śle, ale urządzenie odbierające otrzymuje jakieś krzaki. Czy to co chcę zrobić jest w ogóle możliwe?
  • #8 9530083
    tmf
    VIP Zasłużony dla elektroda
    Z AVR-libc: The solution is simple: writing a logical 1 to it requires only a single OUT instruction, and it is clear that only this single interrupt request bit will be cleared. There is no need to perform a read-modify-write cycle (like, an SBI instruction), since all bits in these control registers are interrupt bits, and writing a logical 0 to the remaining bits (as it is done by the simple OUT instruction) will not alter them, so there is no risk of any race condition that might accidentally clear another interrupt request bit.
    Jest jeszcze drugi powód - taka flaga jest zapewne realizowana jako przerzutnik - wejście w przerwanie go ustawia (sygnał Set), a ty go zerujesz podając sygnał Reset dla przerzutnika. Pewnie jest to prostsze do realizacji niż tworzenie pełnego rejestru.
    Co do realizacji SPI na USART - też masz od tego noty aplikacyjne i gotowe kody, po co wywarzać otwarte drzwi?
REKLAMA