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

[Mega16][Bascom] obsługa 45DB011B

Jazzstar 30 Cze 2009 19:35 2098 4
REKLAMA
  • #1 6723039
    Jazzstar
    Poziom 13  
    Witam.
    Mógłby ktoś podać fragment kodu w bascomie do zapisu i odczytu tej pamięci po SPI? Szukałem (może niedokładnie) na forum ale nie znalazłem nic konkretnego.
  • REKLAMA
  • #2 6734599
    gothye
    Poziom 33  
    google naprawde nie gryzie :

    $regfile = "m128def.dat"
    $crystal = 14745000
    $baud = 115200                                              'set the baud rate for the first hardware UART.
    $baud1 = 9600                                               'set the baud rate for the second hardware UART.
    
    Config Com1 = Dummy , Synchrone = 0 , Parity = None , Stopbits = 1 , Databits = 8 , Clockpol = 0
    Config Com2 = Dummy , Synchrone = 0 , Parity = None , Stopbits = 1 , Databits = 8 , Clockpol = 0
    Open "com2:" For Binary As #1                               'Open device
    
    Config Lcd = 16 * 2
    Config Lcdpin = Pin , Db4 = Porta.4 , Db5 = Porta.5 , Db6 = Porta.6 , Db7 = Porta.7 , E = Porta.3 , Rs = Porta.2
    Cursor Off
    
    Declare Sub Zap_eeprom(byval Adres As Long , Byval Dana As Byte)       'procedura zapisu danej do pamieci
    Declare Sub Odc_eeprom(byval Adres As Long , Dana As Byte)  'procedura odczytu danej z pamieci
    
    
    Config Spi = Hard , Master = Yes , Data Order = Msb , Polarity = High , Clockrate = 4
    
    Dim Adres As Long                                           'zmienna adresu komorki pamieci
    Dim Dana As Byte                                            'zmienna zmienna na odczytana lub zapisana dana do pamieci
    Dim I As Long                                               'zmienna licznikowa
    Dim Temp As Byte                                            'zmienna pomocnicza
    Dim Temp1 As Byte                                           'zmienna pomocnicza
    Dim Temp2 As Byte                                           'zmienna pomocnicza
    Dim Temp3 As Byte                                           'zmienna pomocnicza
    Dim Zm_pom As Word                                          'zmienna pomocnicza
    Dim Temp4 As Long                                           'zmienna pomocnicza
    Dim J As Byte                                               'zmienna licznikowa
    
    Sck Alias Portb.1                                           'przypisanie nazwie Portb.5 aliasu Sk
    Dana = 3
    
    Spiinit                                                     'inicjacja interfejsu SPI
    'Reset Sck                                                   'zerowanie linii Sck
    Print "Zapis"                                               'wyslanie do terminala tekstu
    
    J = 0                                                       'wyzerowanie zmiennej J
    For I = 0 To 50                                             'petla wykonywana dla I=0 do I=135167
      Call Zap_eeprom(i , J)                                    'zapis do EEPROM wartosci zmiennej I pod adres wskazywany przez I
      Print J                                                   'wyslanie do terminala wartosci zapisywanej do EEPROM w postaci szesnastkowej
      Incr J                                                    'zwiekszenie o jeden wartosci J
    Next I                                                      'zwiekszenie o 1 wartosci I
    
    Print "Odczyt i weryfikacja"                                'wyslanie do terminala tekstu
    J = 0                                                       'wyzerowanie zmiennej J
    For I = 0 To 50                                            'petla wykonywana dla I=0 do I=135167
      Call Odc_eeprom(i , Dana)                                 'odczytanie z EEPROM wartosc z komorki o adresie wskazywanym przez I
    
      If Dana = 3 Then                                          '--weryfikacja danych-- jesli Dana = I to
        Print Dana ; " ";                                       'wyslanie do terminala odczytanej wartosci z pamieci w postaci szesnastkowej
      Else                                                      'w przeciwnym razie
        Print "Dane nieprawidlowe" ; Dana                       'wyslanie do terminala tekstu
    
       ' Exit For                                                'opuszczenie petli For
      End If
      Incr J                                                    'wyzerowanie zmiennej J
    Next I                                                      'zwiekszenie o 1 wartosci I
    End                                                         'koniec programu
    
    Sub Zap_eeprom(byval Adres As Long , Byval Dana As Byte)    'procedura zapisu danej do EEPROM
      Temp4 = Adres / 264                                       'obliczenie adresu strony
      Zm_pom = Temp4                                            'przepisanie adresu strony
      Temp1 = 0                                                 'wyzerowanie Temp1
      Temp1.1 = Zm_pom.8                                        'zapis do bitu 1 zmiennej Temp1 bitu 8 zmiennej Zm_pom
      Temp1.0 = Zm_pom.7                                        'zapis do bitu 0 zmiennej Temp1 bitu 7 zmiennej Zm_pom
      Adres = Adres Mod 264                                     'obliczenie adresu w stronie
      Shift Zm_pom , Left , 1                                   'przesuniecie wartosci w zm_pom o jedna pozycje w lewo (mnozenie przez 2)
      Temp2 = Low(zm_pom)                                       'przepisanie do Temp2 mniej znaczacej wartosci zmiennej zm_pom
      Temp2.0 = Adres.8                                         'zapis do bitu 0 zmiennej Temp2 bitu 8 zmiennej Adres
      Zm_pom = Adres                                            'przepisanie wartosci z Adres do Zm_pom
      Temp3 = Zm_pom                                            'przepisanie wartosci z zm_pom do Temp3
    '  Set Sck                                                   'ustawienie linii Sck
    
      Temp = &H53                                               'kod rozkazu odczytu strony do bufora pamieci
      Spiout Temp , 1                                           'wyslanie rozkazu
      Spiout Temp1 , 1                                          'wyslanie adresu
      Spiout Temp2 , 1                                          'wyslanie adresu
      Spiout Temp3 , 1                                          'wyslanie adresu
    
      Delay                                                     'opoznienie
    '  Set Sck                                                   'ustawienie linii Sck
    
      Temp = &H82                                               'kod rozkazu zapisu strony do pamieci EEPROM (poprzez bufor)
      Spiout Temp , 1                                           'wyslanie rozkazu
      Spiout Temp1 , 1                                          'wyslanie adresu
      Spiout Temp2 , 1                                          'wyslanie adresu
      Spiout Temp3 , 1                                          'wyslanie adresu
      Spiout Dana , 1                                           'wyslanie zapisywanej danej
    
      Waitms 28                                                 'opoznienie 28 ms
    End Sub                                                     'koniec procedury
    
    Sub Odc_eeprom(byval Adres As Long , Dana As Byte)          'procedura odczytu danej do EEPROM
      Temp4 = Adres / 264                                       'obliczenie adresu strony
      Zm_pom = Temp4                                            'przepisanie adresu strony
      Temp1 = 0                                                 'wyzerowanie Temp1
      Temp1.1 = Zm_pom.8                                        'zapis do bitu 1 zmiennej Temp1 bitu 8 zmiennej Zm_pom
      Temp1.0 = Zm_pom.7                                        'zapis do bitu 0 zmiennej Temp1 bitu 7 zmiennej Zm_pom
      Adres = Adres Mod 264                                     'obliczenie adresu w stronie
      Shift Zm_pom , Left , 1                                   'przesuniecie wartosci w zm_pom o jedna pozycje w lewo (mnozenie przez 2)
      Temp2 = Low(zm_pom)                                       'przepisanie do Temp2 mniej znaczacej wartosci zmiennej zm_pom
      Temp2.0 = Adres.8                                         'zapis do bitu 0 zmiennej Temp2 bitu 8 zmiennej Adres
      Zm_pom = Adres                                            'przepisanie wartosci z Adres do Zm_pom
      Temp3 = Zm_pom                                            'przepisanie wartosci z zm_pom do Temp3
    '  Reset Sck                                                 'zerowanie linii Sck
      Temp = &H52                                               'kod rozkazu odczytania danej z pamieci pod wybranym adresem
      Spiout Temp , 1                                           'wyslanie rozkazu
      Spiout Temp1 , 1                                          'wyslanie adresu
      Spiout Temp2 , 1                                          'wyslanie adresu
      Spiout Temp3 , 1                                          'wyslanie adresu
      Temp = 0                                                  'zrowanie wartosci Temp
      Spiout Temp , 4                                           'wyslanie 4 bajtow o wartosci 0
      Spiin Dana , 1                                            'odczyt danej z pamieci EEPROM
    
    End Sub                                                     'koniec procedury                                                'koniec procedury
  • REKLAMA
  • #3 6735190
    Jazzstar
    Poziom 13  
    Niestety to nie działa, cały czas czyta wartość 255.
  • REKLAMA
  • #4 7467209
    jaroslawk
    Poziom 21  
    Witam,
    Przyłączam się do pytania autora postu. Czy ktoś posiada działającą procedurę zapisu i odczytu dla AT45DB161 lub AT45DB321.
  • #5 9125978
    rav013
    Poziom 10  
    Znalazłem (w C) nie pamiętam gdzie gotowe metody zaimplementowane przez ATMEL noway. Aktualnie borykam się z obsługą stronicowania. Kod:

    
    SPCR = 0x10;
    	for (j=0; j<10; j++){
    		//GetPageToBufferDF(j, 0x00);
    		for (i=0; i<100; i++){
    		    data = ReadBufferDF(i, 0x00);
    			x=i%84;
    			y=(i/84)*8;
    			PORTA = data;
    			for (tmp=0; tmp<8; tmp++){
    				SPCR = 0x50;
    				if (data & 0x80)
    					LcdPixel(x, y+tmp, PIXEL_ON);
    				data<<=1;
    				SPCR = 0x10;
    			}
    		  _delay_us(100);
    	  	}
    	}

    SPCR zmieniam systematycznie, ponieważ wyświetlacz NOKIA3310 mam na tych samych portach i wymaga wyłączenia opcji SPI. Niezbyt estetycznie ale działa...

    Nie działa tak, jak powinno. Najgorsze w tych metodach jest brak przykładowych wywołań, przez co trudno domyślić się co było w zamyśle autora.

    rozumiem, że jak wywołam "GetPageToBufferDF(j, 0x00);" to w buforze numer 0 (ą tylko 2) zostanie zapisane 256 bajtów danych.

    EDIT:
    Próbuję skorzystać z "ReadFlashDF(j, i);" nadal bez postępów. Z bufora bez problemu pobieram, jednak gdy chcę załadować ze strony do bufora, to program zacina się.
    Załączniki:
REKLAMA