PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : RFM01 Sync. Word - weiß jemand was?



stefan_Z
31.10.2008, 11:25
Im Datenblatt zum RFM01 bin ich auf das Sync. Word gestoßen:
http://www.hoperf.com/pdf/rf01.pdf (Seite 17)

Als FIFO Start-Bedingungen kann man wahlweise festlegen:
1 - VDI
2 - Sync. Word
3 - VDI && Sync. Word
4 - Always

VDI (Valid Data Indicator) ist klar, aber was genau ist das Sync. Byte?
Eine feste Bitfolge? Wenn ja welche? Kann man die ändern?

Mit Bit 1 (ff) vom Output and FIFO Mode Command aktiviert man den FIFO-Fill nach Synchrone Word Empfang. Reset mit 0/1 Schalten.

Als einzige weitere Nennung habe ich hier auf Seite 5 was gefunden:
http://www.hoperf.com/pdf/rf0102tools.pdf
Beim verwendeten Protokoll für das Demoboard steht hier als Sync Word: &h2D &hD4

Weiß jemand näheres dazu?

Zusatzfrage: Die Preamble &hAA &hAA braucht man auch noch? Oder ist das nur, um dem Modul etwas Zeit zum Aufwachen zu geben?

wkrug
31.10.2008, 12:00
Die 0xAA werden zur Synchronisierung des Empfängers gebraucht, Anschließend muss dann noch 0x2D 0xD4 zum Starten des FiFo gesendet werden.
Diese Bytes werden aber dann im RFM verworfen und es kommen nur die gesendeten Nutzbytes in den FiFo

stefan_Z
31.10.2008, 13:34
Ah, schön, dass das nirgendwo steht.
Also gehe ich so vor:
1 - 3x &HAA senden (Preamble)
2 - &h2D &hD4 senden (FIFO starten)
3 - n Daten-Bits senden (wie im Empfänger eingestellt)
4 - Wenn das eingestelltes Limit erreicht ist wird nIRQ vom Empfänger aktiviert und der µC holt sich den FIFO
5 - Der FIFO wird dabei automatisch wieder geleert (?)
6 - Der FIFO wird solange weiter gefüllt, bis man das Sync Word zurücksetzt (ff-Bit 0/1 machen). Das Rücksetzen erledigt der µC, wenn er ein Stopbyte erkennt.

Preamble und Sync Word kann man nicht ändern, nehme ich an?

Zusatzfrage:
Bit 0 (fe) Enable 16 Bit Deep FIFO Mode aktiviert ja den FIFO erst.
Bits f0 bis f3 geben die Größe des FIFO an. Kann ich davon ausgehen, dass 0 hier 1 bedeutet, weil man ja mit 4 Bit maximal den Wert 15 erreicht kann? Macht Sinn bei 16 Bit Puffer insgesamt, oder?

Edit:
Habe Grad noch nen Abschnitt zum Thema Preamble + Sync Word gefunden:
http://www.hoperf.com/pdf/rf02.pdf - Seite 18/19
Ist aber auch wenig aussagekräftig.

wkrug
31.10.2008, 20:22
Im Prinzip ist es so wie Du schreibst
Ich schick Dir mal nen "C" Programmcode wie ich es gemacht hab

Zuerst der Sender:

