Bytefolge lesen

Gast #3075624
Lesenswert?

Hallo, ich bekomme aus einem IC ein jeweils demoduliertes Byte. Auf dem 
Foto ist ein FSK Signal zu sehen (grün), blau ist ein Carrier Detect 
Signal, was quasi als Select verwendet wird, lila das daraufhin vom IC 
(ist Master) erzeugte Taktsignal, gelb Daten. Empfänger ist ein Atmega 
1284 im SPI Slave Modus. Clk idle low, Daten auf rising edge.

Das Problem ist, dass die Bytes nicht richtig vom SPI gelesen werden. Da 
kommt nur selstsamer murks raus. Sende ich z.B. die Folge 
33333333333333333333 kommt 3pÌ3pÎÃ8ÎÆpÎÆpÎ an. Ich lese die Bytes so 
ein:
1
CLRREG_DATA  // IC Datenempfang aktivieren
2
SETRXTX
3
int i=0;
4
int k=0;
5
char rec[21];  // Empfangsspeicher                  
6
SPION  // SPCR |= (1<<SPE);
7
do {                     
8
   while (PINB & (1<<CD_PD));   // auf Carrier Detect low warten
9
   rec[k]=spi_slave_receive(); // Byte empfangen und speichern                       
10
   k++;  
11
   } while(k<21);  // empfängt 20 Zeichen am Stück
12
   for (int l=0;l<k;l++)  // Terminalausgabe
13
   {
14
      uart_putc(rec[l]);
15
   }
16
}
17
        
18
char spi_slave_receive(void)
19
{
20
/* Wait for reception complete */
21
while(!(SPSR & (1<<SPIF)));
22
/* Return Data Register */
23
return SPDR;
24
}
Angehängte Dateien:
Gast #3076798
Lesenswert?

Das wird vom IC selbst erzeugt. Ich habe das Problem auch schon 
eingegrenzt. Und zwar demoduliert der IC immer etwas weiter als 8 Bit, 
also hier z.B. 2 weitere Bit, die dann schon im nächsten gelesenen Byte 
am Anfang stehen. Dadurch verschiebt sich alles weitere. Man muss also 
den SPI deaktivieren, damit alles resettet wird.
#3076843
Lesenswert?

spi schrieb:
> Und zwar demoduliert der IC immer etwas weiter als 8 Bit,
> also hier z.B. 2 weitere Bit, die dann schon im nächsten gelesenen Byte
> am Anfang stehen. Dadurch verschiebt sich alles weitere. Man muss also
> den SPI deaktivieren, damit alles resettet wird.

Sollen die zwei zusätzlichen Bits verworfen oder weiterverwendet werden?
#3077341
Lesenswert?

ja dann müsstest du die SPI nach dem Empfangen eines Bytes abschalten. 
Wenn du mehrere Bytes nacheinander sendest, wie groß sind dann die 
Zwischenabstände, oder kommen die Daten dann sauber nacheinander?
Nächstes Problem - wie lange dauert die Übertragung eines Bytes? Und wie 
lange die Ausgabe des selben über UART? Wenn der UART langsamer ist, 
dann werden die Daten im SPI verpfuscht, da du sie nicht rechtzeitig 
auslesen kannst. Da ist der ATMega als Slave eben nicht optimal, da die 
SPI-Einheit keinen Puffer hat. Evl. den SPI-Interrupt nutzen um die 
Daten zügig abzuholen.

Sascha

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