Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

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

Kubbaz 11 Paź 2016 15:06 984 8
  • #1 11 Paź 2016 15:06
    Kubbaz
    Poziom 26  

    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 (?)

    0 8
  • #2 11 Paź 2016 15:47
    2675900
    Użytkownik usunął konto  
  • #3 11 Paź 2016 15:58
    Kubbaz
    Poziom 26  

    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.

    0
  • #4 11 Paź 2016 16:03
    2675900
    Użytkownik usunął konto  
  • #5 11 Paź 2016 18:31
    Kubbaz
    Poziom 26  

    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.

    0
  • #6 11 Paź 2016 18:53
    grko
    Poziom 33  

    @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.

    0
  • #7 22 Paź 2016 17:03
    Kubbaz
    Poziom 26  

    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
    Zaloguj się, aby zobaczyć kod

    0
  • #8 22 Paź 2016 17:41
    2675900
    Użytkownik usunął konto