// Sendestring vorbereiten
void builtstring (void)
{
unsigned char uc_stringbuffer[10];
volatile unsigned char uc_stringlengh;

uc_sendbuffer[0]=0xAA;
uc_sendbuffer[1]=0xAA;
uc_sendbuffer[2]=0xAA;
uc_sendbuffer[3]=0x2D;
uc_sendbuffer[4]=0xD4;
uc_sendbuffer[5]='$';
uc_sendbuffer[6]='3';
uc_sendbuffer[7]=';';
uc_sendbuffer[8]='1';
uc_sendbuffer[9]=';';
uc_sendbuffer[10]=0x00;

itoa (ui_time,uc_stringbuffer);
strcat (uc_sendbuffer,uc_stringbuffer);
strcatf (uc_sendbuffer,";");

ltoa (li_voltage1,uc_stringbuffer);
strcat (uc_sendbuffer,uc_stringbuffer);
strcatf (uc_sendbuffer,";");

ltoa (li_voltage2,uc_stringbuffer);
strcat (uc_sendbuffer,uc_stringbuffer);
strcatf (uc_sendbuffer,";");

ltoa (li_voltage3,uc_stringbuffer);
strcat (uc_sendbuffer,uc_stringbuffer);
strcatf (uc_sendbuffer,";0;0;0;0;");

ltoa (li_temp1,uc_stringbuffer);
strcat (uc_sendbuffer,uc_stringbuffer);
strcatf (uc_sendbuffer,";");

ltoa (li_temp2,uc_stringbuffer);
strcat (uc_sendbuffer,uc_stringbuffer);
strcatf (uc_sendbuffer,";");

ltoa (li_drehzahl,uc_stringbuffer);
strcat (uc_sendbuffer,uc_stringbuffer);
strcatf (uc_sendbuffer,";");

checksum(); /* Checksumme ermitteln und anfügen */

// Stringendebytes anfügen
uc_stringlengh=strlen(uc_sendbuffer);
uc_sendbuffer[uc_stringlengh]=13; /* Carriage Return 13*/
uc_sendbuffer[uc_stringlengh+1]=10; /* Line Feed 10 */
uc_sendbuffer[uc_stringlengh+2]=0; /* Stringende anfügen */
}

Nun die Teile vom Empfängercode:

//FIFO Puffer initialisieren bei Fehlern und Datensatzende
void reset_fifo (void)
{
/* FIFO Command: Enable FIFO, IT level=8, Sync. Patt + VDI, stop FIFO */
#asm ("cbi portb,nsel");
sendbyte(0b11001110);
sendbyte(0b10001001);
#asm ("sbi portb,nsel");
#asm ("nop");

/* FIFO Command: Enable FIFO, IT level=8, Sync. Patt + VDI, start FIFO */
#asm ("cbi portb,nsel");
sendbyte(0b11001110);
sendbyte(0b10001011);
#asm ("sbi portb,nsel");
#asm ("nop");
uc_receivebyte=0;
}

// Empfange Daten vom RFM 01
interrupt [EXT_INT0] void ext_int0_isr(void)
{
unsigned char uc_i=0;
unsigned char uc_buffer=0;
unsigned char uc_check=0;


uc_timeout=0; /* Timeout Zähler zurücksetzen */

/* Die ersten 16 Bit des Statuswortes übergehen */
#asm ("cbi portb,nsel");
sendbyte(0b00000000);
sendbyte(0b00000000);

for(uc_i=0;uc_i<8;uc_i++)/* 8 Bits auslesen */
{


if ((PINB&(1<<3))!=0) /* SDO abfragen = PortB,3 */
{
uc_buffer=(uc_buffer<<1)| 0x01;
}
else
{
uc_buffer=(uc_buffer<<1);
}
clockpulse();
}
#asm ("sbi portb,nsel"); /* nSel Leitung abschalten */
#asm ("nop");

// Hingen noch Reste im Puffer ? oder Puffer Überlauf -> Dann löschen
if((uc_buffer=='$')||(uc_receivebyte>125))
{
uc_receivebyte=1;
uc_receivebuffer[0]='$'; /* Das Erste Byte des Empfangspuffers mit $ beschreiben*/
uc_receivebuffer[1]=0; /* Ein Stringende anfügen*/
}
else
{
uc_receivebuffer[uc_receivebyte]=uc_buffer;
uc_receivebyte++;
uc_receivebuffer[uc_receivebyte]=0; /* Stringende anfügen */
};

if (uc_buffer==10) /* Line Feed wurde empfangen*/
{
reset_fifo();
uc_check=checksum();

if (uc_check==0)
{
newstring=1;
};
uc_receivebyte=0;
}
}