EFM32 TG110F32 und Daten empfangen

Diablokiller999

Captain
Registriert
Jan. 2007
Beiträge
3.430
Hi Leute!
Der Cortex M3 bzw. EFM32 TG110F32 ist zwar kein Einplatinencomputer sondern µCU, aber ich denke, hier kann mir eventuell auch weiter geholfen werden :D

Folgende Situation:
Ich möchte Daten empfangen, während mein Controller schläft und ihn mit der Verarbeitung beginnen lassen, wenn ein Paket vollständig angekommen ist. Momentan ist die Implementierung folgendermaßen:

Ein Interrupt beim Receive an der UART weckt den Controller auf und schaufelt das empfangene Byte in ein Array. Ist das Paket vollständig ( Paketlänge wird mit übertragen ), verlässt er die While-Schleife mit dem Sleep-Befehl und startet die Verarbeitung mit einer State-Machine.
Code:
#define LENGTH 2

frame_position = 0;			// points to last received frame byte
received_frame[LENGTH] = 30;  // give PACKET-LENGTH a fixed value
while( frame_position !=  received_frame[LENGTH] )	// stays in sleep mode while not received frame length and address
{
	EMU_EnterEM1();
}
Beim Erhalt des ersten Bytes wird zusätzlich ein Timer gestartet, welcher beendet wird sobald das Paket vollständig ist. Sollte es zu einem Verbindungsabbruch kommen und das Paket ist unvollständig, setzt dieser das Array und den Zeiger auf das Array wieder zurück und ein neues Paket kann empfangen werden.

Code:
#define LENGTH 2

void USART0_RX_IRQHandler(void)
{	TIMER0_stop();				// stops timer after new Byte
	TIMER0_start();                        // Starts Timer for incomplete packe
	received_frame[frame_position++] = USART0->RXDATA;     // Store Byte in Package
	if(frame_position == received_frame[LENGTH])				// if full frame received deactivate timer
	{
		TIMER0_stop();
	}
}

void TIMER0_IRQHandler(void)
{
TIMER0_intclear();      		// Clear overflow flag
TIMER0_stop();				// disable timer
frame_position = 0;			// error while getting frame, reset frame position to zero
received_frame[LENGTH] = 30;	// give PACKET-LENGTH a fixed value
}

Das Paket sieht folgendermaßen aus:
2 Byte Präamble + 1 Byte Length + 1 Byte Adresse + 1 Byte Command + 1-3 Byte Parameter + 2 Byte CRC

Dennoch bin ich mit der ganzen Umsetzung nicht zufrieden, da ich schon zwei Interrupts habe die mir ins System eingreifen und sogar verschachtelt auftreten können. Habt ihr eine Idee, wie ich die Anforderung anders erfüllen kann? Ein Interrupt wird wohl nötig sein, anders bekomme ich den Controller nicht auf dem Sleep, aber der Zweite ist eine Notlösung um bei unvollständigem Paket ein zurücksetzen zu ermöglichen.
 
Zurück
Oben