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

ATmega328 + AT24C32 jaka częstotliwość TWI [C] ?

jaros85 26 Sty 2012 22:22 1941 5
REKLAMA
  • #1 10453308
    jaros85
    Poziom 20  
    Witam
    Mam podłączony uC ATmega 328P z pamięcią EEPROM AT24C32.
    uC Taktowany jest zewnętrznym kwarcem 20MHz a jak wynika z not katalogowych AT24C32 max częstotliwość szyny SC (TWI) musi być 400kHz.

    Częstotliwość zmniejszam przez ustawienie preskalera:
    TWSR = (1<<TWPS0);
    TWBR = (1<<TWBR2)|(1<<TWBR0);


    Teoretycznie działa ale w swoim kodze sprawdzam czy na każdy wysyłany sygnał układ AT24C32 wysyła sygnał ACK.

    Problem jest tego typu że:
    Jak taktuje uC wewnętrznym zegarem 8MHz to EEPROM zawsze odsyłał prawidłowe ACK i prawidłowe dane.
    Jak taktuje uC kwarcem 20MHz i mam ustawiony preskaler jw. to mam błędy odpowiedzi ACK ale dane odczytywane z EEPROM-u są prawidłowe.

    W czym leży problem :?: Czy preskaler jest prawidłowo ustawiony bo z moich wyliczeń częstotliwość szyny SC wynosi około 350kHz :?:
  • REKLAMA
  • #2 10454007
    shg
    Poziom 35  
    Za duże rezystory podciągające, źle poprowadzone ścieżki. Oscyloskopem by trzeba obejrzeć.
  • REKLAMA
  • #3 10455170
    jaros85
    Poziom 20  
    Dzisiaj z mojego urządzenia wyciągnąłem uC i EEPROM i przełożyłem je do zestawu uruchomieniowego ZL2AVR i wszystko połączyłem na pająka.
    Cały czas ten sam efekt odczytać dane z EEPROM-u mogę tyle że nie odpowiada wcale sygnałami ACK.
    Rezystory podciągające 3,3kohm

    Wydaje mi się że problem leży po stronie częstotliwości szyny SC.
    Jak bym miał oscyloskop to już pewnie bym rozwiązał ten problem.
  • REKLAMA
  • #4 10455423
    kiziu13
    Poziom 17  
    Zaraz, coś mi tu nie pasuje. Kiedy masz błędy ACK? Z pierwszego postu wynikało, że nie odpowiadał ACK na adres, zaś z następnego, że przy odczycie nie odpowiadał. Na I2C to odbiorca odpowiada ACK, więc nie widzę powodu, dlaczego przy odczycie z EEPROMu, miałby on odpowiadać w jakimś innym momencie, niż porównanie własnego adresu i odczyt numeru komórki.
  • REKLAMA
  • #5 10466575
    jaros85
    Poziom 20  
    Według noty katalogowej AT24C32 odpowiada ACK przy odebraniu sygnału START, ADRES, itp.
    Układ AT24C32 zawsze mi odsyła zapisane w nim dane tyle że nie odpowiada przez ACK po wysłaniu adresu układu i adresu komórki którą chcę odczytać.

    Jak uC jest taktowany zegarem 8MHz to jak do AT24C32 wyślę jego adres i adres komórki to otrzymam ACK i dane z komórki o podanym adresie.

    Jak uC jest taktowany zegarem 20MHz to jak do AT24C32 wyślę jego adres i adres komórki to NIE otrzymam ACK i otrzymam dane z komórki o podanym adresie.

    Algorytmu nie zmieniam tylko zmieniam wartość częstotliwości #define F_CPU 8000000 i usuwam fragment kodu jak w pierwszym poście.

    Reszta pozostaje bez zmian i dlatego się pytam co w tym nie działa przecież nie jestem jedynym Polakiem który taktuje ATmege328 zegarem 20MHz i chce odczytać dane z AT24Cxxx. Sprawdzałem na pająka i nie jest to błąd poprowadzenia ścieżek.
  • #6 10502013
    jaros85
    Poziom 20  
    Udało mi się rozwiązać ten problem.
    Gdzieś wyczytałem że wartość rejestru TWRB powinna być większa niż 10.
    Dla mojego uC taktowanego zegarem 20MHz TWRB wynosi w zapisie dziesiętnym 17.

    Reasumując dla uC z zegarem 20MHz wystarczy dodać poniższą linijkę kodu:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    A nasza magistrala (szyna SC) będzie działać prawidłowo z zegarem równo 400kHz
REKLAMA