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.

[ATMEGA48][BASCOM] Obsługa pamięci AT25F2048 - interfejs SPI

greg_matrix 09 Gru 2010 18:37 1304 2
  • #1 09 Gru 2010 18:37
    greg_matrix
    Poziom 16  

    Witam,
    Mam problem ze skomunikowaniem się z pamięcią AT25F2048 używającej interfejsu SPI. Stosuje interfejs SPI programowy.
    - Zasilanie mam 3,3V wspólne dla pamięci i procesora, wszystko jest porządnie wyfiltrowane (osobno na procku i pamieci).
    - Pamiec jest podlaczona bezposrednio do pinow procesora. Piny te nie sa uzywane do niczego innego. Linia SCK ma zapiety opornik 47k do masy.

    Docelowo do pamięci chciałbym zapisywać ciąg liczb a następnie odczytywać je wszystkie po kolei. Na początek chciałem zapisać cokolwiek a następnie dla sprzwdzenia to odczytać - problem w tym, że odczytuję cały czas liczbę zero.

    Fragment kodu:

    Code:

    $regfile = "m48def.dat"
    $crystal = 8000000
    $noramclear

    '--------- LINIE SPI -------------
    Config Pind.2 = Output                                      ' CS/
    Cs Alias Portd.2
    Config Pind.1 = Output                                      ' SO
    Config Pinc.5 = Input                                       ' SI
    Config Pinc.4 = Output                                      ' SCK

    Config Pinc.3 = Output                                      ' HOLD/
    Hold Alias Portc.3
    Config Pind.0 = Output                                      ' WP/
    Wp Alias Portd.0
    Set Hold                                                    'stan H - normalnie
    Set Wp                                                      'stan H - bez blokady
    '-----------------------------------
    '... zmienne
    '-----------------------------------
    Config Spi = Soft , Din = Portc.5 , Dout = Portd.1 , Ss = Portd.2 , Clock = Portc.4
    Spiinit
    '-----------------------------------
    Do
    Liczba=2
    Gosub Mruganie

    A = 5
    Spiout A , 1
    Spiin Liczba , 1
    Gosub Mruganie

    Loop
    End


    Podprogram 'Mruganie' wykonuje blyski za pomoca LED x(Liczba+1). W ten sposób widzę jaką wartość ma Liczba. Widzę sekwencje:
    x3 , x1 , x3 , x1 ...itd
    Czyli zmienna Liczba po odczycie z pamieci ma zawsze wartosc zero.

    Czyli na pewno coś robię nie tak. Jeśli ktoś wie co to proszę o pomoc, bo nie bardzo wiem gdzie szukac.
    Aha -mam do dyspozycji oscyloskop analogowy, sprawdzilem, ze w momencie kiedy jest zapis/odczyt do pamieci na jej liniach cos sie dzieje, wiec pamiec (chyba) cos tam robi...


    Z gory dzieki za udzial w dyskusji.

    Dodano po 4 [godziny] 8 [minuty]:

    Poczytałem trochę notę katalogową tej pamięci i widzę, że trzeba inaczej podejść do tematu. Przede wszystkim z noty katalogowej wynika, że z pamiecia trzeba sie komunikowac przez wyslanie odpowiedniej instrukcji a wtedy pamiec zwraca liczbe. W BASCOM, o ile sie nie myle, dokladnie to co trzeba powinna robic instrukcja Spimove.

    W nocie katalogowej jest lista dostepnych instrukcji wraz z kodami. Powiedzmy ze chce wyslac instrukcje "Read Manufacturer and Product ID" i zobaczyc co dostane w odpowiedzi. Jej kod to 0001X101, gdzie X to cokolwiek. Jesli wszystko zadziala tak jak trzeba to powinienem dostac w odpowiedzi 2 bajty: 1FH oraz 63H.

    Zrobiłem tak:
    Code:

    Const Rdid = &B00011101

    Instrukcja = Rdid
    Liczba = Spimove(instrukcja)
    Gosub Mruganie

    Podprogramik 'Mruganie' przerobiłem tak, ze teraz pokazuje kolejne bity zmiennej 'Liczba'. Niestety zmienna 'Liczba' zawiera same zera... Czy ktoś ma jakieś sugestie??

    0 2
  • #3 12 Gru 2010 16:04
    greg_matrix
    Poziom 16  

    Dzieki za zainteresowanie.
    Tylko ze pomyliles interfejsy - linia SDA wystepuje w I2C a moj problem dotyczy SPI.

    Aktualnie zrobilem nowa plytke drukowana do rozpracowania tego tematu. Przede wszystkim pamiec mam podlaczona do pinow SPI sprzetowego. Podlaczylem tez wyswietlacz LCD, zeby liczby ktore mnie interesuja po prostu wyswietlic. Wyprzedzając pytanie - wszyskie linie sa teraz podpiete przez oporniki szeregowe. Jak oscyloskopem ogladam co sie dzieje na liniach to widac, ze pamiec daje jakies odpowiedzi na rozkazy.

    Jesli ktos moglby mi podpowiedziec jak konkretnie powinny wygladac komendy obslugi pamieci w BASCOM? Chodzi mi o to, czy zapis:

    Code:
    Const Rdid = &B00011101 
    
    Instrukcja = Rdid
    Liczba = Spimove(instrukcja)

    jest poprawny, czy robie to dobrze??

    0