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

LPC4088 - Brak komunikacji z pamięcią NOR Flash S29GL064 pod arm-none-eabi-gcc

Badmaneq 23 Kwi 2014 11:01 1476 4
REKLAMA
  • #1 13534985
    Badmaneq
    Poziom 23  
    Posty: 567
    Pomógł: 76
    Ocena: 23
    Walczę od paru dni z komunikowaniem się LPC4088 z pamięcia nor flash S29GL064.
    Linie adresowe użyte do komunikacji to P4.1 - P4.22, czyli 21 linii podłączonych odpowiednio do linii adresowych A0 - A21 pamięci S29GL064.
    Co prawda mam przykładowy kod źródłowy, który działa pod Keil lecz pod arm-none-eabi-gcc brak komunikacji z pamięcią.
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Jak zdołałem się zorientować ze schematu makro
    #define ADDR_SHIFT(A)              (NOR_FLASH_START_ADDR + (2 * (A)))
    jest potrzebne na przesunięcie adresu ponieważ do linii adresowej A0 pamięci flash podpięta jest linia adresowa A1 (P4.1) LPC4088.
    Rozumiem, że odwołując się do adresu 0x90000001 kontroler EMC ustawi stan wysoki na P4.0, a ponieważ P4.0 nie jest podłączone do pamięci flash na jej liniach adresowych będzię nadal adres 0. Dlatego każdy adres należy pomnożyć przez 2. Poprawny tok myślenia ?

    Pola zmiennej NOR_ID zawsze po odczycie mają wartość 65535. Oczywiście jak ten program skompiluje pod Keil poprawnie odzczytuje dane zaszyte w pamięci flash.
    Funkcja dokonująca konfiguracji kontrolera pamięci jest funkcją biblioteczną od NXP i wygląda tak:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Ktoś domyśla się gdzie leży problem ?

    LPC4088 - Brak komunikacji z pamięcią NOR Flash S29GL064 pod arm-none-eabi-gcc LPC4088 - Brak komunikacji z pamięcią NOR Flash S29GL064 pod arm-none-eabi-gcc
  • REKLAMA
  • #2 13535100
    Freddie Chopin
    Specjalista - Mikrokontrolery
    Posty: 13336
    Pomógł: 1712
    Ocena: 870
    Badmaneq napisał:
    Jak zdołałem się zorientować ze schematu makro
    Kod:
    #define ADDR_SHIFT(A)              (NOR_FLASH_START_ADDR + (2 * (A)))
    jest potrzebne na przesunięcie adresu ponieważ do linii adresowej A0 pamięci flash podpięta jest linia adresowa A1 (P4.1) LPC4088.
    Rozumiem, że odwołując się do adresu 0x90000001 kontroler EMC ustawi stan wysoki na P4.0, a ponieważ P4.0 nie jest podłączone do pamięci flash na jej liniach adresowych będzię nadal adres 0. Dlatego każdy adres należy pomnożyć przez 2. Poprawny tok myślenia ?

    Bardziej rozchodzi się o to, że komórki pamięci są adresowane jako pola 16-bitowe i nie jest możliwe odwołanie się do pojedynczego bajtu. Nie da się więc odczytać adresu kończącego się liczbą nieparzystą, trzeba odczytać parę bajtów, których adres kończy się liczbą parzystą.

    4\/3!!
  • REKLAMA
  • #3 13536118
    Badmaneq
    Poziom 23  
    Posty: 567
    Pomógł: 76
    Ocena: 23
    Napisałem sobie własną funkcję do konfiguracji kontrolera pamięci, która w Keil działa natomiast skompilowanie jej pod arm-none-eabi-gcc powoduję brak komunikacji z pamięcią

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Co jest grane ?
    Może ktoś miał do styczność z EMC w LPC1788 i podzieli się wiedzą...
  • REKLAMA
  • #5 13537648
    Badmaneq
    Poziom 23  
    Posty: 567
    Pomógł: 76
    Ocena: 23
    Akurat przykład mam od producenta modułu. Kompilacja odbywa się bez ostrzeżeń. Patrząc na kod z linku konfiguracja jest ok. Pozostaje jeszcze sprawdzić analizatorem czy są zmiany na CS1. Ewentualnie dla pewności zmienić typ short na uint16t.

    Sprawdziłem CS1 zmienia stan, zmiana na uint16_t nie pomogła. Na razie w tym kierunku poddaje się :)

    W końcu znaleziona przyczyna: brak ustawionego bitu EMCSC w rejestrze SCS.
    Brakowało tylko lub aż
    LPC_SC->SCS |= (1<<0);
REKLAMA