Forum: Mikrocontroller und Digitale Elektronik über SPI empfangene/gesendete Daten effizient zwischenspeichern


von Samuel (Gast)


Lesenswert?

Hallo zusammen,
ich möchte 4 bytes pro 50µsec Zyklus empfangen. Mein Controller 
(ADuC7021) hat keine FIFO sondern nur ein 1 byte Senderegister und 
Empfangsregister, welches ständig im Interrupt nachgeladen bzw. geräumt 
werden muß (siehe folgender Code). Im Moment speichere ich die geräumten 
bzw zum senden vorbereiteten Daten in 2 Feldern. Ich habe ziemliche 
Rechenzeitprobleme mit dem Nachladen und ich habe gesehen, dass 
Speichern in ein feld bzw laden aus einem Feld, recht aufwendig ist, 
weil zuerst der Index geholt werden muß etc..... Wie kann man das 
effizienter und doch elegant machen. Gibt es ausser der verwendung von 
Einzelvariablen eine andere Möglichkeit?

Gruß Samuel

unsigned char rec_data[4];
unsigned char snd_data[4];

ISR()
{
  if(fiqsta&SPI_SLAVE)
  {
    rec_data[num_spi_idx]=SPIRX;
    num_spi_idx++;
    SPITX=snd_data[num_spi_idx;
    //..................
    //.............
   }
   else
   if(....)
   //................
}

von michael (Gast)


Lesenswert?

hallo samuel.

auf einem 16bit-µC mit 40MHz hast du rechenzeitprobleme, eine 640kHz-SPI 
zu bedienen? kann ich ja kaum glauben... was machst du denn sonst noch 
mit dem teil?

mein vorschlag:
ein zeiger auf ein 8-byte-array.
dann müßte der µC nur das empfangsregister lesen, die zeigervariable 
inkrementieren (die ja auch auf ein array zeigen kann) und das 
senderegister schreiben.
also im idealfall zwei assemlberbefehle (ohne ISR-overhead und ohne 
rücksetzen des zeigers).

bei dieser möglichkeit liegt abwechselnd ein empfangenes und ein zu 
sendendes byte im selben array. nicht wirklich sauber, aber schnell.

gruß

michael

von michael (Gast)


Lesenswert?

upsi. es wären natürlich drei assembler-befehle. :-)

gruß

michael

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.