Forum: Mikrocontroller und Digitale Elektronik Xmega128A3 SPI Problem


von thunder3000X (Gast)


Lesenswert?

Schönen Samstag Nachmittag wünsch ich euch!

Ich habe ein Problem mit dem XMEGA SPI Modul. Und zwar bekomme ich es 
einfach nicht zum laufen. Programmiert habe ich mit der Anleitung, 
folgenden Tutorials:
http://www.stromflo.de/dokuwiki/doku.php?id=xmega-c-tutorial#spi
Ich habe die Test LEDs meines Boards zum "debuggen" hergenommen.
1
//Hardware Test Programm
2
//DA 11/12
3
 
4
#include <avr/io.h>
5
#include "clksys_driver.h"
6
7
int main(void)
8
{  
9
  // LED init
10
  PORTA.DIR |= (1<<PIN4);    // TESTOUTPUT0 LED
11
  PORTA.DIR |= (1<<PIN5);    // TESTOUTPUT1 LED
12
  PORTA.DIR |= (1<<PIN6);    // TESTOUTPUT2 LED
13
  PORTA.DIR |= (1<<PIN7);    // TESTOUTPUT3 LED
14
  
15
  // Quarz Init
16
  // Oszillator XOSC konfigurieren (12..16MHz, 256 clocks startup time)
17
  CLKSYS_XOSC_Config( OSC_FRQRANGE_12TO16_gc, false, OSC_XOSCSEL_XTAL_256CLK_gc );
18
  // Oszillator XOSC enable
19
  CLKSYS_Enable( OSC_XOSCEN_bm );
20
  // Warten bis der Oszillator bereit ist
21
  do {} while ( CLKSYS_IsReady( OSC_XOSCRDY_bm ) == 0 );
22
  // PLL source ist XOSC, Multiplikator x2
23
  CLKSYS_PLL_Config( OSC_PLLSRC_XOSC_gc, 2 );
24
  // Enable PLL
25
  CLKSYS_Enable( OSC_PLLEN_bm );
26
  // Prescalers konfigurieren
27
  CLKSYS_Prescalers_Config( CLK_PSADIV_1_gc, CLK_PSBCDIV_1_1_gc );
28
  // Warten bis PLL locked
29
  do {} while ( CLKSYS_IsReady( OSC_PLLRDY_bm ) == 0 );
30
  // Main Clock Source ist Ausgang von PLL
31
  CLKSYS_Main_ClockSource_Select( CLK_SCLKSEL_PLL_gc );
32
33
  // IO Init  
34
  PORTA.DIR &= ~(1<<PIN0);  // TESTINPUT0  Taster
35
  PORTA.PIN0CTRL |= 0x18;    // Pullup
36
  PORTA.DIR &= ~(1<<PIN1);  // TESTINPUT1  Taster
37
  PORTA.PIN1CTRL |= 0x18;    // Pullup
38
  PORTA.DIR &= ~(1<<PIN2);  // TESTINPUT2  Jumper
39
  PORTA.PIN2CTRL |= 0x18;    // Pullup
40
  PORTA.DIR &= ~(1<<PIN3);  // TESTINPUT3  Jumper
41
  PORTA.PIN3CTRL |= 0x18;    // Pullup
42
  PORTE.DIR |= (1<<PIN0);    // LNA_EN cc1190
43
  PORTE.DIR |= (1<<PIN1);    // PA_EN cc1190
44
  PORTE.DIR |= (1<<PIN2);    // HGM cc1190
45
    
46
  //SPI Modus wählen, Vorteiler wählen , SPI aktivieren, Double Speed aktivieren, SPI Master Modus aktivieren
47
    SPIE.CTRL =  SPI_MODE_0_gc | SPI_PRESCALER_DIV4_gc | (1<< SPI_ENABLE_bp)|(1<< SPI_CLK2X_bp) |(1<< SPI_MASTER_bp);   
48
  // Interrupt ausschalten
49
  SPIE.INTCTRL = SPI_INTLVL_OFF_gc;
50
    // SPI Status auf 0 setzen
51
  SPIE.STATUS = 0;
52
  
53
    while(1)
54
    {
55
        // Taster0 abfragen
56
    
57
    if (!(PORTA.IN & 0x01))
58
      PORTA.OUTSET |= 0xf0;
59
    else
60
      PORTA.OUTCLR |= 0xf0;
61
    
62
       // Taster1 abfragen
63
64
    if (!(PORTA.IN & 0x02))
65
    {
66
         _delay_ms(10);              // entprellen
67
      SPIE.DATA = 0b01010101;         // test daten  
68
      while(!(SPIE.STATUS & (1<<SPI_IF_bp)))  // warten bis 
69
      {
70
        PORTA.OUTSET |= 0xf0;        // LEDs ein            
71
      }
72
      PORTA.OUT &= ~0xf0;            // LEDs aus
73
    }
74
    
75
    }
76
}

Wie man sieht setze ich die LEDs, wenn er auf das Flag wartet und setzt 
sie zurück wenn er mit dem Senden fertig ist, nur ist er nie fertig.
Ich habe bereits probiert MOSI und MISO zu verbinden, auch habe ich 
probiert MISO und MOSI als Ausgänge zu setzen, das hat aber auch nicht 
den gewünschten Effekt erzielt. Ein Hardwareproblem schließe ich aus, da 
ich es auf zwei verschiedenen Boards und auf dem Xplained getestet habe.

MfG
Benjamin M

von Knut B. (Firma: TravelRec.) (travelrec) Benutzerseite


Lesenswert?

MOSI muss Ausgang sein, SCK muss Ausgang sein, /SS muss Ausgang sein.

von thunder3000X (Gast)


Lesenswert?

AHH du bist mein HELD :) danke :)

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.