Added calibration to channel switch if currently in receive mode. Added explicit checks for transmission activity before channel switch

This commit is contained in:
adamdunkels 2008-01-24 13:09:16 +00:00
parent af73a358f4
commit dc70ac2584

View file

@ -28,7 +28,7 @@
* *
* This file is part of the Contiki operating system. * This file is part of the Contiki operating system.
* *
* @(#)$Id: simple-cc2420.c,v 1.25 2008/01/23 14:57:19 adamdunkels Exp $ * @(#)$Id: simple-cc2420.c,v 1.26 2008/01/24 13:09:16 adamdunkels Exp $
*/ */
/* /*
* This code is almost device independent and should be easy to port. * This code is almost device independent and should be easy to port.
@ -158,14 +158,11 @@ on(void)
static void static void
off(void) off(void)
{ {
uint8_t spiStatusByte;
PRINTF("off\n"); PRINTF("off\n");
receive_on = 0; receive_on = 0;
/* Wait for transmission to end before turning radio off. */ /* Wait for transmission to end before turning radio off. */
do { while(status() & BV(CC2420_TX_ACTIVE));
spiStatusByte = status();
} while(spiStatusByte & BV(CC2420_TX_ACTIVE));
strobe(CC2420_SRFOFF); strobe(CC2420_SRFOFF);
DISABLE_FIFOP_INT(); DISABLE_FIFOP_INT();
@ -274,23 +271,22 @@ simple_cc2420_send(const void *payload, unsigned short payload_len)
int i; int i;
uint8_t total_len; uint8_t total_len;
struct timestamp timestamp; struct timestamp timestamp;
GET_LOCK(); GET_LOCK();
RIMESTATS_ADD(lltx); RIMESTATS_ADD(lltx);
/* Wait for any previous transmission to finish. */ /* Wait for any previous transmission to finish. */
while(status() & BV(CC2420_TX_ACTIVE)); while(status() & BV(CC2420_TX_ACTIVE));
/* Write packet to TX FIFO. */ /* Write packet to TX FIFO. */
strobe(CC2420_SFLUSHTX); strobe(CC2420_SFLUSHTX);
total_len = payload_len + TIMESTAMP_LEN + FOOTER_LEN; total_len = payload_len + TIMESTAMP_LEN + FOOTER_LEN;
FASTSPI_WRITE_FIFO(&total_len, 1); FASTSPI_WRITE_FIFO(&total_len, 1);
FASTSPI_WRITE_FIFO(payload, payload_len); FASTSPI_WRITE_FIFO(payload, payload_len);
#if SIMPLE_CC2420_CONF_TIMESTAMPS #if SIMPLE_CC2420_CONF_TIMESTAMPS
timestamp.authority_level = timesynch_authority_level(); timestamp.authority_level = timesynch_authority_level();
timestamp.time = timesynch_time(); timestamp.time = timesynch_time();
@ -327,6 +323,8 @@ simple_cc2420_send(const void *payload, unsigned short payload_len)
ENERGEST_OFF(ENERGEST_TYPE_LISTEN); ENERGEST_OFF(ENERGEST_TYPE_LISTEN);
ENERGEST_ON(ENERGEST_TYPE_TRANSMIT); ENERGEST_ON(ENERGEST_TYPE_TRANSMIT);
/* We wait until transmission has ended so that we get an
accurate measurement of the transmission time.*/
while(status() & BV(CC2420_TX_ACTIVE)); while(status() & BV(CC2420_TX_ACTIVE));
#if SIMPLE_CC2420_CONF_TIMESTAMPS #if SIMPLE_CC2420_CONF_TIMESTAMPS
@ -347,7 +345,7 @@ simple_cc2420_send(const void *payload, unsigned short payload_len)
ENERGEST_ON(ENERGEST_TYPE_LISTEN); ENERGEST_ON(ENERGEST_TYPE_LISTEN);
RELEASE_LOCK(); RELEASE_LOCK();
return 0; /* Transmission has started. */ return 0;
} }
} }
@ -419,8 +417,18 @@ simple_cc2420_set_channel(int c)
* Writing RAM requires crystal oscillator to be stable. * Writing RAM requires crystal oscillator to be stable.
*/ */
while(!(status() & (BV(CC2420_XOSC16M_STABLE)))); while(!(status() & (BV(CC2420_XOSC16M_STABLE))));
/* Wait for any transmission to end. */
while(status() & BV(CC2420_TX_ACTIVE));
setreg(CC2420_FSCTRL, f); setreg(CC2420_FSCTRL, f);
/* If we are in receive mode, we issue an SRXON command to ensure
that the VCO is calibrated. */
if(receive_on) {
strobe(CC2420_SRXON);
}
} }
/*---------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------*/
void void