Forum: Mikrocontroller und Digitale Elektronik SPI-Initialisierung von zwei Geräte über den gleichen Bus


von Yann B. (yann)


Angehängte Dateien:

Lesenswert?

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?

von Rainer U. (r-u)


Lesenswert?

Yann B. schrieb:
> die über den gleichen SPI
> Bus 0 geroutet sind

Was heißt das (skizze)? Wie schaltest Du die CS-Leitungen?

von Timmo H. (masterfx)


Lesenswert?

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
von Stephan (Gast)


Lesenswert?

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.

von Yann B. (yann)


Angehängte Dateien:

Lesenswert?

Rainer U. schrieb:
> Was heißt das (skizze)?

von Yann B. (yann)


Lesenswert?

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?

von Stephan (Gast)


Lesenswert?

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!

von Yann B. (yann)


Lesenswert?

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.

von Yann B. (yann)


Lesenswert?

cool, dke Stephan. Ich probiere mal aus und melde mich später wieder.

: Bearbeitet durch User
von Stephan (Gast)


Lesenswert?

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)

von Yann B. (yann)


Lesenswert?

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.

von Stephan (Gast)


Lesenswert?

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)

von Yann B. (yann)


Angehängte Dateien:

Lesenswert?

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
von Stephan (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.