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

[attiny2313] SPI loopback

ilmenauer 06 Gru 2008 13:10 1416 5
REKLAMA
  • #1 5824145
    ilmenauer
    Poziom 14  
    Przepraszam za angielski tytuł wiadomości. Nie radzę sobie z transmisją SPI na attiny2313 (moduł USI).
    Pytanie: czy zwierając MOSI z MISO wysyłając bajt w trybie master otrzymam go z powrotem? Po mojemu tak, po procesorowemu nie :(
    Wdzięczny będę za okazaną pomoc.
  • REKLAMA
  • #2 5824213
    BoskiDialer
    Poziom 34  
    Powinieneś otrzymać dokładnie to samo co wysłałeś. Jeśli nie działa, to możliwe że nie ustawiłeś trybu 3wire lub nie ustawiłeś pinu DO (tylko wyjście od 3wire, pomimo że MISO sugeruje inaczej - MISO jest od programowania) w DDRB jako wyjście (załączenie USI nie powoduje ustawienia tego pinu jako wyjście: patrz "Table 26. Overriding Signals for Alternate Functions in PB7..PB4" na stronie 58).
  • REKLAMA
  • #3 5824215
    Nawigator
    Poziom 33  
    Wysyłka wysyłce nierówna, USI ma kilka trybów taktowania, pokaż kod i ustawienia. Podejrzewam że problem będzie z taktowaniem rejestru UDR przez CLK.
    Albo dopnij zewnętrzny rejestr przesuwny.
    Pzdr. N.
  • REKLAMA
  • #4 5824786
    ilmenauer
    Poziom 14  
    Pokazuję kod:

    Inicjacja wywoływana raz, na początku programu:
    SPI_MasterInit:
    ;PB7 = UCSK, PB5 = MOSI, PB6 = MISO, SPI_CS = PB4
    ; Set MOSI, /SS and SCK output, all others input
    	in		tmp, DDRB
    	ori		tmp, (1<<PB7) | (1<<PB5) | (1<<SPI_CS)
    	andi     tmp, 0xFF - (1<<PB6) //clear bit in reg
    	out		DDRB, tmp
    	in		tmp, PORTB
    	ori		tmp, (1<<PB6)|(1<<PB4) ;data IN pull-up, /CS out-High
    	out		PORTB, tmp
    	sbi		PORTB, SPI_CS
    ret


    Polecenie wysyłające bajt z rejestru tmp (u mnie r16) i zwracające tamże:
    SPITransfer_Fast:
    	out 	USIDR,tmp	
       cbi		PORTB, SPI_CS
    	ldi 	tmp,(1<<USIWM0)|(0<<USICS0)|(1<<USITC)
    	ldi 	tmp2,(1<<USIWM0)|(0<<USICS0)|(1<<USITC)|(1<<USICLK)
    	out 	USICR,tmp ; MSB
    	out 	USICR,tmp2
    	out 	USICR,tmp
    	out 	USICR,tmp2
    	out 	USICR,tmp
    	out 	USICR,tmp2
    	out 	USICR,tmp
    	out 	USICR,tmp2
    	out 	USICR,tmp
    	out 	USICR,tmp2
    	out 	USICR,tmp
    	out 	USICR,tmp2
    	out 	USICR,tmp
    	out 	USICR,tmp2
    	out 	USICR,tmp ; LSB
    	out 	USICR,tmp2
    	in 		tmp,USIDR
    ret


    Wysyłam bajt co sekundę a jako debug używam uartu. No i niestety, przy zwartych MOSI z MISO wysyłany bajt może być dowolny a odebrany będzie i tak 0x00. Szto diełat?
  • REKLAMA
  • Pomocny post
    #5 5824854
    BoskiDialer
    Poziom 34  
    Czytaj uważnie posty! Pin DO (PB6) musi być ustawiony jako wyjście, nie MOSI(DI, PB5). MOSI jest od programowania, wtedy jest to wejście, podczas pracy z USI obowiązuje nomenklatura od USI, tzn: DO i DI, wtedy to DO musi być ustawiony jako wyjście (pomimo tego, że "MISO" sugeruje, że to będzie wejście).
  • #6 5824982
    ilmenauer
    Poziom 14  
    Jest! Działa!
    BoskiDialer jesteś boski :) a ja nie umiem czytać ze zrozumieniem tekstu.
    Spasiba, bolszoje!
REKLAMA