|
christian mock <cm@tahina.priv.at> wrote:
>ich glaub nämlich, das datasheet belügt uns: ich interpretiere
>jedenfalls die graphik "Typical TX register usage" auf s. 24 in
>rf12.pdf so, daß ein dummy-byte ausreichend ist. scheint aber nicht
so
>zu sein, wenn ich nämlich in rf12 send 2 dummy-bytes sende, schaut
die
>übertragung (im kurzen test) zuverlässig aus ohne doppeltes
senden.
Also jetzt wo ich das Diagramm sehe <BG>, muss ich dir zustimmen.
Wobei aber auch von der Baudrate und der Prozessorgeschwindigkeit
abhaengt. Wenn dir der RF12 sagt das er jetzt ein neues Byte
gebrauchen kann, dann hat er ja kurz vorher 8Bit freigemacht und
sendet das obere Bit der anderen 8Bit.
Wenn man jetzt eine sehr hohe Baudrate haette, und sich ausserdem beim
holen des naechstens Bytes etwas Zeit laesst, oder man selber die SPI
Anbindung relativ langsam betreibt dann koennte er ja schon mehr Bits
gesendet haben und dann ist bis zum abschalten bereits wieder ein Byte
ganz draussen.
Bei mir war es aber definitiv so das immer die letzten beiden Bytes
zerstoert waren.
> rf12 cmd(RF12 POWER SETTING, RF12 ET | RF12 DC); // turn on xmit
> rf12 send((uint8 t *)&data, sizeof(data));
> rf12 cmd(RF12 POWER SETTING, RF12 DC); // turn off
Wenn ich das richtig sehe dann sollte es nach dem einschalten noch
eine gewisse Wartezeit geben damit Clock, Pll hochfahren. Bei mir
klappte es zwar auch ohne dem, aber ich sende sichheiteshalber mal 6x
0xAA vor der Uebertragung.
Also so:
rf12 txmode(); /* RF12 in Sendebetrieb */
rf12 txbyte(0xaa); /* Das braucht der andere */
rf12 txbyte(0xaa); /* Empfaenger um sich zu */
rf12 txbyte(0xaa); /* syncronisieren */
rf12 txbyte(0xaa);
rf12 txbyte(0xaa);
rf12 txbyte(0xaa);
rf12 txbyte(0x2d); /* Kennung fuer Empfaenger */
rf12 txbyte(0xd4); /* Damit er seine Fifo einschaltet */
for (i=0;i<sizeof(union multibus def);i++)
{
rf12 txbyte(MultiBlockS.b[i]);
if ((RF12Err.bit.Timeout) || (RF12Err.bit.TxErr))
{
MultiErr.bit.TxErr=1;
rf12 off(); /* RF12 ausschalten zum Stromsparen!
*/
return(FALSE);
}
}
rf12 txbyte(0xaa); /* Zwei Dummybytes senden. Wir duerfen */
rf12 txbyte(0xaa); /* den Sender nicht abschalten bevor der */
/* Puffer der Nutzbytes leer ist! */
rf12 off(); /* RF12 ausschalten zum Stromsparen! */
Olaf
|