SPI-Initialisierung von zwei Geräte über den gleichen Bus

OP #4277232
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?
Angehängte Dateien:
Gast #4277285
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.
Gast #4277341
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!
Gast #4277376
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)
Gast #4277500
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)
OP #4277845
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?
Angehängte Dateien:
Gast #4277899
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren