mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik AT91SAM7 und K4S561632J SDRAM Probleme


Autor: MatthiasB (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

I habe eine Schaltung + PCB identisch dem AT91SAM7SE512-EK, was die 
SDRAM und NAND-FLASH Ansteuerung angeht, aufgebaut. Der einzige 
Unterschied ist, dass ich den Samsung K4S561632J-UI75 anstelle des 
Micron 48LC16M16A2-75 benutze. Die beiden Bauteile sollten aber die 
gleichen Eigenschaften im Bezug auf Ansteuerung und Timing haben.
Für die Initialisierung benutze ich den Code, der in der Application 
Note "Using SDRAM on AT91SAM7SE Microcontrollers" vorgeschlagen wird.

Nichtdestoweniger arbeitet meine Software, die auf den SDRAM zugreift, 
auf dem Evaluation Board, aber nicht auf meinen eigenen Platinen (alle 
anderen Aspekte außer SDRAM Zugriffe des Programs laufen auf beiden 
Boards). Es geht nur um einfache Schreib/Lese Zugriffe mittels Pointern.

Wenn ich einen Datenblock Lese/Schreibe (SDRAM) passiert es, dass einige 
Bytes verkehrte Werte annehmen (aber das meiste vom Datenblock ist OK). 
Der Prozess ist wiederholbar, heißt die gleichen Bytes treten mit den 
gleichen falschen Werten auf, wenn der Prozess wiederholt wird (z.B. 
eine Page vom NAND-Flash lesen und per USART übertragen). Die Bytes 
(physischer Speicher) sind nicht kaputt, denn ich kann später alle 
möglichen Werte eintragen.

Ich hoffe jemand ist schon einmal auf ein ähnliches Problem mit SDRAM 
gestossen und hat eine Hinweis für mich. Ich habe grade erst angefangen, 
mich mit SDRAM und dem AT91SAM7 zu beschäftigen. Ändern der Timing 
Parameter des SDRAMC_CR (Control Registers) half nichts und die Micron 
48LC16M16A2-75 Werte sollten ja auch für den Samsung Baustein gelten 
(soweit ich die Datenblätter verglichen habe). Aber irgend etwas muss 
mir durch die Lappen gegangen sein (ich kann z.B. auch nicht den TXSR 
Wert für den Samsung K4S561632J-UI75 finden).

Der Fehler ist schwierig zu greifen, da fast alles funktioniert and 
sowieso alles auf dem Board funktioniert. Außerdem habe ich 2 PCBs 
gefertigt und beiden zeigen das selbe Verhalten (also wahrscheinlich 
keine kaputte Hardware, Chips/Pins).

Vielen Dank für jeden Hinweis, den ihr mir geben könnt.
Matthias

Autor: MatthiasB (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

Ich habe 2 Testunterprogramme geschrieben.
volatile unsigned char *ptr = (volatile unsigned char*)SDRAM_ADDRESS;
for(i=0;i<256;i++)
{
  *ptr=i;
  ptr++;
}
Ich bekomme andere Ergebnisse, wenn ich folgende Routine benutze:
volatile unsigned char *ptr = (volatile unsigned char*)SDRAM_ADDRESS;
unsigned char buf[256];
for(i=0;i<256;i++)
  buf[i]=i;
memcpy((void*)ptr,(void*)buf,256);
Fast alle Bytes sind OK, aber einige falsch. Manchmal sind es komplett 
neue Werte die drinstehen, manchmal wiederholt sich ein Wert. Wenn ich 
die Unterprogramme aufrufe bekomme ich immer die selben Ergebnisse, 
selben Bytes sind falsch mit den selben Ergebnissen.

Der Compiler wird wohl memcpy und *ptr=i unterschiedlich umsetzen und 
deshalb wohl die unterschiedlichen Ergebnisse. Leider kann ich daraus 
keine  Erkenntnisse ziehen. Ich habe immer noch das Gefühl, dass die 
Init Parameter wie TRC,TRP,etc. falsch sind. Außerdem scheint nur das 
Schreiben nicht zu funktionieren.

Vielen Dank für jeden Hinweis,
Matthias

Autor: MatthiasB (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

Ich muss mein Problem umformulieren. Ich habe eine Testroutine 
geschrieben:
  {
    UI32 i;
    volatile UI8* ptr = (volatile UI8*)AT91C_EBI_SDRAM;

    for(i=0;i<256;i++)
    {
      *ptr = 255-i;
      ptr++;
    }
    for(i=0;i<256;i++)
    {
      *ptr = 2*i;
      ptr++;
    }
    for(i=0;i<256;i++)
    {
      *ptr = 0xFF;
      ptr++;
    }
    for(i=0;i<256;i++)
    {
      *ptr = 0x00;
      ptr++;
    }    
  }

Wenn ich diese Schreibtest ausführe sind einge der Bytes auf dem SDRAM 
falsch. Ich habe nun aber auch festgestellt, dass einige dieser falschen 
Bytes beim erneuten Aufruf der Testroutine andere Werte annehmen, die 
meisten aber immer den selben falschen Wert anzeigen. Es ist also 
Dynamik/Rauschen im Spiel. Am merkwürdigsten ist aber, dass wenn ich 
0xFF schreibe kein Fehler auftaucht (siehe Testergebnisse am Ende).

Meine beiden Boards verhalten sich fast gleich, jedes aber mit anderen 
falschen Bytes und auf dem Atmel Evaluation Board funktioniert immer 
noch alles.

Da jetzt Dynamik mit im Spiel ist glaube ich, das mein Layout schlecht 
sein könnte (Prozessor zu SDRAM). Siehe Datei. Vielleicht sieht ja 
jemand ein Problem. Ich habe auch schon gedacht, die Prozessoren können 
kaputt sein, aber gleich auf 2 Boards?

Vielen Dank für jede Hilfe,
Matthias


===========================================================================================
===========================================================================================
Call Write SDRAM Subroutine and read out SDRAM:
===========================================================================================
===========================================================================================

20000000:  FF  FE  FD  FC  FB  FA  F9  F8  F7  F6  F5  F4  F3  F2  F1  F0 
20000010:  EF  EE  ED  EC  EB  EA  E9  E8  E7  E6  E5  E4  E3  E2  E1  E0 
20000020:  DF  DE  DD -DD  DB -DB  D9 -D9  D7 -D7  D5 -D5  D3 -F3  D1 -D1 
20000030:  CF  CE  CD -CD  CB -CB  C9 -C9  C7 -E7  C5  C4  C3 -E3  C1  C0 
20000040:  BF -BF  BD -BD  BB -BB  B9 -B9  B7 -B7  B5 -B5  B3 -B3  B1 -B1 
20000050:  AF  AE  AD -AD  AB -AB  A9 -A9  A7 -A7  A5 -A5  A3  A2  A1  A0 
20000060:  9F  9E  9D  9C  9B  9A  99  98  97  96  95  94  93  92  91  90 
20000070:  8F  8E  8D  8C  8B  8A  89  88  87  86  85  84  83  82  81  80 
20000080:  7F  7E  7D  7C  7B  7A  79  78  77  76  75  74  73  72  71  70 
20000090:  6F  6E  6D  6C  6B  6A  69  68  67  66  65  64  63  62  61  60 
200000A0:  5F -5F  5D -5D  5B -5B  59 -59  57 -77  55  54  53 -73  51  50 
200000B0:  4F -4F  4D  4C  4B -4B  49 -49  47 -67  45  44  43 -63  41  40 
200000C0:  3F -3F  3D -3D  3B -3B  39 -39  37 -37  35  34  33 -33  31  30 
200000D0:  2F -2F  2D -2D  2B -2B  29 -29  27  26  25  24  23  22  21  20 
200000E0:  1F  1E  1D  1C  1B  1A  19  18  17  16  15  14  13  12  11  10 
200000F0:  0F  0E  0D  0C  0B  0A  09  08  07  06  05  04  03  02  01  00 


Bytes Wrong Now:     23 25 27 29 2B 2D 2F 33 35 37 39 3D 41 43 45 47 49 4B 4D 4F 53 55 57 59 5B A1 A3 A5 A7 A9 AD B1 B5 B7 B9 BD C1 C3 C5 C7 C9 CD D1 D3 D5 D7 
Bytes Wrong At All:  23 25 27 29 2B 2D 2F 33 35 37 39 3D 41 43 45 47 49 4B 4D 4F 53 55 57 59 5B A1 A3 A5 A7 A9 AD B1 B5 B7 B9 BD C1 C3 C5 C7 C9 CD D1 D3 D5 D7 

Bytes Changed Now:   
Bytes Changed At All:

20000100:  00  02  04  06  08  0A  0C -6E  10  12  14  16  18  1A  1C -7E 
20000110:  20 -20  24  26  28  2A  2C  2E -6F -30  34  36 -7F  3A  3C  3E 
20000120: -7E  42  44  46  48  4A  4C  4E  50  52  54  56 -5E  5A  5C  5E 
20000130:  60  62  64  66  68  6A  6C  6E  70  72  74  76  78  7A  7C  7E 
20000140:  80  82  84  86  88  8A  8C -EE  90  92  94  96  98  9A  9C  9E 
20000150:  A0  A2  A4  A6  A8  AA  AC  AE  B0 -FF  B4  B6  B8  BA  BC  BE 
20000160:  C0  C2  C4  C6 -CE  CA  CC  CE -EF  D2 -D2  D6 -FE  DA  DC  DE 
20000170:  E0  E2  E4  E6  E8  EA  EC  EE  F0  F2  F4  F6  F8  FA  FC  FE 
20000180:  00  02  04  06  08  0A  0C -6E  10  12  14  16  18  1A  1C -7E 
20000190:  20 -20  24  26 -6F  2A  2C  2E -6F -30  34  36 -7F  3A  3C  3E 
200001A0: -7E  42  44  46  48  4A  4C  4E -4E  52  54  56 -5E  5A  5C  5E 
200001B0:  60  62  64  66  68  6A  6C  6E  70  72  74  76  78  7A  7C  7E 
200001C0:  80  82  84  86  88  8A -EB -EE  90  92  94  96  98  9A  9C -FE 
200001D0:  A0 -A0  A4  A6 -FF  AA  AC  AE -EF -FF  B4  B6  B8  BA  BC  BE 
200001E0: -FF  C2  C4  C6 -CE  CA  CC  CE -EF  D2  D4  D6 -FE  DA  DC  DE 
200001F0:  E0  E2  E4  E6  E8  EA  EC  EE  F0  F2  F4  F6  F8  FA  FC  FE 


Bytes Wrong Now:     07 0F 11 18 19 1C 20 2C 47 59 64 68 6A 6C 87 8F 91 94 98 99 9C A0 A8 AC C6 C7 CF D1 D4 D8 D9 E0 E4 E8 EC 
Bytes Wrong At All:  07 0F 11 18 19 1C 20 2C 47 59 64 68 6A 6C 87 8F 91 94 98 99 9C A0 A8 AC C6 C7 CF D1 D4 D8 D9 E0 E4 E8 EC 

Bytes Changed Now:   
Bytes Changed At All:

20000200:  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF 
20000210:  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF 
20000220:  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF 
20000230:  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF 
20000240:  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF 
20000250:  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF 
20000260:  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF 
20000270:  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF 
20000280:  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF 
20000290:  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF 
200002A0:  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF 
200002B0:  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF 
200002C0:  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF 
200002D0:  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF 
200002E0:  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF 
200002F0:  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF 


Bytes Wrong Now:     
Bytes Wrong At All:  

Bytes Changed Now:   
Bytes Changed At All:

20000300: -69 -21 -69 -60 -69 -21 -69 -60  00 -21  00 -61  00 -21 -69 -60 
20000310:  00 -21 -69 -60 -69 -21 -69 -60  00 -21 -69 -61 -69 -21 -69 -60 
20000320:  00  00  00  00  00  00  00  00  00  00  00  00  00  00  00  00 
20000330:  00  00  00  00  00  00  00  00  00  00  00  00  00  00  00  00 
20000340:  00  00  00  00  00  00  00  00  00  00  00  00  00  00  00  00 
20000350:  00  00  00  00  00  00  00  00  00  00  00  00  00  00  00  00 
20000360:  00  00  00  00  00  00  00  00  00  00  00  00  00  00  00  00 
20000370:  00  00  00  00  00  00  00  00  00  00  00  00  00  00  00  00 
20000380:  00  00  00  00  00  00  00  00  00  00  00  00  00  00  00  00 
20000390:  00  00  00  00  00  00  00  00  00  00  00  00  00  00  00  00 
200003A0:  00  00  00  00  00  00  00  00  00  00  00  00  00  00  00  00 
200003B0:  00  00  00  00  00  00  00  00  00  00  00  00  00  00  00  00 
200003C0:  00  00  00  00  00  00  00  00  00  00  00  00  00  00  00  00 
200003D0:  00  00  00  00  00  00  00  00  00  00  00  00  00  00  00  00 
200003E0:  00  00  00  00  00  00  00  00  00  00  00  00  00  00  00  00 
200003F0:  00  00  00  00  00  00  00  00  00  00  00  00  00  00  00  00 


Bytes Wrong Now:     00 01 02 03 04 05 06 07 09 0B 0D 0E 0F 11 12 13 14 15 16 17 19 1A 1B 1C 1D 1E 1F 
Bytes Wrong At All:  00 01 02 03 04 05 06 07 09 0B 0D 0E 0F 11 12 13 14 15 16 17 19 1A 1B 1C 1D 1E 1F 

Bytes Changed Now:   
Bytes Changed At All:

===========================================================================================
===========================================================================================
Call Write SDRAM Subroutine and read out SDRAM:
===========================================================================================
===========================================================================================

20000000:  FF  FE  FD  FC  FB  FA  F9  F8  F7  F6  F5  F4  F3  F2  F1  F0 
20000010:  EF  EE  ED  EC  EB  EA  E9  E8  E7  E6  E5  E4  E3  E2  E1  E0 
20000020:  DF  DE  DD -DD  DB -DB  D9 -D9  D7 -D7  D5 -D5  D3 -F3  D1  D0<
20000030:  CF  CE  CD -CD  CB -CB  C9 -C9  C7 -E7  C5  C4  C3 -E3  C1  C0 
20000040:  BF -BF  BD -BD  BB -BB  B9 -B9  B7 -B7  B5 -B5  B3 -B3  B1 -B1 
20000050:  AF -AF< AD -AD  AB -AB  A9  A8< A7 -A7  A5 -A5  A3  A2  A1  A0 
20000060:  9F  9E  9D  9C  9B  9A  99  98  97  96  95  94 -FD< 92  91  90 
20000070:  8F  8E  8D  8C  8B  8A  89  88  87  86  85  84  83  82  81  80 
20000080:  7F  7E  7D  7C  7B  7A  79  78  77  76  75  74  73  72  71  70 
20000090:  6F  6E  6D  6C  6B  6A  69  68  67  66  65  64  63  62  61  60 
200000A0:  5F -5F  5D -5D  5B  5A< 59 -59  57 -77  55  54  53 -73  51  50 
200000B0:  4F -4F  4D -4D< 4B -4B  49 -49  47  46< 45  44  43 -63  41  40 
200000C0:  3F -3F  3D -3D  3B -3B  39 -39  37 -37  35  34  33 -33  31  30 
200000D0:  2F -2F  2D -2D  2B -2B  29 -29  27  26  25  24  23  22  21  20 
200000E0:  1F  1E  1D  1C  1B  1A  19  18  17  16  15  14  13  12  11  10 
200000F0:  0F  0E  0D  0C  0B  0A  09  08  07  06  05  04  03  02  01  00 


Bytes Wrong Now:     23 25 27 29 2B 2D 33 35 37 39 3D 41 43 45 47 49 4B 4D 4F 51 53 55 59 5B 6C A1 A3 A7 A9 AD B1 B3 B5 B7 BD C1 C3 C5 C7 C9 CD D1 D3 D5 D7 
Bytes Wrong At All:  23 25 27 29 2B 2D 2F 33 35 37 39 3D 41 43 45 47 49 4B 4D 4F 53 55 57 59 5B A1 A3 A5 A7 A9 AD B1 B5 B7 B9 BD C1 C3 C5 C7 C9 CD D1 D3 D5 D7 51 6C B3 

Bytes Changed Now:   2F 51 57 6C A5 B3 B9 
Bytes Changed At All:2F 51 57 6C A5 B3 B9 

20000100:  00  02  04  06  08  0A  0C  0E< 10  12  14  16  18  1A  1C -7E 
20000110:  20 -20  24  26 -6F< 2A  2C  2E -6F -30  34  36 -7F  3A  3C  3E 
20000120: -7E  42  44  46  48  4A  4C  4E -6E< 52  54  56 -5E  5A  5C  5E 
20000130:  60  62  64  66  68  6A  6C  6E  70  72  74  76  78  7A  7C  7E 
20000140:  80  82  84  86  88  8A  8C -EE  90  92  94  96  98  9A  9C  9E 
20000150:  A0  A2  A4  A6  A8  AA  AC  AE  B0 -FF  B4  B6  B8  BA  BC  BE 
20000160:  C0  C2  C4  C6 -CE  CA  CC  CE  D0< D2  D4< D6 -FE  DA  DC  DE 
20000170:  E0  E2  E4  E6  E8  EA  EC  EE  F0  F2  F4  F6  F8  FA  FC  FE 
20000180:  00  02  04  06  08  0A  0C -6E  10  12  14  16  18  1A  1C  1E<
20000190:  20 -20  24  26 -6F  2A  2C  2E -6F -30  34  36 -7F  3A  3C  3E 
200001A0: -7E  42  44  46  48  4A  4C  4E -4E  52  54  56 -5E  5A  5C  5E 
200001B0:  60  62  64  66  68  6A  6C  6E  70  72  74  76  78  7A  7C  7E 
200001C0:  80  82  84  86  88  8A -EB -EE  90  92  94  96  98  9A  9C -FE 
200001D0:  A0 -A0  A4  A6 -FF  AA  AC  AE -EF -FF  B4  B6  B8  BA  BC  BE 
200001E0: -FF  C2  C4  C6 -CE  CA  CC  CE -EE< D2  D4  D6 -FE  DA  DC  DE 
200001F0:  E0  E2  E4  E6  E8  EA  EC  EE  F0  F2  F4  F6  F8  FA  FC  FE 


Bytes Wrong Now:     0F 11 14 18 19 1C 20 28 2C 47 59 64 6C 87 91 94 98 99 9C A0 A8 AC C6 C7 CF D1 D4 D8 D9 E0 E4 E8 EC 
Bytes Wrong At All:  07 0F 11 18 19 1C 20 2C 47 59 64 68 6A 6C 87 8F 91 94 98 99 9C A0 A8 AC C6 C7 CF D1 D4 D8 D9 E0 E4 E8 EC 14 28 

Bytes Changed Now:   07 14 28 68 6A 8F E8 
Bytes Changed At All:07 14 28 68 6A 8F E8 

20000200:  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF 
20000210:  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF 
20000220:  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF 
20000230:  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF 
20000240:  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF 
20000250:  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF 
20000260:  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF 
20000270:  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF 
20000280:  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF 
20000290:  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF 
200002A0:  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF 
200002B0:  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF 
200002C0:  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF 
200002D0:  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF 
200002E0:  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF 
200002F0:  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF 


Bytes Wrong Now:     
Bytes Wrong At All:  

Bytes Changed Now:   
Bytes Changed At All:

20000300: -69  00<-69 -60 -69 -21 -69 -60  00 -21  00 -61  00 -21 -69 -60 
20000310: -69<-21 -69 -60 -69 -21 -69  00< 00 -21 -69 -61 -69 -21 -69 -60 
20000320:  00  00  00  00  00  00  00  00  00  00  00  00  00  00  00  00 
20000330:  00  00  00  00  00  00  00  00  00  00  00  00  00  00  00  00 
20000340:  00  00  00  00  00  00  00  00  00  00  00  00  00  00  00  00 
20000350:  00  00  00  00  00  00  00  00  00  00  00  00  00  00  00  00 
20000360:  00  00  00  00  00  00  00  00  00  00  00  00  00  00  00  00 
20000370:  00  00  00  00  00  00  00  00  00  00  00  00  00  00  00  00 
20000380:  00  00  00  00  00  00  00  00  00  00  00  00  00  00  00  00 
20000390:  00  00  00  00  00  00  00  00  00  00  00  00  00  00  00  00 
200003A0:  00  00  00  00  00  00  00  00  00  00  00  00  00  00  00  00 
200003B0:  00  00  00  00  00  00  00  00  00  00  00  00  00  00  00  00 
200003C0:  00  00  00  00  00  00  00  00  00  00  00  00  00  00  00  00 
200003D0:  00  00  00  00  00  00  00  00  00  00  00  00  00  00  00  00 
200003E0:  00  00  00  00  00  00  00  00  00  00  00  00  00  00  00  00 
200003F0:  00  00  00  00  00  00  00  00  00  00  00  00  00  00  00  00 


Bytes Wrong Now:     00 02 03 04 05 06 07 09 0B 0D 0E 0F 10 11 12 13 14 15 16 19 1A 1B 1C 1D 1E 1F 
Bytes Wrong At All:  00 01 02 03 04 05 06 07 09 0B 0D 0E 0F 11 12 13 14 15 16 17 19 1A 1B 1C 1D 1E 1F 10 

Bytes Changed Now:   01 10 17 
Bytes Changed At All:01 10 17 

Autor: MatthiasB (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

nur wegen der Vollständigkeit, hier meine Initialisierung Routinen für 
den SDRAM:

HEADER FILE:
#ifndef _MY_SDRAM_H_
#define _MY_SDRAM_H_

#if 0
  #define MICRON_MT48LC_256M
#else
  #define SAMSUNG_K4S561632J
#endif

#ifdef  MICRON_MT48LC_256M
  #define SDRAM_ADDRESS   (0x20000000)
  #define SDRAM_MEMSIZE   (0x02000000) /*  256Mb = 32 MByte; [byte] */

  #define SDRC_NC         (0x1)        /*  NC   = 9                 */ 
  #define SDRC_NR         (0x2 << 2)   /*  NR   = 13                */ 
  #define SDRC_NB_BANKS   (0x1 << 4)   /*  NB_BANKS = 4             */  
  #define SDRC_CAS        (0x2 << 5)   /*  CAS  = 2                 */ 
  #define SDRC_TWR        (0x2 << 7)   /*  TWR  = 2                 */ 
  #define SDRC_TRC        (0x4 << 11)  /*  TRC  = 4                 */ 
  #define SDRC_TRP        (0x4 << 15)  /*  TRP  = 4                 */ 
  #define SDRC_TRCD       (0x2 << 19)  /*  TRCD = 2                 */ 
  #define SDRC_TRAS       (0x3 << 23)  /*  TRAS = 3                 */  
  #define SDRC_TXSR       (0x4 << 27)  /*  TXSR = 4                 */ 

#endif

#ifdef SAMSUNG_K4S561632J
  #define SDRAM_ADDRESS   (0x20000000)
  #define SDRAM_MEMSIZE   (0x02000000) /*  256Mb = 32 MByte; [byte] */

  #define SDRC_NC         (0x1)        /*  NC   = 9                 */ 
  #define SDRC_NR         (0x2 << 2)   /*  NR   = 13                */ 
  #define SDRC_NB_BANKS   (0x1 << 4)   /*  NB_BANKS = 4             */  
  #define SDRC_CAS        (0x2 << 5)   /*  CAS  = 2                 */ 
  #define SDRC_TWR        (0x2 << 7)   /*  TWR  = 2                 */ 
  #define SDRC_TRC        (0x5 << 11)  /*  TRC  = 5                 */ 
  #define SDRC_TRP        (0x3 << 15)  /*  TRP  = 3                 */ 
  #define SDRC_TRCD       (0x2 << 19)  /*  TRCD = 2                 */ 
  #define SDRC_TRAS       (0x3 << 23)  /*  TRAS = 3                 */  
  #define SDRC_TXSR       (0x4 << 27)  /*  TXSR = 4                 */ 

#endif

/****************************************************************************************/
/****************************************************************************************/
/****************************************************************************************/

UI8 my_sdram_configure(UI32 mck);
UI8 my_sdram_configure_power_up(void);

#endif

SOURCE FILE:
#include "my_sdram.h"

/****************************************************************************************/
/****************************************************************************************/
/****************************************************************************************/
UI8 my_sdram_configure(UI32 mck)
{
  volatile unsigned int i;
  static const Pin pinsSdram[] = {PINS_SDRAM};

  /* Init only for 48MHz */
  if(mck!=48000000) return 1;                         

  /* Enable corresponding PIOs */
  PIO_Configure(pinsSdram, PIO_LISTSIZE(pinsSdram));
    
  /* Enable EBI chip select for the SDRAM */
  WRITE(AT91C_BASE_EBI, EBI_CSA, AT91C_EBI_CS1A_SDRAMC);

  /* CFG Control Register */
  WRITE(AT91C_BASE_SDRC, SDRC_CR,   SDRC_NC
                              | SDRC_NR
                                  | SDRC_CAS
                                  | SDRC_NB_BANKS
                                  | SDRC_TWR
                                  | SDRC_TRC
                                  | SDRC_TRP
                                  | SDRC_TRCD
                                  | SDRC_TRAS
                                  | SDRC_TXSR);           
  for (i = 0; i < 1000; i++);

  /* Power UP Sequence - Init */
  my_sdram_configure_power_up();

  return 0;
}

/****************************************************************************************/
/****************************************************************************************/
/****************************************************************************************/
UI8 my_sdram_configure_power_up(void)
{
  volatile unsigned int i;
  volatile unsigned int *pSdram = (unsigned int *) AT91C_EBI_SDRAM; /* Pointer to SDRAM */

  /* NOP Command : mode=1 */
  WRITE(AT91C_BASE_SDRC, SDRC_MR, AT91C_SDRC_DBW_16_BITS | AT91C_SDRC_MODE_NOP_CMD); 
  pSdram[0] = 0x00000000;

  for (i = 0; i < 10000; i++);

  /* All Banks Precharge: mode=2 */
  WRITE(AT91C_BASE_SDRC, SDRC_MR, AT91C_SDRC_DBW_16_BITS | AT91C_SDRC_MODE_PRCGALL_CMD);
  pSdram[0] = 0x00000000;                                                               

  for (i = 0; i < 10000; i++);

  /* Eight Auto Refresh (CBR) cycles: mode=4 */
  WRITE(AT91C_BASE_SDRC, SDRC_MR, AT91C_SDRC_DBW_16_BITS | AT91C_SDRC_MODE_RFSH_CMD);
  pSdram[1] = 0x00000001;                                                            

  WRITE(AT91C_BASE_SDRC, SDRC_MR, AT91C_SDRC_DBW_16_BITS | AT91C_SDRC_MODE_RFSH_CMD);
  pSdram[2] = 0x00000002;                                                            

  WRITE(AT91C_BASE_SDRC, SDRC_MR, AT91C_SDRC_DBW_16_BITS | AT91C_SDRC_MODE_RFSH_CMD);
  pSdram[3] = 0x00000003;                                                            

  WRITE(AT91C_BASE_SDRC, SDRC_MR, AT91C_SDRC_DBW_16_BITS | AT91C_SDRC_MODE_RFSH_CMD);
  pSdram[4] = 0x00000004;                                                            

  WRITE(AT91C_BASE_SDRC, SDRC_MR, AT91C_SDRC_DBW_16_BITS | AT91C_SDRC_MODE_RFSH_CMD);
  pSdram[5] = 0x00000005;                                                            

  WRITE(AT91C_BASE_SDRC, SDRC_MR, AT91C_SDRC_DBW_16_BITS | AT91C_SDRC_MODE_RFSH_CMD);
  pSdram[6] = 0x00000006;                                                            

  WRITE(AT91C_BASE_SDRC, SDRC_MR, AT91C_SDRC_DBW_16_BITS | AT91C_SDRC_MODE_RFSH_CMD);
  pSdram[7] = 0x00000007;                                                            

  WRITE(AT91C_BASE_SDRC, SDRC_MR, AT91C_SDRC_DBW_16_BITS | AT91C_SDRC_MODE_RFSH_CMD);
  pSdram[8] = 0x00000008;                                                            

  /* Mode Register Set (MRS,LMR) Command: mode=3, burst=1, lat=2 */
  WRITE(AT91C_BASE_SDRC, SDRC_MR, AT91C_SDRC_DBW_16_BITS | AT91C_SDRC_MODE_LMR_CMD);
  pSdram[9] = 0xcafedede;

  /* Set Normal mode: mode=0 */
  WRITE(AT91C_BASE_SDRC, SDRC_MR, AT91C_SDRC_DBW_16_BITS | AT91C_SDRC_MODE_NORMAL_CMD);  
  pSdram[0] = 0x00000000;

  /* Set Refresh Timer: 7.8usec = 0x175 (depends on BOARD_MCK) */
  WRITE(AT91C_BASE_SDRC, SDRC_TR, AT91C_SDRC_DBW_16_BITS | (0x175));

  for (i = 0; i < 1000; i++);

  return 0;
}

Ich hoffe jemand kann helfen,
Matthias

Autor: MatthiasB (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

Ich habe einige Application Notes zum Thema SDRAM Layout durchgeschaut 
und festgestellt, dass mein Layout mehr schlecht als recht ist. Es muss 
definitiv aufgebessert werden. Trotzdem glaube ich nicht ganz, dass mein 
Problem am schlechten Layout liegt (kann aber sein).

Weitere Untersuchungen haben nun folgendes ergeben: Wenn ich den 
NANDFLASH auf meinem Board nicht anspreche (kein Kommando sende), 
funktioniert der SDRAM !!! Sobald ich aber ein Kommando zum NANDFLASH 
sende (ist das Reset Kommando in der Initialisierung) zeigt der SDRAM 
das alte Problem. Ich verstehe das nicht. Zwar benutzen NANDFLASH und 
SDRAM beide den Datenbus D0..7 aber eigentlich sollte doch nach einem 
Kommando die Inputs des NANDFLASHes wieder auf high-z gehen und den 
SDRAM in Ruhe lassen.

Kann man irgenwie messen, ob die NANDFLASH Pins wirklich auf high-z 
gehen? Oder verändert sich noch etwas anderes am NANDFLASH Zustand nach 
dem ersten Kommando (vielleicht eine Clock fängt an zu laufen).

Eine andere Überlegung war, dass aufgrund des schlechten Layouts 
vieleicht die Leitungen sich gegenseitig beeinflussen. Deshalb habe ich 
die Taktrate von 48MHz auf 24MHz gesetzt, aber leider ohne Effekt.

Ich bin immer noch dankbar für jeden Hinweis.

Matthias

Autor: Bernd Schuster (mms)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Weitere Untersuchungen haben nun folgendes ergeben: Wenn ich den
>NANDFLASH auf meinem Board nicht anspreche (kein Kommando sende),
>funktioniert der SDRAM !!! Sobald ich aber ein Kommando zum NANDFLASH
>sende (ist das Reset Kommando in der Initialisierung) zeigt der SDRAM
>das alte Problem. Ich verstehe das nicht. Zwar benutzen NANDFLASH und
>SDRAM beide den Datenbus D0..7 aber eigentlich sollte doch nach einem
>Kommando die Inputs des NANDFLASHes wieder auf high-z gehen und den
>SDRAM in Ruhe lassen.

schon im Errata nachgeschaut?

>Kann man irgenwie messen, ob die NANDFLASH Pins wirklich auf high-z
>gehen?

glaub ich nicht, da in diesem zustand "keine verbindung" zur leitung 
(layout) vorhanden ist.

>Eine andere Überlegung war, dass aufgrund des schlechten Layouts
>vieleicht die Leitungen sich gegenseitig beeinflussen.

eher weniger: sdram an sich ist nicht besonders schnell (meistens 100MHz 
Takt) und hat relativ große setup und hold zeiten (1.5ns setup und 0.8 
hold) - die anstiegszeit liegt wahrscheinlich im bereich von 5n. 
Leitungslängen unterhalb von 10cm sind ok - kleiner 70mm super.

Bernd

Autor: Youssef (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

wie lang ist Deine SDCK Leitung Pin 38 beim SDRAM?, es ist besser unter 
5cm zu beiben

Autor: Bernd Schuster (mms)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
wenn deine anderen Leitungen ca 70mm sind, dann sind 50mm überhaupt kein 
problem...

hast du die Configuration der SDRAM Bausteine nochmals überprüft? Bin 
mir jetzt nicht sicher, ob das die gleichen wie auf dem Atmel Board 
sind...


Bernd

Autor: Christian J. (elektroniker1968)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Mathias,

hast Du Dein SDRAM zum laufen bekommen? Sonst fange ich erst gar nicht 
mit dem Drama an und benutzebeim LPC2478 SRAM, auch wenn es kleiner ist. 
Allerdings hat der einen SDRAM Controller onboard und wäre schade die 
nicht zu nutzen.

Gruss,
Christian

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.