Hallo, ich habe zwei Geräte(LCD und SD-Kartenslot), die über den gleichen SPI Bus 0 geroutet sind. Wenn ich die beiden abgetrennt (mit einer InitSPI() für jedes Gerät) steuere laüft alles gut. Jetzt habe ich die beiden Modules in meinem Projekt und das Programm hält bei der SPI-Initialisierung der SD-Karte an. Liegt es vielleicht daran, dass ich die MOSI oder SCLK-Taktleitungen oder die Register (CR) zweimal konfiguriere? Ich möchte gern nur eine Funktion InitSPI.c haben aber ich kann den Mode-Register doch nicht zweimal konfigurieren oder? Weil das LCD z.B auf 9 bit eingestellt ist und der Kartenslot auf 8 Bits. Kurs gesagt sind die beiden Geräte im Mode-Reg anders konfiguriert. Weiß jemank vielleicht, Wie ich dieses Problem lösen kann?
Yann B. schrieb: > die über den gleichen SPI > Bus 0 geroutet sind Was heißt das (skizze)? Wie schaltest Du die CS-Leitungen?
Ich kenne den Controller jetzt nicht. Aber oftmals ist es so, dass du den SPI vorher erstmal deaktiveren musst um bestimmte Einstellungen umzukonfigurieren. Einen getrennten CS nimmst du ja hoffentlich.
:
Bearbeitet durch User
Hi, 2 Init Funktionen auf ein Interface? das geht schief! Es kann immer nur die letzte Funktion ihre Werte in die Register schreiben. Du hast jetzt verschiedene Möglichkeiten. Du rufst vor jedem Schreiben die eigene Init Funktion des Devices vorher auf oder du versuchst das etwas 'freundlicher' zu machen. (Vor der Umkonfiguration IMMER das Interface deaktivieren, wie Timmo sagte!) 'freundlicher': es gibt verschiedene Devices wie du festgestellt hast! du kennst fprintf???? da wird ein File Objekt(Struktur) übergeben das die Information für den zu verwenden Stream enthält. So was in der Art wäre für dich vielleicht auch interessant. Da kannst du dann Informationen zu CS-Pin hinterlegen und die 'komplette' oder Teilkonfiguration des Interfaces.
Timmo H. schrieb: > Aber oftmals ist es so, dass du > den SPI vorher erstmal deaktiveren musst um bestimmte Einstellungen > umzukonfigurieren. deaktivieren!! Und wie macht man das?
wie wäre es mit
1 | s_pSpi->SPI_CR = AT91C_SPI_SPIDIS; |
oder org aus der LIB von Atmel:
1 | //------------------------------------------------------------------------------
|
2 | /// Disables a SPI peripheral.
|
3 | /// \param spi Pointer to an AT91S_SPI instance.
|
4 | //------------------------------------------------------------------------------
|
5 | void SPI_Disable(AT91S_SPI *spi) |
6 | {
|
7 | spi->SPI_CR = AT91C_SPI_SPIDIS; |
8 | }
|
9 | |
10 | //------------------------------------------------------------------------------
|
11 | /// Configures a SPI peripheral as specified. The configuration can be computed
|
12 | /// using several macros (see "SPI configuration macros") and the constants
|
13 | /// defined in LibV3 (AT91C_SPI_*).
|
14 | /// \param spi Pointer to an AT91S_SPI instance.
|
15 | /// \param id Peripheral ID of the SPI.
|
16 | /// \param configuration Value of the SPI configuration register.
|
17 | //------------------------------------------------------------------------------
|
18 | void SPI_Configure(AT91S_SPI *spi, |
19 | unsigned int id, |
20 | unsigned int configuration) |
21 | {
|
22 | AT91C_BASE_PMC->PMC_PCER = 1 << id; |
23 | spi->SPI_CR = AT91C_SPI_SPIDIS; |
24 | // Execute a software reset of the SPI twice
|
25 | spi->SPI_CR = AT91C_SPI_SWRST; |
26 | spi->SPI_CR = AT91C_SPI_SWRST; |
27 | spi->SPI_MR = configuration; |
28 | }
|
schau dir auch mal hier die Configur an!
Stephan schrieb: > (Vor der Umkonfiguration IMMER das Interface deaktivieren, wie Timmo > sagte!) Hi Stephan, geht es beim Deaktivieren des SPI_CLK? oder wie? Stephan schrieb: > du kennst fprintf???? ja kenne ich.
cool, dke Stephan. Ich probiere mal aus und melde mich später wieder.
:
Bearbeitet durch User
Clock? Ich bin mir nicht sicher was du meinst. Einfach im Control Register das Interface deaktivieren. Dann deine NEUEN Einstellungen schreiben und danach das Interface wieder aktivieren. gegeben falls wie in der Funktion SPI_Configure einen SW Reset des Interfaces ausführen (default Werte wieder aktiv!) War jedenfalls früher teilweise nötig, ob das noch aktuell ist weiß ich nicht. (Quelle war damals für mich das AT91 Forum)
Stephan schrieb: > Clock? Vergiss es einfach. Mit spi->SPI_CR = AT91C_SPI_SPIDIS; laüft es. Aber wenn ich das programm mehrmals starte, kommt manchmal vor, dass das Programm sich immer anhält.
der MC beleibt stehen??? oder eher die Schnittstelle hängt? Die Resets für das SPI Interface hast mit eingebaut? welche REV vom AT91SAM7X hast du? ERRATA geschaut? wenn du öfters dieses hier verwendest (oder in der Art)
1 | while ((spi->SPI_SR & AT91C_SPI_TXEMPTY) == 0); |
Dann kann dir hier keiner helfen, den Hänger muss du selber finden. Schreib die Sache vernünftig auf, dann bekommt man auch mit WO der MC hängen bleibt. :-D kennst du das File 'trace' (c + h File), gibs im Verzeichnis 'utillity' oder so, von Atmel. Damit kann mach auch gute Debug Ausgaben erzeugen. Das 'assert' File kann dir bei der Fehlersuche auch gute Unterstützung leisten. (gleiches Verzeichnis)
Stephan schrieb: > der MC beleibt stehen??? > oder eher die Schnittstelle hängt? Sorry, ich habe mich falsch ausgedrückt. Damit meinte ich, dass das Programm stehen blieb: z.B, wenn das Programm startet, sollte ich anhand der Switch Buttons eine Auswahl treffen. Und mit einer Taste prüfe ich, ob die Karte eingelegt ist. Und es kamm also vor, dass wenn ich diese Taste gedrückt hatte, dann passierte nichts und manchmal klappte es. Aber es ist nicht mehr aktuell, weil ich den Reset miteingebaut habe. Stephan schrieb: > Die Resets für das SPI Interface hast mit eingebaut? Ich glaube, dass es daran lag. Jetzt funktioniert es richtig. Ich habe den Reset eingebaut: void SPI_Disable(AT91S_SPI *spi) { spi->SPI_CR = AT91C_SPI_SPIDIS; spi->SPI_CR = AT91C_SPI_SWRST; } Stephan schrieb: > welche REV vom AT91SAM7X hast du? Meinst du das Datasheet? Wenn ja siehe hier oben. Stephan schrieb: > ERRATA geschaut? ERRATA!!! Meinst du die Fehlerbehandlung?
:
Bearbeitet durch User
mit Revision ist die Hardwareversion des Chips gemeint. aus deinem Datasheet mal entnommen:
1 | AT91SAM7X256 Revision C chip ID is 0x275B 0942. |
mit ERRATA sind die Fehlerbeschreibungen des Chips gemeint, je nach Rev. kann es unterschiedliche Fehlerbeschreibungen geben, je höher die Version desto besser sollte der Chip laufen. Leider ist das nicht immer so. Lt. deinem Datasheet hat sich bei den Rev A und Rev. C beim SPI-Interface etwas getan. (grob überflogen) Schau mal bei der DBGU Unit, da gibs es Register die dir einige Infos zum Chip geben können. Ich glaub da war auch die Chip ID zu finden. mir ging es eigentlich um die Fehler:
1 | SPI: SPCK Behavior in Master Mode |
2 | SPI: Chip Select and Fixed Mode |
3 | SPI: Bad Serial Clock Generation on 2nd Chip Select |
Da bin ich damals mit auf die Nase gefallen. Den letzten gib es bei REV C noch.
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.