I meet a problem using Air Boosterpack on launchpad MSP430F5529.
I'm trying to make a small sensor network, a star network. 1 gateway and 2 sensors.
The gateway sends a SYNC command to broadcast address.
Each sensor listens for a random time if someone is trasmitting, if not it sends a RTS (Request To Send) command to gateway. The gateway sends back a CTS (Clear To Send).
Once the sensor receives the CTS it will send back the data to the gateway.
Very often gateway or sensor freezes after sending the packet and never exit from the "while(Radio.busy())" cycle.
Attached here there are the gateway and sensor firmware. Please find the string "//IT FREEZES HERE!!!!" in order to see where the code is blocked.
#include <SPI.h>
#include <AIR430BoostETSI.h>
// -----------------------------------------------------------------------------
/**
* Defines, enumerations, and structure definitions
*/
#define ADDRESS_LOCAL 0x04
#define ADDRESS_REMOTE 0x02
// identify a set of type of data received/send (command in cordata struct)
#define SYNC 1
#define CTS 2
#define RTS 3
#define SET 4
#define DATA 5
#define ACK 7
#define RLED P1_0
#define GLED P4_7
/**
* sPacket - packet format.
*/
struct sPacket
{
uint8_t from; // Local node address that message originated from
uint8_t message[59]; // Local node message [MAX. 59 bytes]
};
// -----------------------------------------------------------------------------
/**
* Global data
*/
struct sPacket rxPacket, txPacket;
int timeout = 300;
void setup()
{
startled();
// Setup serial for debug printing.
Serial.begin(115200);
Serial.print("SENSOR, address:");
Serial.println(ADDRESS_LOCAL);
// The radio library uses the SPI library internally, this call initializes
// SPI/CSn and GDO0 lines. Also setup initial address, channel, and TX power.
Radio.begin(ADDRESS_LOCAL, CHANNEL_1, POWER_MAX);
}
void loop()
{
blinkled(GLED, 1, 50);
///WAIT SYNC
rxPacket.from=0; // Local node address that message originated from
memset(rxPacket.message,0,sizeof(rxPacket.message));
while(Radio.busy()){
Serial.println("BUSY RX SYNC^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^");
delay(5);
}
if(Radio.receiverOn((unsigned char*)&rxPacket, sizeof(rxPacket), timeout) > 0)
{
if(Radio.getCrcBit()!=1)
{
return;
}
}
if (rxPacket.message[0] != SYNC) {
Serial.println("NO SYNC");
return;
}
Serial.println("SYNC ARRIVED");
//CARRIER SENSE
rxPacket.from=0; // Local node address that message originated from
memset(rxPacket.message,0,sizeof(rxPacket.message));
while(Radio.busy()){
Serial.println("BUSY CARIER SENSE^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^");
delay(5);
}
if(Radio.receiverOn((unsigned char*)&rxPacket, sizeof(rxPacket), 100+random(timeout)) > 0)
{
Serial.println("CARRIER BUSY ********************************************");
return;
}
Serial.println("CARRIER FREE");
///RTS
delay(20); //attesa per dare il tempo al gateway di andare in rx
txPacket.from = ADDRESS_LOCAL;
memset(txPacket.message, 0, sizeof(txPacket.message));
txPacket.message [0] = 3;
txPacket.message [1] = 1;
txPacket.message [2] = 1;
txPacket.message [3] = 1;
Radio.transmit(ADDRESS_BROADCAST, (unsigned char*)&txPacket, sizeof(txPacket));
Serial.println("SENT RTS");
///WAIT CTS
rxPacket.from=0; // Local node address that message originated from
memset(rxPacket.message,0,sizeof(rxPacket.message));
delay(80);
while(Radio.busy()){
Serial.println("BUSY RX CTS^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^"); //IT FREEZES HERE!!!!
delay(5);
}
if(Radio.receiverOn((unsigned char*)&rxPacket, sizeof(rxPacket), timeout) > 0)
{
if(Radio.getCrcBit()!=1)
{
Serial.println("NO CTS >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>");
return;
}
}
if (rxPacket.message[0] == CTS) {
Serial.println("CTS ARRIVED");
Serial.println("");
blinkled(RLED, 1, 50);
}
else Serial.println("ERROR RECEIVING CTS");
delay(300);
}
void blinkled(uint8_t led, uint8_t time, uint8_t delayTime){
for(int i=0; i<time; i++){
digitalWrite(led, HIGH); // turn the LED on (HIGH is the voltage level)
delay(delayTime);
digitalWrite(led, LOW); // turn the LED off by making the voltage LOW
delay(delayTime);
}
}
void startled(){
pinMode(RLED, OUTPUT);
pinMode(GLED, OUTPUT);
}
GATEWAY:
#include <SPI.h>
#include <AIR430BoostETSI.h>
// -----------------------------------------------------------------------------
/**
* Defines, enumerations, and structure definitions
*/
#define ADDRESS_LOCAL 0x02
// identify a set of type of data received/send (command in cordata struct)
#define SYNC 1
#define CTS 2
#define RTS 3
#define SET 4
#define DATA 5
#define RLED P1_0
#define GLED P4_7
/**
* sPacket - packet format.
*/
struct sPacket
{
uint8_t from; // Local node address that message originated from
uint8_t message[59]; // Local node message [MAX. 59 bytes]
};
// -----------------------------------------------------------------------------
/**
* Global data
*/
struct sPacket rxPacket, txPacket;
int timeout = 300;
void setup()
{
startled();
// Setup serial for debug printing.
Serial.begin(115200);
Serial.print("GATEWAY, address:");
Serial.println(ADDRESS_LOCAL);
// The radio library uses the SPI library internally, this call initializes
// SPI/CSn and GDO0 lines. Also setup initial address, channel, and TX power.
Radio.begin(ADDRESS_LOCAL, CHANNEL_1, POWER_MAX);
}
void loop()
{
blinkled(GLED, 1, 50);
///SEND SYNC
txPacket.from = ADDRESS_LOCAL;
memset(txPacket.message, 0, sizeof(txPacket.message));
txPacket.message [0] = SYNC;
txPacket.message [1] = 1;
txPacket.message [2] = 1;
txPacket.message [3] = 1;
while(Radio.busy()){
Serial.println("BUSY TX SYNC^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^");
delay(5);
}
Radio.transmit(ADDRESS_BROADCAST, (unsigned char*)&txPacket, sizeof(txPacket));
Serial.println("SYNC SENT");
delay(40);
///WAIT RTS
rxPacket.from=0; // Local node address that message originated from
memset(rxPacket.message,0,sizeof(rxPacket.message));
while(Radio.busy()){
Serial.println("BUSY RX RTS^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^"); //IT FREEZES HERE!!!!
delay(5);
}
if(Radio.receiverOn((unsigned char*)&rxPacket, sizeof(rxPacket), timeout) > 0)
{
if(Radio.getCrcBit()!=1)
{
return;
}
}
if (rxPacket.message[0] != RTS) {
Serial.println("NO RTS");
return;
}
Serial.print("RTS ARRIVED from: ");
Serial.println(rxPacket.from);
///SEND CTS
delay(20); //wait
txPacket.from = ADDRESS_LOCAL;
memset(txPacket.message, 0, sizeof(txPacket.message));
txPacket.message [0] = CTS;
txPacket.message [1] = 1;
txPacket.message [2] = 1;
txPacket.message [3] = 1;
while(Radio.busy()){
Serial.println("BUSY TX CTS^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^");
delay(5);
}
Radio.transmit(rxPacket.from, (unsigned char*)&txPacket, sizeof(txPacket));
Serial.println("CTS SENT");
Serial.println("");
delay(100);
}
void blinkled(uint8_t led, uint8_t time, uint8_t delayTime){
for(int i=0; i<time; i++){
digitalWrite(led, HIGH); // turn the LED on (HIGH is the voltage level)
delay(delayTime);
digitalWrite(led, LOW); // turn the LED off by making the voltage LOW
delay(delayTime);
}
}
void startled(){
pinMode(RLED, OUTPUT);
pinMode(GLED, OUTPUT);
}