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
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
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 |
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
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
>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
Hallo, wie lang ist Deine SDCK Leitung Pin 38 beim SDRAM?, es ist besser unter 5cm zu beiben
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.