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

Atmega: Jak zaimplementować programowy I2C Slave w C?

mhyjek 14 Kwi 2007 15:54 3911 6
REKLAMA
  • #1 3786940
    mhyjek
    Poziom 13  
    Posty: 127
    Pomógł: 1
    Ocena: 8
    witam.
    poszukuje zrodel jak w temacie.
    wiem ze jest doc atmela ze zrodlami w asm ale niestety nie znam assemblera na avr i nie dok konca rozumiem te zrodla. sporo szukalem po sieci ale nie znalazlem wiele w temacie slave'a.
  • REKLAMA
  • #2 3787977
    przemek20
    Poziom 21  
    Posty: 328
    Pomógł: 41
    Ocena: 25
    Proponuję poczytac opis i2c umieszczany na przyklad w datasheetach philipsa dotyczących układów i2c i na tej podstawie napisać własną obsługę.I2c jest naprawdę bardzo proste.
    Pozdrawiam.
  • REKLAMA
  • #3 3788001
    mhyjek
    Poziom 13  
    Posty: 127
    Pomógł: 1
    Ocena: 8
    no tak od strony master'a nie mam problemow, ale jakos nie moge sobie poradzic z obsluga od strony slave. chodzi mi o sluchanie, mam male klopociki z obsluga transmisji na przerwaniach i ew. kod moglby mi troche wyjasnic...
  • REKLAMA
  • #4 3788317
    przemek20
    Poziom 21  
    Posty: 328
    Pomógł: 41
    Ocena: 25
    Może napisz co już zrobiles i na czym polega problem to będzie prościej pomóc.
    Pozdrawiam.
  • REKLAMA
  • #5 3795223
    mhyjek
    Poziom 13  
    Posty: 127
    Pomógł: 1
    Ocena: 8
    no problem polega na tym ze wykorzystujac petele potrafie odebierac transmisje z mastera. przy takim rozwiazaniu rzecz jasna nie mam czasu zeby zajac sie obsluga np. LCD. sama zasade magistrali i2c znam i rozumiem, ale niebardzo potrafie to zaimplementowac na przerwaniach w upc. wynika to napewno z malej wiedzy o mikrokontrolerach ale zaczynam programowac upc.

    na poczatek moze ktos zechcialby odpowiedziec mi na pare pytan odnoscie kodu AVR302 (http://www.avrfreaks.net/index.php?module=Freaks%20Tools&func=viewItem&item_id=77)

    1. po resecie konfigurowany jest port i przerwania (opadajace zbocze INT0 i T0)...
    2. pozniej w petli oczekiwanie na stan wysoki na SCL/SDA
    i pierwszy warunek startu (SCL->h / SDA->l), jesli nastapil warunek startu
    wlaczane sa przerwania i wykonywana jest obsluga przerwania INT0.
    w obsludze przerwania INT0 odbierana jest transmisja...
    (najpierw adres - potwierdzenie od slave - potem dane i warunek stop)

    no zasada jest chyba jasna choc nie jestem do konca pewien kolejnosci no i mam problem z ugryzieniem T0(SCL) w tym przykladzie.

    no i najwazniejsze prosze sie nie wyzywac na mnie bo zaczynam programowac upc i gdybym wszystko wiedzial to by mnie tu nie bylo, wiec jesli ktos ma ochote pomoc to bede wdzieczny.
  • #6 3795344
    Baca
    Poziom 14  
    Posty: 65
    Pomógł: 2
    Ocena: 2
    w atmega i2c nazywa sie troszke inaczej poczytaj o TWI jest tego pelno nawet w manualu do atmegi (np 128) sa przyklady zazwyczaj w asm i c wystarczy sciagnac pelny datasheet do procka pozatym nie powinno byc problemu z obsluga w trybie slave poniewaz atmega ma ten interface rozwiazany hardwerowo wiec obsluga jest dosc uproszczona ( atmegi ktore maja TWI sa na stronie atmela wystarczy zobaczyc do tabelki)
  • #7 3797080
    mhyjek
    Poziom 13  
    Posty: 127
    Pomógł: 1
    Ocena: 8
    baca wiem o wsparciu sprzetowym i o TWI. Manuali jest duzo (w tym slave) wlasnie pod sprzetowe TWI a mi chodzi o programowe. w sumie to troche skopalem temat, bo powinienem napisac "avr 2313" (at90s2313/attiny2313) ale tak wyszlo bo dostepna mam plyte ewaluacyjna z atmega32 ale docelowo soft mialby siedziec na 2313 a tam nie ma sprzetowego wsparcia dla TWI, pozatym standardowe i2c ma byc wzbogacone o dodatkowe dwa "przewody". sama transmisja od startu do stopu jest po two-wire ale sam warunek startu powiazany bedzie z dodatkowymi 2 sygnalami (podobnie warunek stopu).

    Poczytalem troche i podumalem, potrzebuje zeby ktos madrzejszy ode mnie w temacie potwierdzil ew. skorygowal moje wypociny

    1. konfiguruje port dla TWI na wejscie.
    2. konfiguruje SDA(INT0) na opadajace zbocze i wlaczam przerwanie
    3. po wyzwoleniu przerwania INT0 sprawdzam stan SCL (T0)
    4. jesli jest stan wysoki jest warunek startu
    5. wylaczam przerwanie na SDA (?), konfiguruje SCL(T0) na narastajace zbocze i wlaczam przerwanie
    6. po wyzwoleniu przerwania SCL(T0) sprawdzam stan SDA(INT0) jesli wysoki to mamy bit MSB
    i zaczynamy odbierac 7 bitowy adres slave
    7. po kazdym wyzwoleniu przerwania na narastajacym zboczu SCL(T0) sprawdzam stan SDA(INT0)
    przepisuje do bufora i przesuwam bity w lewo
    8. po odebraniu ostatniego bitu adresu przytrzymuje SCL w stanie niskim,
    sprawdzam adres slave i wysylam potwierdzenie - SDA w stan wysoki
    i zwalniam SCL.
    9. odbieram dane (8bitow) podobnie jak w pkt 6-8, po kazdych 8 bitach 9 bit ACK
    10. po wyzwoleniu przerwania SCL (T0) odczytuje stan SDA(INT0)
    wysoki warunek stopu - do pkt. 2, niski warunek ponownego startu przechodze do pkt. 9

Podsumowanie tematu

✨ Dyskusja dotyczy implementacji programowego I2C Slave w języku C na mikrokontrolerach AVR, zwłaszcza na modelach bez sprzętowego wsparcia TWI, takich jak at90s2313/attiny2313. Autor poszukuje źródeł i przykładów, gdyż dostępne przykłady w asemblerze są dla niego trudne do zrozumienia. Poruszono kwestie obsługi transmisji I2C w trybie slave z wykorzystaniem przerwań, zwłaszcza problem synchronizacji sygnałów SCL i SDA oraz wykrywania warunków startu i stopu magistrali. Zwrócono uwagę, że w mikrokontrolerach Atmega z wbudowanym TWI obsługa I2C jest uproszczona dzięki sprzętowemu interfejsowi, jednak autor potrzebuje rozwiązania programowego dla układów bez TWI. Wskazano na konieczność konfiguracji portów i przerwań (np. INT0 na opadające zbocze dla SDA, T0 dla SCL) oraz na wyzwania związane z obsługą transmisji w pętli i na przerwaniach, aby umożliwić jednoczesną obsługę innych urządzeń, np. LCD. Dyskusja zawiera również odniesienia do dokumentacji Atmel (np. AVR302) i datasheetów Philipsa dotyczących I2C.
Wygenerowane przez model językowy.
REKLAMA