www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik AVR32 problem mit SPI


Autor: Stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Leute,

habe ein kleines Problem mit dem SPI beim AVR32. Nach der 
Initialisierung des SPI0 ist erst mal wie gewünscht MOSI und SCK auf 
High, wenn ich jedoch daten in das TDR Register schreibe passiert 
einfach nichts. Auch im Statusregister SR ist immer nur zu entnehmen, 
dass die Daten nicht gesendet worden sind.

Hier mal mein c-code.

...
void SPI_Configuration()

{

  AVR32_PM.pbamask |= (1<<5);



  AVR32_GPIO.port[0].gper &= ~((1 << 11)|(1 << 12)|(1 << 13)); //Set IO Pins disable for the GPIO Controller

  //Set The Periperial Multiplexer for SPI0

  AVR32_GPIO.port[0].pmr0 &= ~((1 << 11)|(1 << 12)|(1 << 13));

  AVR32_GPIO.port[0].pmr1 &= ~((1 << 11)|(1 << 12)|(1 << 13));



  AVR32_SPI0.mr |= ((1<<0) ); //Master mode),

  AVR32_SPI0.csr0 |= ((1<<0)|(1<<3) | (1<<8));

  AVR32_SPI0.cr |= (1<<0); //Enable SPI0



  int i=0;

  i= AVR32_SPI0.csr0;

}



int main(void)

{

  fcpu_fpba_configure();



  SPI_Configuration();



  unsigned int i=0;



  while(1)

  {

    while( !(AVR32_SPI0.sr & (1<<1)))

        {



        }



    AVR32_SPI0.tdr = 0x000000ff;





  }



  return 0;

}


Vermute mal das es an den Teilern für MCK liegt, aber andere Werte für 
größere Teiler bringen leider auch keine änderung.
Wäre nett wenn mir jemand sagen kann was ich bei den Registern falsch 
gemacht habe.
Gruß
Stefan

Autor: Phil S. (zippi)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

interresand wäre noch zu wissen, welchen avr32 du hast.

Auf anhieb seh ich jetzt keinen fehler, welchen CS nutzt du genau?

Hier ist mal mein Code:
  AVR32_SPI0.mr = 1 << AVR32_SPI_MR_MSTR_OFFSET |                  // SPI0 mode 0 = slave  1 = master
          1 << AVR32_SPI_MR_MODFDIS_OFFSET ;                // SPI0 mode fault detection  0 = enable  1 = disable


  int  csr =   0 << AVR32_SPI_CSR0_CPOL_OFFSET |                   // inactive clock is 0;
        1 << AVR32_SPI_CSR0_NCPHA_OFFSET |                   // Active Edge == rising
        0 << AVR32_SPI_CSR0_CSAAT_OFFSET |                   // deselect device
        8 << AVR32_SPI_CSR0_BITS_OFFSET |                   // (BITS+8)Bits per transfer
        2 << AVR32_SPI_CSR0_SCBR_OFFSET |                    // clk == MCLK / scbr;
        0 << AVR32_SPI_CSR0_DLYBS_OFFSET |                   // 0 = 1 clk delay when chip selected
        0 << AVR32_SPI_CSR0_DLYBCT_OFFSET;                   // 0 = No delay between 2 transfers.AVR32_SPI.csr0 = csr;

  AVR32_SPI0.csr0 = csr;
  AVR32_SPI0.csr1 = csr;
  AVR32_SPI0.csr2 = csr;
  AVR32_SPI0.csr3 = csr;

  AVR32_SPI0.cr = AVR32_SPI_CR_SPIEN_MASK;                    // Enable SPI0

  while((AVR32_SPI0.sr & AVR32_SPI_SR_SPIENS_MASK)!= AVR32_SPI_SR_SPIENS_MASK);  // Wait for enable status

Der geht bei mir aufjedenfall.

gruß
Zippi

Autor: Stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mal danke für die schnelle Antwort, werd mal deinen Code gleich 
ausprobieren.

verwende einen AT32UC3A1512, und verwende den CS0

Autor: Phil S. (zippi)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Stefan schrieb:
> Mal danke für die schnelle Antwort, werd mal deinen Code gleich
> ausprobieren.
>
> verwende einen AT32UC3A1512, und verwende den CS0

Ah ok schon. Der code ist auch für einen AT32UC3A1512. Für das CS habe 
ich aber ein GPIO genommen, trozdem sollte es auch so gehen.

Hier mal meine Sende routine:
AVR32_SPI0.tdr =data[0];

while((AVR32_SPI0.sr & AVR32_SPI_SR_TDRE_MASK)==0);    // The last data written in the Transmit Data Register has been transferred to the serialize

data[] ist ein char array.

gruß

Autor: Stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also code funktioniert, meiner eigentlich auch. Hatte nur vergessen, das 
die Übertragung einfach nicht funktioniert wenn man im Step modus durch 
den code geht.

Gruß
Stefan

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.