www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik AT91SAM7 SPI Interface


Autor: Thorsten (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich bin gerade dabei das SPI Interface zu programmieren. Ich habe ein 
SPI Teilnehmer am PA31. Die Initialisierungsroutine sieht wie folgt aus:
BYTE spi_Init(BYTE bChipSelect)
{
  int i;
  AT91PS_PMC pPMC      = AT91C_BASE_PMC;

  // disable
  pSPI->SPI_CR = AT91C_SPI_SPIDIS;

    // disable PIO from controlling MOSI, MISO, SCK (=hand over to SPI)
  // keep CS untouched - used as GPIO pin during init
  pPIOA->PIO_PDR = AT91C_PA12_MISO | AT91C_PA13_MOSI | AT91C_PA14_SPCK; //  | NCPS_PDR_BIT;
  // set pin-functions in PIO Controller
  pPIOA->PIO_ASR = AT91C_PA12_MISO | AT91C_PA13_MOSI | AT91C_PA14_SPCK; /// not here: | NCPS_ASR_BIT;
  
  AT91F_PIO_CfgPeriph(AT91C_BASE_PIOA, SPI_CHIP_SELECT_INCL_PIN, (AT91C_BASE_PIOA->PIO_BSR));
  pPIOA->PIO_PER  |= SPI_CHIP_SELECT_INCL_PIN;   // enable GPIO of CS-pin
  pPIOA->PIO_OER  |= SPI_CHIP_SELECT_INCL_PIN;   // output enable
  pPIOA->PIO_SODR &= SPI_CHIP_SELECT_INCL_PIN;  // set low
  
  
  // enable peripheral clock for SPI ( PID Bit 5 )
  pPMC->PMC_PCER = ( (DWORD) 1 << AT91C_ID_SPI ); // n.b. IDs are just bit-numbers
  
  // SPI enable and reset
  pSPI->SPI_CR = AT91C_SPI_SPIEN | AT91C_SPI_SWRST;
  
  // SPI mode: master, FDIV=0, fault detection disabled
  pSPI->SPI_MR  = AT91C_SPI_MSTR | AT91C_SPI_MODFDIS;
  
  pSPI->SPI_CSR[1] = AT91C_SPI_CPOL | AT91C_SPI_BITS_8 | AT91C_SPI_CSAAT;
  
  // enable
  pSPI->SPI_CR = AT91C_SPI_SPIEN;
  
  return F_OK;
}

void spi_SendByte(BYTE bSendByte)
{
  while( !( pSPI->SPI_SR & AT91C_SPI_TDRE ) ); // transfer compl. wait
  pSPI->SPI_TDR = (WORD)(bSendByte);
}

Betrachte ich jetzt mit dem Oszilloskop MISO/MOSI/SCK sehe ich, dass der 
ChipSelect auf LOW geht und der Clock eine einzige LOW State hat und 
dann dauerhaft HIGH bleibt. Ich erkenne nicht wo meine Fehler ist.
Die Zuordnung PA31 -> NPCS1 -> SPI_CSR[1] ist doch so richtig oder 
nicht???

Wäre über eine Hilfe dankbar.

Gruss THorsten

Autor: Udo (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

versuch es mal so rum

void spi_SendByte(BYTE bSendByte)
{
  pSPI->SPI_TDR = (WORD)(bSendByte);
  while( !( pSPI->SPI_SR & AT91C_SPI_TDRE ) ); // transfer compl. wait
}


Gruß
Udo

Autor: Thorsten (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

danke für deine Antwort.
Das Problem war, dass ich die Chipselectleitung nicht entsprechend im 
Mode Register gesetzt habe.

Jetzt habe ich aber noch ein anderes Problem. Ich möcht über das SPI 
Interface schreiben und gleich lesen.
Also in etwa so:
spi_WriteByte(...);
spi_ReceiveByte(...);

BYTE spi_ReceiveByte(BYTE bChipSelect)
{
  BYTE val = 0;
  while( !( pSPI->SPI_SR & AT91C_SPI_RDRF ) ); // wait for char
  val = (BYTE)( pSPI->SPI_RDR );
  return val;
}

Jetzt habe ich das Problem, dass er nur sendet, aber nichts empfängt. 
Man erkennt, dass er ständig mit 8 Taktzyklen das Byte schreibt und 
wieder von Vorne anfängt.

Noch jemand eine Idee.

Danke

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.