XMEGA SPI string empfangen

Gast #2417436
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
Gast #2418466
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren