Forum: Mikrocontroller und Digitale Elektronik XMEGA SPI string empfangen


von jtag (Gast)


Lesenswert?

Hallo,

ich habe mir eine kleines Programm geschrieben, welches Daten von SPIF 
nach SPIC sendet, diese empfangenen Daten in einem FIFO puffert und dann 
per Usart an den PC schickt. Als Controller verwende ich einen 
Atxmega128A1. Jetzt habe ich aber das Problem, dass immer nur das letzte 
Zeichen des Strings in den FIFO geschrieben wird und ich nur dieses 
letzte Zeichen empfange (In diesem Fall ein 't'). Die Daten werden aber 
ordnungsgemäß vom Master (SPIF) gesendet. Der Fehler muss also beim 
einlesen der Daten liegen. Leider kann ich den Fehler nicht finden. Hat 
jemand einen Hinweis?

Hier mein Code:
1
volatile FIFO_64 fifo;
2
3
int main(void) {
4
5
...//Initialisierungen usw.
6
7
fifo_init(&fifo);
8
usart_init(9600);
9
10
   while(1) {
11
    //Wenn was im Buffer steht, dann über Usart ausgeben
12
    while(fifo_filled(&fifo)) {
13
      usart_putc(fifo_read(&fifo));
14
    }
15
16
    _delay_ms(1000);
17
18
                //Testnachricht
19
    spiF_send_string("Natternest");
20
    }
21
}
22
23
24
ISR (SPIC_INT_vect) {
25
  char c = spiC_read_char();
26
  
27
  fifo_write(&fifo, c);
28
}

Die Spi-Routinen:
1
 
2
char spiC_read_char(void) {
3
  return SPIC_DATA;
4
  
5
}
6
7
void spiF_send_string(char *s) {
8
  PORTF_OUTCLR |= SPIF_SS;  //SS low
9
  
10
  while(*s) {
11
    SPIF_DATA = *s;
12
    s++;
13
    while(!(SPIF_STATUS & SPI_IF_bm));
14
  }
15
  
16
  PORTF_OUTSET |= SPIF_SS; //SS high
17
}

Danke schonmal

von jtag (Gast)


Lesenswert?

Hat jemand ne Idee?

von jtag (Gast)


Lesenswert?

Hi nochmal,

also der Code funktioniert jetzt. Der obige Abschnitt ist richtig, der 
Fehler lag in einem kleinen Ausschnitt, den ich hier zur 
Übersichtlichkeit weggeschnitten hatte.

Grüße

von fddgddg (Gast)


Lesenswert?

fehler in der :


jtag schrieb:
> fifo_write(&fifo, c);


?

von Gerhard G. (xmega)


Lesenswert?

Hallo,

schreib mal dein Code so..

jtag schrieb:
> PORTF_OUTCLR |= SPIF_SS;  //SS low

Falsch  -> PORTF_OUTCLR |= SPIF_SS;  //SS low

Richtig -> PORTF_OUTCLR = SPIF_SS;  //SS low
Richtig -> PORTF_OUT  |= SPIF_SS;  //SS low


Kann manchmal funktionieren.. aber nicht, wenn du Pins vom selben Port 
mit dem selben Code bearbeitest!

Gruß Xmega

von Gerhard G. (xmega)


Lesenswert?

Hallo,

habe was vergessen,

Wichtig!!

PORTF_OUTCLR = (1 << SPIF_SS)


Gruß Xmega

von jtag (Gast)


Lesenswert?

Hi,

danke für den Tipp. Das habe ich jetzt korrigiert.

@Gerhard:
Ein kleiner Fehler ist noch in deinem ersten Post:
"Richtig -> PORTF_OUT  |= SPIF_SS;  //SS low"  lässt den Pin high 
werden. Ich denke du meintest:
1
PORTF_OUT  &= ~SPIF_SS;  //SS low

danke und grüße,
jtag

von Gerhard G. (xmega)


Lesenswert?

Hallo,

in der Schnelle..

Alles klar!

Gruß Xmega

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.