1
0
mirror of https://github.com/RIOT-OS/RIOT.git synced 2025-12-26 15:03:53 +01:00

Merge pull request #1385 from rousselk/fix-cc2420-driver-cca

Fix a nasty race condition in CCA determination on CC2420
This commit is contained in:
Kévin Roussel 2014-07-08 17:01:34 +02:00
commit a13066a0a6
3 changed files with 27 additions and 6 deletions

View File

@ -17,6 +17,7 @@
#include "cc2420.h"
#include "cc2420_arch.h"
#include "cc2420_spi.h"
#define ENABLE_DEBUG (1)
#include "debug.h"
@ -106,14 +107,21 @@ uint8_t cc2420_get_sfd(void)
return CC2420_SFD;
}
#define MAX_RSSI_WAIT 1000
uint8_t cc2420_get_cca(void)
{
uint8_t status;
long c = 0;
long count = 0;
do {
unsigned int sr = disableIRQ();
cc2420_spi_select();
status = cc2420_txrx(NOBYTE);
if (c++ == 1000000) {
core_panic(0x2420, "cc2420_get_cca() alarm");
cc2420_spi_unselect();
restoreIRQ(sr);
count++;
if (count >= MAX_RSSI_WAIT) {
core_panic(0x2420, "cc2420_get_cca(): RSSI never valid!");
}
} while (!(status & CC2420_STATUS_RSSI_VALID));
return CC2420_GIO1;

View File

@ -17,6 +17,7 @@
#include "cc2420.h"
#include "cc2420_arch.h"
#include "cc2420_spi.h"
#define ENABLE_DEBUG (0)
#include "debug.h"
@ -109,14 +110,21 @@ uint8_t cc2420_get_fifop(void)
return CC2420_GDO2;
}
#define MAX_RSSI_WAIT 1000
uint8_t cc2420_get_cca(void)
{
uint8_t status;
long c = 0;
long count = 0;
do {
unsigned int sr = disableIRQ();
cc2420_spi_select();
status = cc2420_txrx(NOBYTE);
if (c++ == 1000000) {
core_panic(0x2420, "cc2420_get_cca() alarm");
cc2420_spi_unselect();
restoreIRQ(sr);
count++;
if (count >= MAX_RSSI_WAIT) {
core_panic(0x2420, "cc2420_get_cca(): RSSI never valid!");
}
} while (!(status & CC2420_STATUS_RSSI_VALID));
return CC2420_CCA;

View File

@ -32,6 +32,7 @@
#include "cc2420.h"
#include "cc2420_arch.h"
#include "cc2420_spi.h"
#define ENABLE_DEBUG (1)
#include "debug.h"
@ -128,7 +129,11 @@ uint8_t cc2420_get_cca(void)
uint8_t status;
long count = 0;
do {
unsigned int sr = disableIRQ();
cc2420_spi_select();
status = cc2420_txrx(NOBYTE);
cc2420_spi_unselect();
restoreIRQ(sr);
count++;
if (count >= MAX_RSSI_WAIT) {
core_panic(0x2420, "cc2420_get_cca(): RSSI never valid!");