Forum: Mikrocontroller und Digitale Elektronik AT91SAM7 und K4S561632J SDRAM Probleme


von MatthiasB (Gast)


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

von MatthiasB (Gast)


Lesenswert?

Hallo,

Ich habe 2 Testunterprogramme geschrieben.
1
volatile unsigned char *ptr = (volatile unsigned char*)SDRAM_ADDRESS;
2
for(i=0;i<256;i++)
3
{
4
  *ptr=i;
5
  ptr++;
6
}
Ich bekomme andere Ergebnisse, wenn ich folgende Routine benutze:
1
volatile unsigned char *ptr = (volatile unsigned char*)SDRAM_ADDRESS;
2
unsigned char buf[256];
3
for(i=0;i<256;i++)
4
  buf[i]=i;
5
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

von MatthiasB (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,

Ich muss mein Problem umformulieren. Ich habe eine Testroutine 
geschrieben:
1
  {
2
    UI32 i;
3
    volatile UI8* ptr = (volatile UI8*)AT91C_EBI_SDRAM;
4
5
    for(i=0;i<256;i++)
6
    {
7
      *ptr = 255-i;
8
      ptr++;
9
    }
10
    for(i=0;i<256;i++)
11
    {
12
      *ptr = 2*i;
13
      ptr++;
14
    }
15
    for(i=0;i<256;i++)
16
    {
17
      *ptr = 0xFF;
18
      ptr++;
19
    }
20
    for(i=0;i<256;i++)
21
    {
22
      *ptr = 0x00;
23
      ptr++;
24
    }    
25
  }

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

1
===========================================================================================
2
===========================================================================================
3
Call Write SDRAM Subroutine and read out SDRAM:
4
===========================================================================================
5
===========================================================================================
6
7
20000000:  FF  FE  FD  FC  FB  FA  F9  F8  F7  F6  F5  F4  F3  F2  F1  F0 
8
20000010:  EF  EE  ED  EC  EB  EA  E9  E8  E7  E6  E5  E4  E3  E2  E1  E0 
9
20000020:  DF  DE  DD -DD  DB -DB  D9 -D9  D7 -D7  D5 -D5  D3 -F3  D1 -D1 
10
20000030:  CF  CE  CD -CD  CB -CB  C9 -C9  C7 -E7  C5  C4  C3 -E3  C1  C0 
11
20000040:  BF -BF  BD -BD  BB -BB  B9 -B9  B7 -B7  B5 -B5  B3 -B3  B1 -B1 
12
20000050:  AF  AE  AD -AD  AB -AB  A9 -A9  A7 -A7  A5 -A5  A3  A2  A1  A0 
13
20000060:  9F  9E  9D  9C  9B  9A  99  98  97  96  95  94  93  92  91  90 
14
20000070:  8F  8E  8D  8C  8B  8A  89  88  87  86  85  84  83  82  81  80 
15
20000080:  7F  7E  7D  7C  7B  7A  79  78  77  76  75  74  73  72  71  70 
16
20000090:  6F  6E  6D  6C  6B  6A  69  68  67  66  65  64  63  62  61  60 
17
200000A0:  5F -5F  5D -5D  5B -5B  59 -59  57 -77  55  54  53 -73  51  50 
18
200000B0:  4F -4F  4D  4C  4B -4B  49 -49  47 -67  45  44  43 -63  41  40 
19
200000C0:  3F -3F  3D -3D  3B -3B  39 -39  37 -37  35  34  33 -33  31  30 
20
200000D0:  2F -2F  2D -2D  2B -2B  29 -29  27  26  25  24  23  22  21  20 
21
200000E0:  1F  1E  1D  1C  1B  1A  19  18  17  16  15  14  13  12  11  10 
22
200000F0:  0F  0E  0D  0C  0B  0A  09  08  07  06  05  04  03  02  01  00 
23
24
25
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 
26
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 
27
28
Bytes Changed Now:   
29
Bytes Changed At All:
30
31
20000100:  00  02  04  06  08  0A  0C -6E  10  12  14  16  18  1A  1C -7E 
32
20000110:  20 -20  24  26  28  2A  2C  2E -6F -30  34  36 -7F  3A  3C  3E 
33
20000120: -7E  42  44  46  48  4A  4C  4E  50  52  54  56 -5E  5A  5C  5E 
34
20000130:  60  62  64  66  68  6A  6C  6E  70  72  74  76  78  7A  7C  7E 
35
20000140:  80  82  84  86  88  8A  8C -EE  90  92  94  96  98  9A  9C  9E 
36
20000150:  A0  A2  A4  A6  A8  AA  AC  AE  B0 -FF  B4  B6  B8  BA  BC  BE 
37
20000160:  C0  C2  C4  C6 -CE  CA  CC  CE -EF  D2 -D2  D6 -FE  DA  DC  DE 
38
20000170:  E0  E2  E4  E6  E8  EA  EC  EE  F0  F2  F4  F6  F8  FA  FC  FE 
39
20000180:  00  02  04  06  08  0A  0C -6E  10  12  14  16  18  1A  1C -7E 
40
20000190:  20 -20  24  26 -6F  2A  2C  2E -6F -30  34  36 -7F  3A  3C  3E 
41
200001A0: -7E  42  44  46  48  4A  4C  4E -4E  52  54  56 -5E  5A  5C  5E 
42
200001B0:  60  62  64  66  68  6A  6C  6E  70  72  74  76  78  7A  7C  7E 
43
200001C0:  80  82  84  86  88  8A -EB -EE  90  92  94  96  98  9A  9C -FE 
44
200001D0:  A0 -A0  A4  A6 -FF  AA  AC  AE -EF -FF  B4  B6  B8  BA  BC  BE 
45
200001E0: -FF  C2  C4  C6 -CE  CA  CC  CE -EF  D2  D4  D6 -FE  DA  DC  DE 
46
200001F0:  E0  E2  E4  E6  E8  EA  EC  EE  F0  F2  F4  F6  F8  FA  FC  FE 
47
48
49
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 
50
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 
51
52
Bytes Changed Now:   
53
Bytes Changed At All:
54
55
20000200:  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF 
56
20000210:  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF 
57
20000220:  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF 
58
20000230:  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF 
59
20000240:  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF 
60
20000250:  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF 
61
20000260:  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF 
62
20000270:  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF 
63
20000280:  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF 
64
20000290:  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF 
65
200002A0:  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF 
66
200002B0:  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF 
67
200002C0:  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF 
68
200002D0:  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF 
69
200002E0:  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF 
70
200002F0:  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF 
71
72
73
Bytes Wrong Now:     
74
Bytes Wrong At All:  
75
76
Bytes Changed Now:   
77
Bytes Changed At All:
78
79
20000300: -69 -21 -69 -60 -69 -21 -69 -60  00 -21  00 -61  00 -21 -69 -60 
80
20000310:  00 -21 -69 -60 -69 -21 -69 -60  00 -21 -69 -61 -69 -21 -69 -60 
81
20000320:  00  00  00  00  00  00  00  00  00  00  00  00  00  00  00  00 
82
20000330:  00  00  00  00  00  00  00  00  00  00  00  00  00  00  00  00 
83
20000340:  00  00  00  00  00  00  00  00  00  00  00  00  00  00  00  00 
84
20000350:  00  00  00  00  00  00  00  00  00  00  00  00  00  00  00  00 
85
20000360:  00  00  00  00  00  00  00  00  00  00  00  00  00  00  00  00 
86
20000370:  00  00  00  00  00  00  00  00  00  00  00  00  00  00  00  00 
87
20000380:  00  00  00  00  00  00  00  00  00  00  00  00  00  00  00  00 
88
20000390:  00  00  00  00  00  00  00  00  00  00  00  00  00  00  00  00 
89
200003A0:  00  00  00  00  00  00  00  00  00  00  00  00  00  00  00  00 
90
200003B0:  00  00  00  00  00  00  00  00  00  00  00  00  00  00  00  00 
91
200003C0:  00  00  00  00  00  00  00  00  00  00  00  00  00  00  00  00 
92
200003D0:  00  00  00  00  00  00  00  00  00  00  00  00  00  00  00  00 
93
200003E0:  00  00  00  00  00  00  00  00  00  00  00  00  00  00  00  00 
94
200003F0:  00  00  00  00  00  00  00  00  00  00  00  00  00  00  00  00 
95
96
97
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 
98
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 
99
100
Bytes Changed Now:   
101
Bytes Changed At All:
102
103
===========================================================================================
104
===========================================================================================
105
Call Write SDRAM Subroutine and read out SDRAM:
106
===========================================================================================
107
===========================================================================================
108
109
20000000:  FF  FE  FD  FC  FB  FA  F9  F8  F7  F6  F5  F4  F3  F2  F1  F0 
110
20000010:  EF  EE  ED  EC  EB  EA  E9  E8  E7  E6  E5  E4  E3  E2  E1  E0 
111
20000020:  DF  DE  DD -DD  DB -DB  D9 -D9  D7 -D7  D5 -D5  D3 -F3  D1  D0<
112
20000030:  CF  CE  CD -CD  CB -CB  C9 -C9  C7 -E7  C5  C4  C3 -E3  C1  C0 
113
20000040:  BF -BF  BD -BD  BB -BB  B9 -B9  B7 -B7  B5 -B5  B3 -B3  B1 -B1 
114
20000050:  AF -AF< AD -AD  AB -AB  A9  A8< A7 -A7  A5 -A5  A3  A2  A1  A0 
115
20000060:  9F  9E  9D  9C  9B  9A  99  98  97  96  95  94 -FD< 92  91  90 
116
20000070:  8F  8E  8D  8C  8B  8A  89  88  87  86  85  84  83  82  81  80 
117
20000080:  7F  7E  7D  7C  7B  7A  79  78  77  76  75  74  73  72  71  70 
118
20000090:  6F  6E  6D  6C  6B  6A  69  68  67  66  65  64  63  62  61  60 
119
200000A0:  5F -5F  5D -5D  5B  5A< 59 -59  57 -77  55  54  53 -73  51  50 
120
200000B0:  4F -4F  4D -4D< 4B -4B  49 -49  47  46< 45  44  43 -63  41  40 
121
200000C0:  3F -3F  3D -3D  3B -3B  39 -39  37 -37  35  34  33 -33  31  30 
122
200000D0:  2F -2F  2D -2D  2B -2B  29 -29  27  26  25  24  23  22  21  20 
123
200000E0:  1F  1E  1D  1C  1B  1A  19  18  17  16  15  14  13  12  11  10 
124
200000F0:  0F  0E  0D  0C  0B  0A  09  08  07  06  05  04  03  02  01  00 
125
126
127
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 
128
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 
129
130
Bytes Changed Now:   2F 51 57 6C A5 B3 B9 
131
Bytes Changed At All:2F 51 57 6C A5 B3 B9 
132
133
20000100:  00  02  04  06  08  0A  0C  0E< 10  12  14  16  18  1A  1C -7E 
134
20000110:  20 -20  24  26 -6F< 2A  2C  2E -6F -30  34  36 -7F  3A  3C  3E 
135
20000120: -7E  42  44  46  48  4A  4C  4E -6E< 52  54  56 -5E  5A  5C  5E 
136
20000130:  60  62  64  66  68  6A  6C  6E  70  72  74  76  78  7A  7C  7E 
137
20000140:  80  82  84  86  88  8A  8C -EE  90  92  94  96  98  9A  9C  9E 
138
20000150:  A0  A2  A4  A6  A8  AA  AC  AE  B0 -FF  B4  B6  B8  BA  BC  BE 
139
20000160:  C0  C2  C4  C6 -CE  CA  CC  CE  D0< D2  D4< D6 -FE  DA  DC  DE 
140
20000170:  E0  E2  E4  E6  E8  EA  EC  EE  F0  F2  F4  F6  F8  FA  FC  FE 
141
20000180:  00  02  04  06  08  0A  0C -6E  10  12  14  16  18  1A  1C  1E<
142
20000190:  20 -20  24  26 -6F  2A  2C  2E -6F -30  34  36 -7F  3A  3C  3E 
143
200001A0: -7E  42  44  46  48  4A  4C  4E -4E  52  54  56 -5E  5A  5C  5E 
144
200001B0:  60  62  64  66  68  6A  6C  6E  70  72  74  76  78  7A  7C  7E 
145
200001C0:  80  82  84  86  88  8A -EB -EE  90  92  94  96  98  9A  9C -FE 
146
200001D0:  A0 -A0  A4  A6 -FF  AA  AC  AE -EF -FF  B4  B6  B8  BA  BC  BE 
147
200001E0: -FF  C2  C4  C6 -CE  CA  CC  CE -EE< D2  D4  D6 -FE  DA  DC  DE 
148
200001F0:  E0  E2  E4  E6  E8  EA  EC  EE  F0  F2  F4  F6  F8  FA  FC  FE 
149
150
151
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 
152
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 
153
154
Bytes Changed Now:   07 14 28 68 6A 8F E8 
155
Bytes Changed At All:07 14 28 68 6A 8F E8 
156
157
20000200:  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF 
158
20000210:  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF 
159
20000220:  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF 
160
20000230:  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF 
161
20000240:  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF 
162
20000250:  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF 
163
20000260:  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF 
164
20000270:  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF 
165
20000280:  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF 
166
20000290:  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF 
167
200002A0:  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF 
168
200002B0:  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF 
169
200002C0:  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF 
170
200002D0:  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF 
171
200002E0:  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF 
172
200002F0:  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF 
173
174
175
Bytes Wrong Now:     
176
Bytes Wrong At All:  
177
178
Bytes Changed Now:   
179
Bytes Changed At All:
180
181
20000300: -69  00<-69 -60 -69 -21 -69 -60  00 -21  00 -61  00 -21 -69 -60 
182
20000310: -69<-21 -69 -60 -69 -21 -69  00< 00 -21 -69 -61 -69 -21 -69 -60 
183
20000320:  00  00  00  00  00  00  00  00  00  00  00  00  00  00  00  00 
184
20000330:  00  00  00  00  00  00  00  00  00  00  00  00  00  00  00  00 
185
20000340:  00  00  00  00  00  00  00  00  00  00  00  00  00  00  00  00 
186
20000350:  00  00  00  00  00  00  00  00  00  00  00  00  00  00  00  00 
187
20000360:  00  00  00  00  00  00  00  00  00  00  00  00  00  00  00  00 
188
20000370:  00  00  00  00  00  00  00  00  00  00  00  00  00  00  00  00 
189
20000380:  00  00  00  00  00  00  00  00  00  00  00  00  00  00  00  00 
190
20000390:  00  00  00  00  00  00  00  00  00  00  00  00  00  00  00  00 
191
200003A0:  00  00  00  00  00  00  00  00  00  00  00  00  00  00  00  00 
192
200003B0:  00  00  00  00  00  00  00  00  00  00  00  00  00  00  00  00 
193
200003C0:  00  00  00  00  00  00  00  00  00  00  00  00  00  00  00  00 
194
200003D0:  00  00  00  00  00  00  00  00  00  00  00  00  00  00  00  00 
195
200003E0:  00  00  00  00  00  00  00  00  00  00  00  00  00  00  00  00 
196
200003F0:  00  00  00  00  00  00  00  00  00  00  00  00  00  00  00  00 
197
198
199
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 
200
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 
201
202
Bytes Changed Now:   01 10 17 
203
Bytes Changed At All:01 10 17

von MatthiasB (Gast)


Lesenswert?

Hallo,

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

HEADER FILE:
1
#ifndef _MY_SDRAM_H_
2
#define _MY_SDRAM_H_
3
4
#if 0
5
  #define MICRON_MT48LC_256M
6
#else
7
  #define SAMSUNG_K4S561632J
8
#endif
9
10
#ifdef  MICRON_MT48LC_256M
11
  #define SDRAM_ADDRESS   (0x20000000)
12
  #define SDRAM_MEMSIZE   (0x02000000) /*  256Mb = 32 MByte; [byte] */
13
14
  #define SDRC_NC         (0x1)        /*  NC   = 9                 */ 
15
  #define SDRC_NR         (0x2 << 2)   /*  NR   = 13                */ 
16
  #define SDRC_NB_BANKS   (0x1 << 4)   /*  NB_BANKS = 4             */  
17
  #define SDRC_CAS        (0x2 << 5)   /*  CAS  = 2                 */ 
18
  #define SDRC_TWR        (0x2 << 7)   /*  TWR  = 2                 */ 
19
  #define SDRC_TRC        (0x4 << 11)  /*  TRC  = 4                 */ 
20
  #define SDRC_TRP        (0x4 << 15)  /*  TRP  = 4                 */ 
21
  #define SDRC_TRCD       (0x2 << 19)  /*  TRCD = 2                 */ 
22
  #define SDRC_TRAS       (0x3 << 23)  /*  TRAS = 3                 */  
23
  #define SDRC_TXSR       (0x4 << 27)  /*  TXSR = 4                 */ 
24
25
#endif
26
27
#ifdef SAMSUNG_K4S561632J
28
  #define SDRAM_ADDRESS   (0x20000000)
29
  #define SDRAM_MEMSIZE   (0x02000000) /*  256Mb = 32 MByte; [byte] */
30
31
  #define SDRC_NC         (0x1)        /*  NC   = 9                 */ 
32
  #define SDRC_NR         (0x2 << 2)   /*  NR   = 13                */ 
33
  #define SDRC_NB_BANKS   (0x1 << 4)   /*  NB_BANKS = 4             */  
34
  #define SDRC_CAS        (0x2 << 5)   /*  CAS  = 2                 */ 
35
  #define SDRC_TWR        (0x2 << 7)   /*  TWR  = 2                 */ 
36
  #define SDRC_TRC        (0x5 << 11)  /*  TRC  = 5                 */ 
37
  #define SDRC_TRP        (0x3 << 15)  /*  TRP  = 3                 */ 
38
  #define SDRC_TRCD       (0x2 << 19)  /*  TRCD = 2                 */ 
39
  #define SDRC_TRAS       (0x3 << 23)  /*  TRAS = 3                 */  
40
  #define SDRC_TXSR       (0x4 << 27)  /*  TXSR = 4                 */ 
41
42
#endif
43
44
/****************************************************************************************/
45
/****************************************************************************************/
46
/****************************************************************************************/
47
48
UI8 my_sdram_configure(UI32 mck);
49
UI8 my_sdram_configure_power_up(void);
50
51
#endif

SOURCE FILE:
1
#include "my_sdram.h"
2
3
/****************************************************************************************/
4
/****************************************************************************************/
5
/****************************************************************************************/
6
UI8 my_sdram_configure(UI32 mck)
7
{
8
  volatile unsigned int i;
9
  static const Pin pinsSdram[] = {PINS_SDRAM};
10
11
  /* Init only for 48MHz */
12
  if(mck!=48000000) return 1;                         
13
14
  /* Enable corresponding PIOs */
15
  PIO_Configure(pinsSdram, PIO_LISTSIZE(pinsSdram));
16
    
17
  /* Enable EBI chip select for the SDRAM */
18
  WRITE(AT91C_BASE_EBI, EBI_CSA, AT91C_EBI_CS1A_SDRAMC);
19
20
  /* CFG Control Register */
21
  WRITE(AT91C_BASE_SDRC, SDRC_CR,   SDRC_NC
22
                              | SDRC_NR
23
                                  | SDRC_CAS
24
                                  | SDRC_NB_BANKS
25
                                  | SDRC_TWR
26
                                  | SDRC_TRC
27
                                  | SDRC_TRP
28
                                  | SDRC_TRCD
29
                                  | SDRC_TRAS
30
                                  | SDRC_TXSR);           
31
  for (i = 0; i < 1000; i++);
32
33
  /* Power UP Sequence - Init */
34
  my_sdram_configure_power_up();
35
36
  return 0;
37
}
38
39
/****************************************************************************************/
40
/****************************************************************************************/
41
/****************************************************************************************/
42
UI8 my_sdram_configure_power_up(void)
43
{
44
  volatile unsigned int i;
45
  volatile unsigned int *pSdram = (unsigned int *) AT91C_EBI_SDRAM; /* Pointer to SDRAM */
46
47
  /* NOP Command : mode=1 */
48
  WRITE(AT91C_BASE_SDRC, SDRC_MR, AT91C_SDRC_DBW_16_BITS | AT91C_SDRC_MODE_NOP_CMD); 
49
  pSdram[0] = 0x00000000;
50
51
  for (i = 0; i < 10000; i++);
52
53
  /* All Banks Precharge: mode=2 */
54
  WRITE(AT91C_BASE_SDRC, SDRC_MR, AT91C_SDRC_DBW_16_BITS | AT91C_SDRC_MODE_PRCGALL_CMD);
55
  pSdram[0] = 0x00000000;                                                               
56
57
  for (i = 0; i < 10000; i++);
58
59
  /* Eight Auto Refresh (CBR) cycles: mode=4 */
60
  WRITE(AT91C_BASE_SDRC, SDRC_MR, AT91C_SDRC_DBW_16_BITS | AT91C_SDRC_MODE_RFSH_CMD);
61
  pSdram[1] = 0x00000001;                                                            
62
63
  WRITE(AT91C_BASE_SDRC, SDRC_MR, AT91C_SDRC_DBW_16_BITS | AT91C_SDRC_MODE_RFSH_CMD);
64
  pSdram[2] = 0x00000002;                                                            
65
66
  WRITE(AT91C_BASE_SDRC, SDRC_MR, AT91C_SDRC_DBW_16_BITS | AT91C_SDRC_MODE_RFSH_CMD);
67
  pSdram[3] = 0x00000003;                                                            
68
69
  WRITE(AT91C_BASE_SDRC, SDRC_MR, AT91C_SDRC_DBW_16_BITS | AT91C_SDRC_MODE_RFSH_CMD);
70
  pSdram[4] = 0x00000004;                                                            
71
72
  WRITE(AT91C_BASE_SDRC, SDRC_MR, AT91C_SDRC_DBW_16_BITS | AT91C_SDRC_MODE_RFSH_CMD);
73
  pSdram[5] = 0x00000005;                                                            
74
75
  WRITE(AT91C_BASE_SDRC, SDRC_MR, AT91C_SDRC_DBW_16_BITS | AT91C_SDRC_MODE_RFSH_CMD);
76
  pSdram[6] = 0x00000006;                                                            
77
78
  WRITE(AT91C_BASE_SDRC, SDRC_MR, AT91C_SDRC_DBW_16_BITS | AT91C_SDRC_MODE_RFSH_CMD);
79
  pSdram[7] = 0x00000007;                                                            
80
81
  WRITE(AT91C_BASE_SDRC, SDRC_MR, AT91C_SDRC_DBW_16_BITS | AT91C_SDRC_MODE_RFSH_CMD);
82
  pSdram[8] = 0x00000008;                                                            
83
84
  /* Mode Register Set (MRS,LMR) Command: mode=3, burst=1, lat=2 */
85
  WRITE(AT91C_BASE_SDRC, SDRC_MR, AT91C_SDRC_DBW_16_BITS | AT91C_SDRC_MODE_LMR_CMD);
86
  pSdram[9] = 0xcafedede;
87
88
  /* Set Normal mode: mode=0 */
89
  WRITE(AT91C_BASE_SDRC, SDRC_MR, AT91C_SDRC_DBW_16_BITS | AT91C_SDRC_MODE_NORMAL_CMD);  
90
  pSdram[0] = 0x00000000;
91
92
  /* Set Refresh Timer: 7.8usec = 0x175 (depends on BOARD_MCK) */
93
  WRITE(AT91C_BASE_SDRC, SDRC_TR, AT91C_SDRC_DBW_16_BITS | (0x175));
94
95
  for (i = 0; i < 1000; i++);
96
97
  return 0;
98
}

Ich hoffe jemand kann helfen,
Matthias

von MatthiasB (Gast)


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

von Bernd S. (mms)


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

von Youssef (Gast)


Lesenswert?

Hallo,

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

von Bernd S. (mms)


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

von Christian J. (elektroniker1968)


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

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.