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

ATMega128 i SPI...problem z CLK

krychajk 19 Mar 2009 01:04 2720 13
  • #1 6301569
    krychajk
    Poziom 9  
    Witam.

    Mam taki problem...komunikuje sę przy pomocy ATM128 z 3ma czujnikami akcelerometrycznymi po SPI. Przynajmniej próbuję...

    problem jest mianowicie taki: tak jak to bywa z SPI (tak mi się wydaje) sygnały MISO, MOSI oraz CLK dla tych trzech czujników podpinam wspólnie. wybór układu do odczytu powinien się odbywać poprzez odpowiednie ustawienie na lini Chip Select konkretnego czujnika. I tak robie...i kicha.
    Zauważyłem jednak taką zasadność, że MISO i MOSI mogą być wspólne, natomiast konieczne od układów nie czytanych jest odłączenie sygnału CLK aby odczyt z czytanego czujnika był poprawny. Czy to jest norma?

    Nieco inaczej zadam opisze problem...czujnik z Chip Selectem podniesionym, na wspolnych liniach MISO, MOSI oraz CLK powinien milczeć prawda? Natomiast nie wiedzieć dlaczego mój układ próbuje żyć i zakłóca. Choć porównując odpowiedz czujnika żywego, odpowiedz "cichego" i wynik złożenia tych sygnałów - zupełnie jest on dla mnie nie zrozumiały (na linii powstała jakaś nie znana operacja logiczna, ani AND, ani OR ani inne z mi znanych).

    Aby uciec od tego problemu chciałbym dać CLK oddzielny dla każdego z czujników...jednak ATM128 posiada tylko jeden SPI ze swoim CLK...czy można CLK bezkarnie "sklonować" na inny pin?

    pozdrawiam
  • Pomocny post
    #2 6301629
    Konto nie istnieje
    Poziom 1  
  • #3 6301792
    krychajk
    Poziom 9  
    zwarcie wydaje mi się być funkcją OR lub AND, a to ewidentnie nie jest OR/AND (3Ah-operacja-7Fh=30h). Nie ważne, to taka dygresja.

    Czujnik to LIS3LV02DQ - 3 osiowy od ST, ale dzięki za sugestię.

    Co do zwielokrotnienia MISO. Nie próbowałem tego ale wydaje mi się że tu byłby większy problem od zwielokrotnienia CLK. zegarów programowych w ATM128 mam więcej, natomiast rejestr SPDR jest tylko jeden. Jest to rejestr przesuwny tak więc coś wysyłam, coś odbieram w tym samym czasie przy pomocy tego jednego rejestru. Chyba że w ten sam sposób można wykorzystać inny rejestr?

    Sugestia o działaniu potokowym całkiem przyjemna, ale mam wątpliwości czy realizowalna tak prosto. Robiłeś to?

    Pozdrawiam.
  • #4 6301848
    arturt134
    Poziom 27  
    A może czujniki zaprojektowano tak, aby pracowały w połączeniu daisy-chaining, czyli wejście 1 jest dołączone do twego wyjścia, wyjście 1 jest dołączone do wejścia 2, wyjście 2 do wejścia 3, a wyjście 3 do twego wejścia.
    Poczytaj datasheet, albo daj link, to zobaczymy.

    Dodano po 29 [minuty]:

    Dopiero teraz zobaczyłem, że podałeś typ...
    CS jest nie tylko CS-em, ale także sygnałem wybierającym intrerfejs. Jeżeli CS=1, to wybrany jest interfejs I2C, więc układ nie jest nieaktywny...
    Ja na twoim miejscu dałbym dodatkową bramkę NAND (wyjście do CLK przetwornika, na wejścia CS i CLK z uC). Wtedy przetwornik dostawałby zegarek tylko gdy CS jest niski.
  • #5 6302715
    Konto nie istnieje
    Poziom 1  
  • #6 6303581
    kemot55
    Poziom 31  
    Czy na 9 nodze układu przy sygnale CLK i CS=1 masz jakąś transmisję danych ?
    Z tego co napisali w DS to powinna być wysoka impedancja. Czym oglądasz sygnał wyjściowy (oscyloskop czy inny wynalazek).
  • #7 6305745
    krychajk
    Poziom 9  
    dzięki za zainteresowanie. W omawianym przypadku sprawdzałem za każdym rejestr who_am_i...aby porównywać wartość katalogową.

    programowo spi nie bardzo chce robić ponieważ jest to praca "naukowa" więc wole bez fuszery, no chyba że ostatecznie by pomogło w problemie opisanym...poniżej.

    Podkreślam że problem jest jedynie wtedy kiedy próbuję czytać 2 oraz 3 czujniki. Dla czytania pojedynczego czujnika nie ma takich problemów. co do operatora Z....to nie jest operator zwarcie tylko operator wysokiej impedancji. Taki jakby stan nieustalony na tranzystorze gdy nie podepnie mu się odpowiednio rezystora.

    Rozwiązanie z bramką NAND też ciekawe lecz raczej nie w tym przypadku. o jakim przetworniku myślisz? CLK, CS z uC to wyjścia, nie wejścia.

    A teraz problem wspomniany powyżej...sprawa rozbija się o coś zupełnie innego. Te zakłócenia są związane z impedancją falową. Jest to związane z teorią fali długiej. Niestety SPI wydaje się jest zaprojektowany jedynie do transmisji pomiędzy elementami na płytce drukowanej. Efekt ten zależy też od samego wykonania układu z czujnikiem, wykorzystanych elementów a także linii transmisyjnej (przewodu - zauważyłem to, próbując na polskim wyrobie i porównując z chińskim FLATem...o dziwo lepiej spisuje się na chińszczyźnie).

    Tak więc zmiana orientacji pytania. Co zrobić aby odfiltrować efekt linii długiej w tym przypadku? Zaznaczę, że faktycznie na krótszych przewodach...wszystko działa pięknie bez jakichkolwiek klonowań i innej żonglerki a jedynie żądanie odpowiedzi od konkretnego czujnika przy pomocy odpowiadającej linii CS.
    Próbowałem już podwieszania rezystorów na kanałach wejściowych przy czujniku i bez efektu.
    Dostałem sugestię o zastosowaniu multiplexerów analogowych dla linii MOSI oraz CLK ale to się wydaje rozwiązaniem "poratuj Panie". No i znacznie komplikuje cały system.

    jakieś sugestie?

    pozdrawiam!
  • #8 6306200
    arturt134
    Poziom 27  
    Schemat podłączenia z bramką masz na obrazku:
    ATMega128 i SPI...problem z CLK

    Jak długą masz linię? SPI nie nadaje się do transmisji sygnału na duże odległości, co najwyżej kilkadziesiąt centymetrów, powiedzmy do 1 metra.
    Przy liniach długich pomyśl o innym interfejsie.
    Przy niezbyt dużych długościach daj terminację na końcach linii. Dwa rezystory, ok 50R...100R wstawione szeregowo w linię blisko jej końców.
    I obniż prędkość transmisji. Im mniejsza prędkość, tym lepiej będzie taka linia działać.
  • #9 6306358
    krychajk
    Poziom 9  
    próbuję zrobić właśnie tak 3x1m. chodzi o to by czujniki umieścić na nogach i badać parametry przyspieszeń w poszczególnych odcinkach. inny interfejs tutaj możliwy to tylko I2C a on chyba też nie jest jakoś na specjalnie dłuższe odcinki? po za tym jest strasznie pamięciożerny. prędkość mam maxymalnie niską. Natomiast co do terminanicji...a to nie dodaje kolejnego oporu do impedancji falowej? wiem że terminancje stosuje się w CAN na zaznaczenie końca magistrali ale tutaj...? mógłbyś mi to wyjaśnić?

    Dzięki za rusynek...jak się przyjżałem zrozumiałem o co chodzi z tym NAND. w sumie dobre rozwiązanie. pojade dziś po bramki i wyprobuję.

    pozdrawiam
  • #10 6306383
    arturt134
    Poziom 27  
    Terminacja pomaga przy długich przewodach, bo zmniejsza odbicia od końca linii, czyli zmniejsza tzw. "dzwonienie" linii. Wzrostu impedancji linii bym się nie bał, sygnał i tak jest napięciowy a nie prądowy.
    Przy przewodzie 3m może pomóc. Bramkę NAND dałbym przy uC, bo wtedy jednym układem 7400 możesz załatwić 3 CS-y do 3 czujników.
  • #11 6306603
    Konto nie istnieje
    Poziom 1  
  • #12 6306631
    krychajk
    Poziom 9  
    program dla I2C dużo zajmuje. nie wiem dlaczego.

    co do bramki, rozrysowałem sygnały i to powinno być nie NAND, tylko chyba AND z zanegowanym jednym wejściem (dla CS). są takie układy czy należy zrobić AND + inwertery?
  • Pomocny post
    #13 6306690
    arturt134
    Poziom 27  
    No tak, masz rację, trochę się pośpieszyłem z tym NAND-em. AND + inwerter na CS. Jeżeli masz wolne piny w kontrolerze, to możesz też wystawiać CS i CS zanegowany, do sterowania AND-em.
  • #14 6311109
    krychajk
    Poziom 9  
    dodalem terminatory na przewodach na końcach linii cyfrowych (100R) i faktycznie własności się poprawiły. jeszcze nie jest idealne ale użyłem kabli które także wyrażnie mają dużą własną impedancję (sądziłem że polskie lepiej dadzą rade od chińszczyzny).

    co do układu z logiką...też go wykonałem jednak zadziałał jedynie na jedno uruchomienie i chyba się coś zwarło...tak to jest robiąc na płytkach uniwersalnych ;-). w każdym bądź razie zastosuje taki trik już na układzie końcowym który będę projektował. Dzięki raz jeszcze za wszelką pomoc!
REKLAMA