Hallo zusammen, ich habe ein kleines Problem mit SPI und ich hoffe Ihr könnt mir helfen. Es geht um die Kommunikation eines AVR32 (AT32uc3c1512) und eines SPI-Slaves (ET1200 (EtherCAT)). Der AVR32 sendet die Addresse des zu lesenden Registers (2 Byte) aber danach passiert nichts mehr. Ich schreibe ein DUMMY-Byte aber das kommt nicht an. Wähle ich ein anderes CS sendet der AVR32 zwei Mal hintereinander. Am Logic analyzer sehe ich, dass der Slave die MISO-Leitung unten hält. Das steht auch so im Datenblatt und ist nicht zu ändern. Nun meine Frage: Kann ich dem AVR32 irgendwie abgewöhnen auf de MISO-Leitung zu lauschen? Würde es ausreichen wenn ich einfach das DUMMY-Byte in das TDR-Register schreibe? Implementiert habe ich das ganze wie hier beschrieben http://asf.atmel.com/docs/latest/common.components.memory.sd_mmc.unit_tests.evk1100/html/avr32_drivers_spi_quick_start.html beschrieben, nur halt mit 16 statt 8 Bit. In der while()-Schleife nach dem zweiten spi_put(...) bleibt er hängen. Auf der Leitung kommt nichts an. Habt Ihr einen Tipp für mich? Gruß Felix
Gast
#4020792
Felix D. schrieb: > Kann ich dem AVR32 irgendwie abgewöhnen auf de MISO-Leitung zu lauschen? Nein. Bei SPI laufen die Daten immer auf beiden Datenleitungen synchron.
Felix D. schrieb: > Nun meine Frage: > Kann ich dem AVR32 irgendwie abgewöhnen auf de MISO-Leitung zu lauschen? Wozu sollte das gut sein? Dir ist das grundlegende Konzept des SPI mit den gekoppelten Schieberegistern bekannt? Es wird immer gleichzeitig gesendet und empfangen, mit jedem SCLK Takt ein Bit: http://www.lothar-miller.de/s9y/categories/17-SPI Ein Slave "sendet2 nicht von sich aus. Der Master muss vom Slave die Daten "abholen". Wenn du also von deinem Slave etwas willst, dann muss der SPI Takt weiterlaufen. Das wird gemacht, indem irgendwas vom Master zum Slave gesendet wird... Allgemein: lies deine Frage mal so, wie wenn du von deinem Problem absolut NICHTS wüsstest. So geht es uns: wir kennen dein Problem nicht. Wenn dir dann klar wird, was gemeint ist, dann drücke auf den "Absenden"-Knopf. Wenn nicht, dann füge die nötige Information (Bilder vom LA, Code, Schaltplan,...) dazu.
Gast
#4020997
Hallo, danke für die Antworten und entschuldigt bitte meine missverständliche Ausdrucksweise. War spät gestern. Da, die grundlegende Funktionsweise von SPI ist bekannt. Mein Problem ist halt, dass der AVR32 nicht weiter taktet. Ich habe mal Screenshots vom LA hinzugefügt. Ich hoffe Ihr seht was ich meine. Bei dem zweiten Screenshot ist ein anderes CS ausgewählt. Der verwendete Code ist der aus dem Link im ersten Post mit marginalen Änderungen auf das verwendete Pinout. Ich habe das Ganze um eine Statusfunktion erweitert, damit ich sehen kann wo es hängt. Alle Chips, und auch der LA sprechen SPI-Mode 3.
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
11 | |
12 | |
13 | |
14 | |
15 | |
16 | |
17 | |
18 | |
19 | |
20 | |
21 | |
22 | |
23 | |
24 | |
25 | |
26 | |
27 | |
28 | |
29 | |
30 | |
31 | |
32 | |
33 | |
34 | |
35 | |
36 | |
37 | |
38 | |
39 | |
40 | |
41 | |
42 | |
43 | |
44 | |
45 | |
46 | |
47 | |
48 | |
49 | |
50 | |
51 | |
52 | |
53 | |
54 | |
55 | |
56 | |
57 | |
58 | |
59 | |
60 | |
61 | |
62 | |
63 | |
64 | |
65 | |
66 | |
67 | |
68 | |
69 | |
70 | |
71 | |
72 | |
73 | |
74 | |
75 | |
76 | |
77 | |
78 | |
79 | |
80 | |
81 | |
82 | |
83 | |
84 | |
85 | |
86 | |
87 | |
88 | |
89 | |
90 | |
91 | |
92 | |
93 | |
94 | |
95 | |
96 | |
97 | |
98 | |
99 | |
100 | |
101 | |
102 | |
103 | |
104 | |
105 | |
106 | |
107 | |
108 | |
109 | |
110 | |
111 | |
112 | |
113 | |
114 | |
115 | |
116 | |
117 | |
118 | |
119 | |
120 | |
121 | |
122 | |
123 | |
124 | |
125 | |
126 | |
127 | |
128 | |
129 | |
130 | |
131 | |
132 | |
133 | |
134 | |
135 | |
136 | |
137 | |
138 | |
139 | |
140 | |
141 | |
142 | |
143 | |
144 | |
145 | |
146 | |
147 | |
148 | |
149 | |
150 | |
151 | |
152 | |
153 | |
154 | |
155 | |
156 | |
157 | |
158 | |
159 | |
160 | |
161 | |
162 | |
163 | |
164 | |
165 | |
166 | |
167 | |
168 | |
169 | |
170 | |
171 | |
172 | |
173 | |
174 | |
175 | |
176 | |
177 | |
178 | |
179 | |
180 | |
181 | |
182 | |
183 | |
184 | |
185 | |
186 | |
187 | |
188 | |
189 | |
190 | |
191 | |
192 | |
193 | |
194 | |
195 | |
196 | |
197 | |
198 | |
In der vorletzten while()-Schleife, also da wo das SPI_ERROR_TIMEOUT gesetzt wird, bleibt er hängen. Das setzen des Status bedeutet bei mir nur, dass meine beiden Status-LEDs beide leuchten. Ich hoffe damit den Problemnebel der Glaskugel ein wenig gelichtet zu haben.
Schreib Dir ein ganz einfaches Programm, dass 3 Bytes in das SPDR schreibt (immer schön auf das SPIF warten zwischendurch). Dann sollte die Clock-Leitung 3x8 = 24 mal zappeln. Wenn nicht, hast Du ein Verständnisproblem. Wenn es klappt, guck was Dien Programm anders macht.
Ich hab's :-) Das Problem saß, wie zu erwarten, wieder zwischen Stuhl und Tastatur. Den define für die Mode fault detection disable habe ich blöde benahmt, es handelt sich ja schließlich um einen disable.
1 | |
brachte das gewünschte Ergebnis. Ich hab's dann auch gleich anders genannt. Vielen Dank an alle die sich darüber Gedanken gemacht haben. Nächstes Mal bemühe ich mich die Fragen von Anfang an präziser zu stellen. Das Bild zeigt, wie es jetzt am LA aussieht. Gruß Felix
Gast
#4021747
Felix D: schrieb: > War spät gestern. Und noch ein Tip. Achte auf die Bildformate: JPEG ist für Photos optimiert. In Graphiken entstehen bei dieser Kompressionsmethode häßliche Artefakte, weil der Algorithmus mit scharfen Linien und harten Kanten soetwas von überhaupt nicht gut zurecht kommt. PNG ist für solche Dinge das Format der Wahl. Und weder die Icons vom Programm, noch die ungenutze schwarze Fläche des Fensters interessieren hier irgend jemand. Fokusiere deine Darstellung auf den wesentlichen Teil. Und längeren Code kann man in einen Anhang packen. So bekommt man vom Scrollen fast wunde Finger.
Antwort schreiben
Bitte melde dich an, um einen Beitrag zu schreiben.


