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

AVR SPI - Jak wysłać 3 bajty bez przerw w cyklu zegarowym?

dex 31 Sie 2007 19:36 2879 5
REKLAMA
  • #1 4236951
    dex
    Poziom 27  
    Posty: 1299
    Pomógł: 40
    Ocena: 101
    Mam problem, potrzebuje wysłać do układu 3 bajty w jednej paczce przez SPI, procesor jest masterem i wysyła dane do układu. Robie to narazie na piechote, jak na ząłączonym kodzie. I właśnie:
    Czy jest możliwe by cała sekwencja 3 bajtów miała nie "zakłócony" cykl zegarowy - widac to na zdjęciu, te przerwy ( u góry zegar, na dole dane). Być może układ przyjął by te dane, ale chciałbym żeby to wyglądało ładnie, czy jest wogole taka możliwość? Wiem że jest to spowodowane ładowaniem zmiennej do r16, i kolejną instrukcją ładującą ją do SPDR - są to dwa takty przed fizycznym wysłaniem danych, ale przy dzielniku zegara 4 ta przerwa jakaś nazbyt wyraźna. Czy jedyna rada to większy podział zegara, tak by te dwie instrukcje nie były nazbyt widoczne?


    ----Chyba odpowiem sobie sam przy fazie zegara zacznającego start od "0" ta przerwa tak się 'wydłuża" i w rzeczywistości wynosi pół cyklu lini SCLK SPI. Bo zegar dla 1 bitu 2 i 3 bajtu "zaczyna się" w połowie tej "przerwy" .

    SPInadaj:				; 
    	ldi r16,0b01010011	//1 bajt
    	out SPDR,r16	
    czekaj:
    	sbis spsr,spif
    	rjmp czekaj			; czekaj az zakonczy sie transmisja jednego bajtu
    
    
    	ldi r16,0b01110000	//drugi bajt
    	out SPDR,r16
    czekaj2:
    	sbis spsr,spif
    	rjmp czekaj2		
    
    
    	ldi r16,0b00111001	//tzreci bajt
    	out SPDR,r16
    czekaj3:
    	sbis spsr,spif
    	rjmp czekaj3
    
    
    ret
    


    Drugie takie uzupełniające pytanie:
    Co by było gdybym miał wysłać np. 19 bitów. Przecież nie mamy informacji który aktualnie bit jest wysuwany w danej chwili, by zastopować transmisje, zmieniając stan lini SS (CS). Jest to wogóle wykonalne ?
    Załączniki:
    • AVR SPI - Jak wysłać 3 bajty bez przerw w cyklu zegarowym? 3bajty.jpg (26.06 KB) Musisz być zalogowany, aby pobrać ten załącznik.
  • REKLAMA
  • Pomocny post
    #2 4237049
    markosik20
    Poziom 33  
    Posty: 2264
    Pomógł: 208
    Ocena: 147
    Cytat:
    Co by było gdybym miał wysłać np. 19 bitów. Przecież nie mamy informacji który aktualnie bit jest wysuwany w danej chwili, by zastopować transmisje zmieniając, stan lini SS (CS). Jest to wogóle wykonalne ?

    AVR to 8-bitowiec, więc sprzętowy SPI będzie działał zawsze na 8bitach.
    Można to zrobić ale programowo...tylko oczywiście będzie wolniej.
    SPI w AVR nie posiada pamieci FIFO (jak np: w niektórych ARM) więc nigdy nie osiągnie się "płynności" wysyłania.
  • REKLAMA
  • #3 4237572
    lelekx
    Poziom 30  
    Posty: 1220
    Pomógł: 158
    Ocena: 90
    Możesz "cyklować" wysyłanie do SPI, znając częstotliwość pracy portu wyliczysz ile cykli potrzeba na wysłanie jednego bajta. Po 9 (!) impulsach zegarowych wysyłasz znowu do SPI kolejny bajt. Niestety pauza jednego cyklu SPI musi zostać, próba wpisania zaraz po ósmym zaskutkuje zgłoszeniem kolizji.
  • REKLAMA
  • Pomocny post
    #4 4239565
    Nawigator
    Poziom 33  
    Posty: 1923
    Pomógł: 167
    Ocena: 160
    CLK w SPI może mieć dowolne czasy więc przerwy pomiędzy i w trakcie wysyłania bajtu są bez znaczenia, istotne są zbocza i stan linii danych w tych momentach.
    SPI jest dlatego praktyczne bo może być przerywana transmisja innymi zdarzeniami. To że nie wygląda to "ładnie" to nie ma znaczenia.
    19 bitów być może można wysyłać sprzętowym SPI jako 24 bity i układ Slave zignoruje ostatnie 5 bitów, to jest do sprawdzenia w dokumentacji i na żywo.
    Pzdr. N.
  • REKLAMA
  • #5 4239651
    dex
    Poziom 27  
    Posty: 1299
    Pomógł: 40
    Ocena: 101
    tak doczytałem to rzeczywiście, że odbiornik slave zignoruje nadmiarowe dane. Jak powinna wyglądać konfiguracja fazy zegara tzn pierwszy 'pół cykl" od zera czy od jedynki dla takiego diagramu, wg mnie to diagram rózni się od opisu :

    "The transceiver is programmed by the 3-wire bus
    (CLOCK, DATA and ENABLE).
    After setting enable signal to low condition, on the rising
    edge of the clock signal, the data is transferred bit by bit
    into the shift register, starting with the MSB-bit."

    że przy narastającym zboczu zegara jest ustawiany kolejny bit słowa. a na diagramie czasowym DATA jest ustawiona na jedynke już przed startem narostu zbocza zegara do wysokiego poziomu.

    Ustawić zegar zaczynający się ( pierwsza połowa cyklu) od zera czy od jedynki?
    Załączniki:
    • AVR SPI - Jak wysłać 3 bajty bez przerw w cyklu zegarowym? spi.gif (12.46 KB) Musisz być zalogowany, aby pobrać ten załącznik.
  • Pomocny post
    #6 4244341
    Nawigator
    Poziom 33  
    Posty: 1923
    Pomógł: 167
    Ocena: 160
    Ten opis sie zgadza ale jest trochę nieczytelny, kolejność jest taka:
    enable H->L to jest start transmisji
    data musi byc ustawiona przed narastającym zboczem clk
    clk L->H wpisuje wartość bitu do rejestru
    clk H->L przesuwa rejestr dla następnego bitu i następnie zmienia się data (to może trwać dowolnie długo byle zdążyć przed następnym impulsem clk)
    itd.
    Na koniec enable L->H
    Zegar musi być od zera czyli SPI mode=00
    SPI jest sterowane zboczami co jest bardzo wygodne bo czasy bitów nie mają znaczenia.
    Poszukaj not aplikacyjnych Atmela, jest kilka na różne okazje.
    Pzdr. N.
REKLAMA