www.mikrocontroller.net

Forum: Compiler & IDEs AT91SAM7 SPI Probleme


Autor: Martin (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

seit kurzem beschäftige ich mich mit der ARM7 Plattform. Arbeite mit dem 
GCC,  mit dem hab ich mich seit dem AVR schon angefreundet. Der ARM7 ist 
ein AT91SAM7S64 auf dem Olimex Entwicklungsboard.

Leider ist die Initalisierung der Onchipfunktionalitäten etwas 
komplizierter als beim guten alten AVR. Genauer gesagt, geht es um die 
SPI in diesem Falle.

Habe mir schon im das Dataheet des Controlleres und die Appnote von 
Atmel dazu durchgelesen, bekomme aber weder ein Clock noch ein MOSI auf 
die entsprechenden Pins.

Zum Initalisieren verwende ich die (glücklicherweise) von Atmel 
bereitgestellten Routinen für den IAR-Compiler. (AT91SAM7S64.h und 
lib_AT91SAM7S64.h)

mein main sieht folgendermaßen aus: (für genauers siehe Anhang)

int main(void)
{//* Begin
    int i;

    AT91F_PMC_EnablePeriphClock ( AT91C_BASE_PMC, 1 << AT91C_ID_PIOA ) ;

  AT91F_PIO_Enable(AT91C_BASE_PIOA, LED);
  AT91F_PIO_OutputEnable(AT91C_BASE_PIOA, LED);

  AT91F_SPI_CfgPIO();
  AT91F_SPI_CfgPMC();
  AT91F_SPI_Enable( AT91C_BASE_SPI );

  AT91C_BASE_SPI->SPI_MR =
    AT91C_SPI_MSTR |  /* we use MASTER only mode */
    AT91C_SPI_PS_FIXED |   /* we only use Fixed Peripheral Select */
    AT91C_SPI_MODFDIS |   /* no Fault protection since there is no 
second master */
    AT91C_SPI_PCS |   /* no peripheral selected */
    ((10<<24) & AT91C_SPI_DLYBCS);  /* 10 Clock Cycles betwenn two 
different chip selects */

  AT91C_BASE_SPI->SPI_CSR[0] = (48<<15);
  AT91C_BASE_SPI->SPI_CSR[1] = (48<<15);
  AT91C_BASE_SPI->SPI_CSR[2] = (48<<15);
  AT91C_BASE_SPI->SPI_CSR[3] = (48<<15);

  while(1) // Loop forever
  {
    AT91F_PIO_SetOutput(AT91C_BASE_PIOA, LED);
      AT91F_SPI_PutChar(AT91C_BASE_SPI,0xFA,0);
    wait();
    AT91F_PIO_ClearOutput(AT91C_BASE_PIOA, LED);
    wait();
  }
}//* End

Wie gesagt, die entsprechende Signal werden nicht generiert, weiß jemand 
was ich in der Sache vielleicht übersehen habe?

Eine andere Frage gleich noch zu der Thematik, zu der ich noch nichts 
gefunden habe. Bei Konfiguration der SPI werden ja die entsprechenden 
Pins  auch auf Ausgang oder Eingang gesetzt? Oder sind sie noch über das 
PIO_OER Register "freizuschalten" ?

Danke im Vorraus
Martin

Autor: Martin Thomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn gar nichts "geht" bei AT91 (und anderen) liegt es oft daran, dass 
die Komponente gar nicht aktiv ist, also nicht mit einem Takt oder Strom 
versorgt wird. Habe die Funktionalität der at91-Library-Funktion 
AT91F_SPI_enable grade nicht im Kopf, vielleicht wird die peripheral 
clock für SPI darin schon aktiviert. Falls nicht - oder einfach nur zum 
Test - "von Hand" aktivieren:
#include "AT91SAM7S64.h"
//...
    AT91PS_PMC pPMC = AT91C_BASE_PMC;
//...
    pPMC->PMC_PCER = ( 1UL << AT91C_ID_SPI );

//Alternativ:
//  AT91F_PMC_EnablePeriphClock (AT91C_BASE_PMC, 1 << AT91C_ID_SPI );


Martin Thomas

Autor: Martin (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hat sich geklärt, fehler war das in AT91C_SPI_PCS der chipselect 
eingetragen werden muß, bin davon ausgegangen, das AT91F_SPI_PutChar, 
dies macht... tut es es auch, aber nicht in für den fixed_mode. danke.

Autor: Timo Boettcher (spida)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Magst du den korrigierten/funktionierenden Beispielcode online stellen?

Autor: ARM(er) (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo!

Ich ärgere mich auch gerade mit der SPI des AT91SAM7. Bin noch recht 
frisch mit dem ARM, habe mich jetzt aber ein gutes Stück durchgeackert.

Die Initialisierung der SPI mache ich ganz ähnlich wie oben in dem 
Beispiel, und sende nun testweise einfach mal was an den nicht 
angeschlossenen Slave. Mit dem Oszi an MOSI sehe ich das auch, auch der 
NPCS0 wird angesteuert, aber an der SPCK-Leitung tut sich nichts. Ist 
immer high, auch wenn ich CPOL verändere.

Martins obige Problemlösung geht mir leider auch nicht ganz ein:
Martin schrieb:
> hat sich geklärt, fehler war das in AT91C_SPI_PCS der chipselect
> eingetragen werden muß,

meint er damit das PCS-Feld im SPI-Mode Register? Ich setze mit (0x0 << 
15) das PCS = 0, ist doch nicht so verkehrt, wenn ich nur einen Slave 
ansteuern will, oder?

Würde mich freuen, wenn mir jemand auf die Sprünge helfen würde,
Danke

Autor: ARM(er) (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Schönen guten Morgen,

leider hat mir das Wochenende auch nicht den Geistesblitz gebracht, der 
mir weiterhilft.

Hat nicht doch jemand einen Tipp, wie ich meinen SPCK zum Wackeln bring?

Autor: ARM(er) (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hat sich erledigt, ich hab am falschen Pin auf den Clock gewartet... 
schäm

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.