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

[Rozwiązano] LPC1769 24LC64 - LPCXpresso LPC1769 + EEPROM 24LC64 - błąd odczytu / zapisu (?)

Kubbaz 11 Paź 2016 15:06 1491 8
REKLAMA
  • #1 15987791
    Kubbaz
    Poziom 26  
    Posty: 1237
    Pomógł: 9
    Ocena: 30
    Witam wszystkich Elektrodowiczów,
    Przestudiowałęm manual blou I2C mikrokontrolera LPC1769 (UM 10360), dokumentację pamięci EEPROM Microchip i schemat płytki LPCXpresso LPC1769 Rev.D.
    Napisałem prosty kod w C, który wykonuje komunikację z pamięcią EEPROM (zapisuje jeden bajt i odczytuje jeden bajt).

    Do zapisu jednego bajtu wysyłam bajty przez I2C:
    1. I2C START CONDITION (to nie jest bajt)
    2. 0xA0 (Control Byte + Write bit: 1010 0000)
    3. 0x00 (Byte Address High Byte - MSB: 0000 0000)
    4. 0x00 (Byte Address Low Byte - LSB: 0000 0000)
    5. 0xAA (Data byte value: 1010 1010)
    6. I2C STOP CONDITION (to nie jest bajt)

    i otrzymuję wartości rejestru Statusu magistrali I2C jak poniżej:
    1. 0x08 (START CONDITION has been sent)
    2. 0x18 (Slave Address and Write bit has been sent - Control Byte + Write bit)
    3. 0x28 (Data in I2DAT has been transmitted - Byte Address High Byte - MSB)
    4. 0x28 (Data in I2DAT has been transmitted - Byte Address Low Byte - LSB)
    5. 0x28 (Data in I2DAT has been transmitted - Data byte value)

    Oscyloskop pokazuje linie I2C (SDA i SCL). Ich wartości wydają się poprawne (zgodnie z wysyłanymi wartościami bajtów)

    Do odczytu jednego bajtu z pamięci EEPROM wysyłam bajty przez I2C:
    1. I2C START CONDITION (to nie jest bajt)
    2. 0xA0 (Control Byte + Write bit: 1010 0000)
    3. 0x00 (Byte Address High Byte - MSB: 0000 0000)
    4. 0x00 (Byte Address Low Byte - LSB: 0000 0000)
    5. I2C START CONDITION (to nie jest bajt)
    5. 0xA1 (Control Byte + Read bit: 1010 0001)
    -- Here I get/read byte from I2DAT register
    6. I2C STOP CONDITION (to nie jest bajt)

    i otrzymuję wartości rejestru Statusu magistrali I2C jak poniżej:
    1. 0x08 (START CONDITION has been sent)
    2. 0x18 (Data in I2DAT has been transmitted - Byte Address High Byte - MSB)
    3. 0x28 (Data in I2DAT has been transmitted - Byte Address High Byte - LSB)
    4. 0x08 (START CONDITION has been sent)
    5. 0x40 (Slave Addres and Read bit has been sent - Control Byte + Read bit)
    6. 0x58 (Data byte value has been received)

    Oscyloskop pokazuje linie I2C (SDA i SCL). Ich wartości wydają się poprawne (zgodnie z wysyłanymi wartościami bajtów),
    ale niestety odbierany (ostatni bajt na przebiegu) bajt - rejestr I2DAT - jest o wartości 0xFF - a przecież zapisywany wcześniej był bajt
    o wartości 0xAA, zatem coś jest nie tak.

    Będę bardzo wdzięczny za pomoc.

    Poniżej przesyłam zrzuty ekranu oscyloskopu na liniach SDA i SCL I2C (pierwszy screen to zapis bajtu, drugi to odczyt bajtu).

    LPC1769 24LC64 - LPCXpresso LPC1769 + EEPROM 24LC64 - błąd odczytu / zapisu (?)
    LPC1769 24LC64 - LPCXpresso LPC1769 + EEPROM 24LC64 - błąd odczytu / zapisu (?)
  • REKLAMA
  • #2 15987878
    Konto nie istnieje
    Konto nie istnieje  
  • REKLAMA
  • #3 15987891
    Kubbaz
    Poziom 26  
    Posty: 1237
    Pomógł: 9
    Ocena: 30
    Piotrus_999 napisał:
    Sekwencja czytania wykláda nie tak jak powinna (oscylogram - bo ostatni zegar jest rozciągnięty). Pewnie dlatego że nie ma nack - po przeczytaniu. Niewątpliwie odbierasz 0xff.

    No właśnie ten ostatni cykl zegarowy w odczycie wartości bajtu z pamięci EEPROM (drugi/dolny screen) też mi się nie podoba...
    Co może być przyczyną braku bitu notAcknowledge i w którym miejscu?

    Piotrus_999 napisał:
    Inne trudno zobaczyć jako że jest to strasznie ściśnięte.

    Inaczej trudno zmieścić całą sekwencję zapisu/odczytu na jednym oscylogramie.
    Ale zrzut z oscyloskopu 800 x 480 pix, to nie jest tak źle ;).

    Piotrus_999 napisał:
    WP podłączony jak należy?

    Wg schematu płytki PCB LPCXpresso LPC1769 Rev.D 2015 NXP Embedded Artists - do GND.
  • #4 15987909
    Konto nie istnieje
    Konto nie istnieje  
  • REKLAMA
  • #5 15988243
    Kubbaz
    Poziom 26  
    Posty: 1237
    Pomógł: 9
    Ocena: 30
    Tak na szybko. Coś zauważyłem na oscylogramie sekwencji odczytu wartości bajtu z pamięci EEPROM.
    Otóż pierwszy widoczny bajt to 0xA0 (Control Byte + Write bit (0))
    Tu ACK
    Drugi bajt to 0x00 (Address High Byte)
    Tu ACK
    Trzeci bajt to coś dziwnego na kształt 0xA1 (Control Byte + Read bit (1))
    Tu ACK
    Czwarty bajt to 0xFF
    Piąty bajt (prawie bajt) to znowu coś dziwnego z przeciągniętym sygnałem zegarowym...

    To zupełnie coś innego, niż bym chciał/niż teoretycznie wysyłam w przerwaniu.
    Muszę przejrzeć krok po kroku co dzieje się w przerwaniu i jaki status zgłasza kontroler I2C.
  • REKLAMA
  • #6 15988299
    grko
    Poziom 33  
    Posty: 1386
    Pomógł: 247
    Ocena: 141
    @Kubbaz Pokaż kod w którym dokonujesz operacji odczytu.

    Cytat:

    Większość eeoromów pamieta ostatni adres - tak że mozesz spróbowac przeczytac bez wysyłania adresu komórki - spróbuj.


    Większość pamięci EEPROM to ma auto-inkrementację adresu więc to co piszesz ma średnie szanse na działanie.
  • #7 16011532
    Kubbaz
    Poziom 26  
    Posty: 1237
    Pomógł: 9
    Ocena: 30
    Witam po krótkiej przerwie,

    Otóż sprawdziłem kilka rzeczy na linii program-sprzęt.
    Jak się wcześniej okazało, odczytuję poprawnie z magistrali I2C statusy pamięci EEPROM (0x08 0x18 0x28 0x08 0x40 0x58) - przy odczycie wartości bajtu z pamięci EEPROM, ale fizyczny przebieg sygnału na linii SDA jest zły.

    Po kilku różnych próbach zidentyfikowania problemu okazało się, że gubiony jest bajt LSB addresu odczytywanego bajtu z pamięci EEPROM i potem zaczyna się walić...: LPC1769 24LC64 - LPCXpresso LPC1769 + EEPROM 24LC64 - błąd odczytu / zapisu (?)

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • #8 16011614
    Konto nie istnieje
    Konto nie istnieje  

Podsumowanie tematu

✨ Użytkownik zadał pytanie dotyczące problemów z odczytem i zapisem danych z pamięci EEPROM 24LC64 przy użyciu mikrokontrolera LPC1769 przez interfejs I2C. Po analizie sekwencji komunikacji, zauważono, że brak bitu notAcknowledge (NACK) oraz nieprawidłowy przebieg sygnału na linii SDA mogą być przyczyną problemów. Użytkownicy zasugerowali poprawną sekwencję odczytu oraz zwrócili uwagę na auto-inkrementację adresu w EEPROM. Po wielu próbach, użytkownik potwierdził, że udało mu się zrealizować zapis i odczyt z EEPROM na płytce EVALA.
Wygenerowane przez model językowy.
REKLAMA