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

[ATmega32] ATmega32 i ADS1256 - problem z obsługą SPI dla dwóch układów jednocześnie

pawgo2606 28 Cze 2012 19:28 4316 31
REKLAMA
  • #1 11052196
    pawgo2606
    Poziom 10  
    Witam,
    Mam problem z obsługą dwóch układów po SPI... Masterem jest ATmega32
    Jeżeli jeden obsługuję to jest ok, natomiast jeżeli podłączę drugi to układ zaczyna mi wariować.. Te dwa układy to ADS1256 oraz ATmega32.
    Poniżej zamieszczam kod do obsługi po SPI dla mastera.

    Kod: text
    Zaloguj się, aby zobaczyć kod



    Wysyłanie danej do ATmegi32

    Kod: text
    Zaloguj się, aby zobaczyć kod


    Odczyt danej z ADS1256

    Kod: text
    Zaloguj się, aby zobaczyć kod


    W pętli głównej programu mam najpierw ustawienia portów a następnie włączam przerwania, w których obsługuję zliczanie impulsów zewnętrznych i UART.

    W przypadku gdy mam podłączony tylko ADS1256 to wszystko jest ok. W przypadku podłączenia ATmegi32 układ ADS1256 zaczyna mi wariować...
    Nie wiem w czym może tkwić problem.
    W kodzie slave mam takie ustawienia:

    Kod: text
    Zaloguj się, aby zobaczyć kod



    A odczyt danych wysłanych do slave robię w przerwaniu programu slaeva
    Kod: text
    Zaloguj się, aby zobaczyć kod


    Dodam jeszcze że dla Slave w main nie ustawiam żadnych portów B tak jak jest to w programie mastera np. w funkcji ADS_Set_SS().
  • REKLAMA
  • #2 11052365
    mickpr
    Poziom 39  
    A jakiś schemat pokażesz?
    W jaki sposób wybierasz (CS#) konkretny chip?
    Wydaje mi się, że o tym zapomniałeś, czy się mylę?
  • #3 11052369
    LordBlick
    VIP Zasłużony dla elektroda
    Daj coś, co pokaże jak rzeczywiście podłączyłeś to wszystko w całość (schemat, zdjęcie). W Slave pin SS ma być ustawiony jako wejście, no i wysyłaj cokolwiek w przerwaniu oprócz odbierania, taki to jest urok SPI...
  • #4 11052377
    mickpr
    Poziom 39  
    LordBlick napisał:
    W Slave pin SS ma być ustawiony jako wejście...

    Masz racje, ale na początku kolega napisał:
    pawgo2606 napisał:
    Masterem jest ATmega32

    Moim zdaniem kolega nie steruje (w ogóle) pinami CS# swoich przetworników.
  • REKLAMA
  • #5 11052394
    LordBlick
    VIP Zasłużony dla elektroda
    mickpr napisał:
    LordBlick napisał:
    W Slave pin SS ma być ustawiony jako wejście...

    Masz racje, ale na początku kolega napisał:
    pawgo2606 napisał:
    Masterem jest ATmega32
    Z tego co zrozumiałem, w grę wchodzi 2x ATmega32. Poczekajmy na schemat/zdjęcie... ;)
    mickpr napisał:
    Moim zdaniem kolega nie steruje (w ogóle) pinami CS# swoich przetworników.
    Dokładniej przyjrzyj się kodowi, SS od ADS jest pod PB3, a drugiej ATmega32 - PB4.
    Problem w sumie polega na tym, ze SPI to nie USART, trzeba odbierać i wysyłać chociażby bzdury.
  • #6 11052448
    pawgo2606
    Poziom 10  
    [ATmega32] ATmega32 i ADS1256 - problem z obsługą SPI dla dwóch układów jednocześnie

    ADS1256 pod PB3
    ATmega32 pod PB4

    To w slave mam ustawić jeszcze PORTB&=~(1<<PB4) w main bo mam go użytego jako CS.
  • #7 11052452
    mickpr
    Poziom 39  
    LordBlick napisał:
    Dokładniej przyjrzyj się kodowi, SS od ADS jest pod PB3, a drugiej ATmega32 - PB4.

    Masz (oczywiście) rację, moje niedopatrzenie (błąd).
    Czy pin używany jako "CS#" w Atmega32 "robiącej jako slave SPI" nie powinien być podciągnięty "pull-up" ?
  • #8 11052496
    pawgo2606
    Poziom 10  
    Ustawienia slave
    Kod: text
    Zaloguj się, aby zobaczyć kod


    A w main mam
    PORTB&=~(1<<PB4);

    Przerwanie odczytujące dane z mastera w kodzie slave

    Kod: text
    Zaloguj się, aby zobaczyć kod


    Slave ma tylko odbierać dane.
  • #9 11052510
    LordBlick
    VIP Zasłużony dla elektroda
    Zadam banalne pytania: Czy poziomy napięć zasilania wszystkich układów są jednakowe i dobrze odfiltrowane ? Ma to wpływ na prawidłowo działającą logikę. Czy masy dobrze ze sobą połączone ? Jak to wygląda na oscyloskopie ?
    pawgo2606 napisał:
    Slave ma tylko odbierać dane.
    To wysyłaj 0xFF:
    Kod: text
    Zaloguj się, aby zobaczyć kod
  • #10 11052531
    pawgo2606
    Poziom 10  
    Jest jedna wspólna masa dla tych układów. Zasilanie jest doprowadzone jednym przewodem (wykorzystuję przewód UTP) a drugim przewodem sterowanie (też UTP).
  • REKLAMA
  • #11 11052548
    mickpr
    Poziom 39  
    pawgo2606 napisał:
    drugim przewodem sterowanie (też UTP).

    Jakiej długości ?
  • #12 11052549
    pawgo2606
    Poziom 10  
    Max 1 metr.
  • #13 11052612
    janbernat
    Poziom 38  
    W master ustawiasz CPHA a w slave- nie.
    Master chodzi w trybie 1 a slave w trybie 0.
    No i częstotliwości zegarów- sygnał do slave nie może przekraczać 1/4 jego zegara.
    A jaki jest to zależy od zegara master-a.
  • #14 11052629
    pawgo2606
    Poziom 10  
    Mam 8 MHz/16 Master i 8 MHz Slave

    SPCR|=((1<<SPE) | (1<<MSTR)| (1<<SPR0)|(1<<CPHA)|(0<<CPOL)); //Tryb master, CLK/16
  • #15 11052700
    janbernat
    Poziom 38  
    A układ dwóch atmeg bez ADS1256 działa prawidłowo?
    Nie rozumiem po co masz tak dziwnie skonstruowane funkcje wyboru układów.
    Powinno chyba być:
    PORTB &= ~(1<<CS1);
    ........
    PORTB |= (1<<CS1);
    i tak samo dla wyboru drugiego układu.
    P.S.
    No i co z tym CPHA?
  • #16 11052738
    pawgo2606
    Poziom 10  
    W slave CPHA nie ustwiam. a po co CS1 skoro mogę operować na wejściach PB3 i PB4?? Układ dwóch Atmeg też nie nie działa zbytnio prawidłowo... czy macie przykład sterowania dwoma AVR?? w slave mam jeszcze obsługę przerwania od komparatora i timera
  • #18 11052905
    pawgo2606
    Poziom 10  
    To podajcie konkretny przykład jak ma to wyglądać..
  • #20 11052960
    janbernat
    Poziom 38  
    http://www.atmel.com/products/microcontrollers/avr/default.aspx?tab=documents
    I tam poszukaj avr151.
    Jest co prawda kod w IAR- ale daje się przerobić.

    CS1 i CS2 to nazwy pinów portu zdefiniowane jako chip_select.
    Nazwać możesz je jak chcesz- ale operować powinieneś wybierając układy po kolei.
    A tryby są ważne- jeśli ADS1256 działa w trybie 1 to ATMega jako slave też powinna działać w trybie 1 a nie w trybie 0.
  • #21 11052978
    pawgo2606
    Poziom 10  
    Już się pogubiłem w tym co poszecie... Mam teraz tak
    master

    Kod: text
    Zaloguj się, aby zobaczyć kod


    a jak w slave mam ustawić??
    Kod: text
    Zaloguj się, aby zobaczyć kod
  • #22 11053001
    janbernat
    Poziom 38  
    No ustaw w SPCR bit CPHA i sprawdź.
  • REKLAMA
  • #24 11053041
    pawgo2606
    Poziom 10  
    W tym momencie działa mi dobrze komunikacja pomiędzy AVR. Jak podłączę ADS1256 to odczyt z niego mam błędny... Jak odepnę slave ATmegę i zresetuję układ to pomiar jest dobry. Po ponownym podpięciu ATmegi, odczyt z ADS1256 jest błędny...
  • #25 11053075
    LordBlick
    VIP Zasłużony dla elektroda
    Spróbuj w obu ATmegach ustawić Mode0.
    Tu masz taki pliczek nagłówkowy, coby się nie mylić w kodzeniu SPI:
    Kod: text
    Zaloguj się, aby zobaczyć kod
  • #26 11053087
    pawgo2606
    Poziom 10  
    Jak ustawię Mode0 to mi głupoty przychodzą z ADS1256.
  • #27 11053123
    LordBlick
    VIP Zasłużony dla elektroda
    Co rozumiesz przez "głupoty" ?
    Jakim napięciem zasilasz cyfrową część przetwornika, a jakim µC master ?
  • #28 11053251
    janbernat
    Poziom 38  
    ADS1256 pracuje w mod1- widać to z DS str6.
    Dlaczego ATMega slave źle pracuje w mod1 to jest dziwne.
  • #29 11053272
    LordBlick
    VIP Zasłużony dla elektroda
    Z tego samego Datasheet wynika, że ADS na zasilaniu części cyfrowej może mieć max. 3,6V (Tabela ABSOLUTE MAXIMUM RATINGS s.2 ). Ja bym w "niewolniku" ATmega32 linię MISO ustawił na wejście i podciągnął 4,7kΩ do testów. A najlepiej wszystko cyfrowe zasilić z 3,3V.
  • #30 11053626
    pawgo2606
    Poziom 10  
    No tak zgadza się ze 3,6 max, ale wejścia obsługujące SPI (SCK, CS, DIN) można 5 zasilać.
    Sprawdziłem że DOUT ma na wyjściu 3,3. Czy to może mieć wpływ na odczyt danych z ADS?? Bo ze slave jest 5V MISO a tu 3,3??


    Taki mam kształt sygnału na linii MISO z ADS jeżeli slave ATmega nie podpięty

    [ATmega32] ATmega32 i ADS1256 - problem z obsługą SPI dla dwóch układów jednocześnie

    A taki jeżeli podpięty

    [ATmega32] ATmega32 i ADS1256 - problem z obsługą SPI dla dwóch układów jednocześnie

    Problem zatem tkwi w tych pikach na lini MISO pomiędzy masterem a ADS. Jak mogę się ich pozbyć teraz??
REKLAMA