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

[at2313][c] Problem z obsługą SPI

mikmas 03 Wrz 2010 00:17 2174 9
REKLAMA
  • #1 8470292
    mikmas
    Poziom 18  
    Szukałem na forum rozwiązania mojego problemu, ale nic nie znalazłem. Jeżeli już jest taki temat to bardzo bym prosił o przesłanie mi linka na prv. Temat skasuję

    Więc: muszę zrobić układ, gdzie at2313 pracuje w trybie master. Podłączyłem więc oscyloskop pod MOSI i zadałem mu następujący kodzik:
    void USI_transmit(const char what)
    {
    	USIDR=what;
    	USISR = (USIOIF);
    	do{
    		USICR = (USIWM0) | (USICS1) | (USICLK) | (USITC);
    		_delay_ms(40);
    	}while(!(USISR & USIOIF));
    }
    
    void USI_senddata(const char* what)
    {
    	while(*what++)
    		USI_transmit(*what);
    }

    Następnie USI_senddata("hello world"); wywoływane w nieskończonej pętli. Przerobiłem na podstawie dokumentacji w asmie. Reakcja jest taka, że CLK ładnie taktuje (1, 0 naprzemiennie), niestety na MOSI nie ma nic (na wszelki wypadek sprawdziłem także MISO - także nic) - cały czas jest stan niski. Co więc jest źle?
  • REKLAMA
  • #2 8470350
    rpal
    Poziom 27  
    źle przerobiłeś procedurę w asm na C, choćby w tym względzie że do rejestrów wpisujesz numery bitów na nie "1" przesuniętą o numer bitu :)
    Chodzi o ten operand "<<". Zamiast przerabiać gotowca z datasheta trzeba było zrobić zwykłą wstawkę assemblera gdzie zamieniasz r16 na r24 który to jest miejscem w którym C przekazuje do procedury parametr dla liczby char i byłoby po zawodach. Poza tym ten delay w ogóle nie jest tam potrzebny.
  • REKLAMA
  • #3 8471805
    mikmas
    Poziom 18  
    A no fakt, trochę gópi jestem. Jeszcze (metodą prób i błędów) doszedłem, że trza dać dodatkowo DDRB. JEDNAK! Co mnie zdziwiło i trochę zaniepokoiło: avr jest masterem, więc dane powinny wypływać na MOSI (Master Output Slave Input). Wypływają natomiast na MISO! Jakim - że tak powiem - prawem?
  • #4 8473308
    rpal
    Poziom 27  
    musisz się kolego zastanowić co jest dla ciebie tymi "danymi". Żeby coś odebrać trzeba coś wysłać więc na obydwu liniach pojawiają sie przebiegi. Nie ma .. Master Output Slave Input i odwrotnie Master Imput Slave Output. Skoro uP to Master to to co podłaczysz musi być Slave a jak napisałem wcześniej i tu i tu są dane tylko wysyłane w przeciwne strony.
  • #5 8474056
    mikmas
    Poziom 18  
    To inaczej. Na MOSI dane powinny wychodzić, na MISO - przychodzić. Na MOSI się nic nie dzieje, na MISO - kontroler wysyła. Choć nie powinien. Urządzenie, które będzie sterowane tym protokołem nie jest jeszcze podłączone. Jedynie oscyloskop daje informacje, co na których nóżkach uP się dzieje. Tak więc mogę z całą stanowczością powiedzieć, że dane wychodzące pojawiają się na MISO. Tylko czemu?
  • #6 8474104
    tymon_x
    Poziom 30  
    mikmas napisał:
    To inaczej. Na MOSI dane powinny wychodzić, na MISO - przychodzić. Na MOSI się nic nie dzieje, na MISO - kontroler wysyła. Choć nie powinien. Urządzenie, które będzie sterowane tym protokołem nie jest jeszcze podłączone. Jedynie oscyloskop daje informacje, co na których nóżkach uP się dzieje. Tak więc mogę z całą stanowczością powiedzieć, że dane wychodzące pojawiają się na MISO. Tylko czemu?

    [at2313][c] Problem z obsługą SPI
    Mylą Ci się piny, o to czemu (; Dla USI to DO (Data Output), DI (Data Input).
  • REKLAMA
  • #7 8474321
    mikmas
    Poziom 18  
    To by wiele wyjaśniało. Tylko czemu piszą, że do USI należą 3 piny - UCSK, MISO, MOSI? A nie SCL, DI, DO?

    Kolejny powstały dylemat: na płytce - ok, zamienię piny będzie ok. Jednak skoro do SPI należy SCL, DI, DO, to co z urządzeniem po drugiej stronie? W jego datasheecie było wyraźnie napisane UCSK, MISO, MOSI. Urządzenie jest Slave, czyli połączenie DO->MOSI, DI<-MISO, SCL->UCSK będzie dobre?
  • #8 8476134
    rpal
    Poziom 27  
    Nie piszą MOSI MISO bo zdaje się chyba są jakieś prawa autorskie to tego mogę się jednak mylić ale chyba Motorola ma coś z tym wspólnego. W każdym razie funkcjonuje podwójne nazewnictwo. Natomiast z tym wychodzeniem danych to jest tak że aby w ogóle transmisje uruchomić to do mastera trzeba cokolwiek wpisać tym samym z mastera wychodzi jeden bit a w to miejsce wchodzi ze slave 1 bit. Więc transmisja jest dwukierunkowa.
  • #9 8485895
    mikmas
    Poziom 18  
    W obu przypadkach nazwa "MOSI" i "MISO" została użyta, więc wątpliwe, że "tak sobie". Na podłączanym układzie mam w datashicie MISO i MOSI. Na mikro także, mimo, że nie mogę go "zmusić" do egzekwowania tego. Moje obawy są następujące: jeżeli zrobię podłączenie
    uC/układ podłączany
    DI<--MISO
    DO-->MOSI
    To czy:
    1. Protokół będzie zachowany? Nie będzie jakiś hopek z tym?
    2. Poprawnie w ogóle to będzie podłączane?

    Można by odpowiedzieć: "mikmas! Podłącz i se sprawdź, czy to zatrybi. Jak nie to wtedy zawracaj nam głowę!". Jednak muszę wszystkiego być pewien ze strony hardware, bo protokół nie jest prosty i muszę wiedzieć, co nie trybi, a na pewno za pierwszym razem nie będzie.
  • REKLAMA
  • Pomocny post
    #10 8487100
    rpal
    Poziom 27  
    jak chcesz to dostaniesz taką odpowiedź. mikmas p... tutaj jak potłuczony. Żle podłaczasz a powinno być tak, uP to układ master więc podłączenie wygląda następująco:
    uP (master) coś tam(slave)
    MISO DOut
    MOSI DIn
    SCK CLK
    Poza tym jest jeszcze jedna linia sterująca dostępem od strony uP może to być dowolna linia użyta jako wyjściowa. W układach slave nazywać się może różnie np. CS. Jej stan inicjuje układy slave i włącza je . Więc jesli masz na jednej magistrali np. 20 układów Slave to musisz zadbać aby każdy z nich miał dla siebie odpowiednią linię CS aby za jej pośrednictwem wskazywać gdzie chcesz coś wysłać. Przed rozpoczęciem transmisji należy z poziomu High przejść na Low. A potem zacząć transmisję przez wpisanie do rejestru SPI w uP danej do wysłania. Reszta robi się sama. Szczegolną linią jest linia SS w uP. To jest w zasadzie linia przeznaczona na sterowanie układem zewnetrznym tylko jest małe ale , jeśli nawet masz SPI ustawione jako master a linia SS jako wyjściowa ze stałym poziomem High to jeśli "coś" wymusi na niej z zewnątrz poziom Low to cała transmisja SPI przestawi się sama na ustawienie jak dla Slave a uP będzie oczekiwał na odbiór a nie na nadawanie. Może to jest twoim problemem że zapomniałeś o sterowaniu czyli o CS albo coś utrzymuje bez przerwy niski poziom na twojej lilnii SS wówczas będziesz miał istotnie kłopot z wysłaniem czegokolwiek na zewnątrz. Sprawdź prawidłowość podłaczeń i sterowania peryferiami. Zadowolony ?
REKLAMA