Quantcast
Channel: MSP430 Technical Forums
Viewing all articles
Browse latest Browse all 2077

Air Boosterpack on launchpad MSP430F5529 problem.

$
0
0
Hello everyone!
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.
 
 
Before each Rx or Tx operation I've put a "while(Radio.busy())" as written in all examples.
Very often gateway or sensor freezes after sending the packet and never exit from the "while(Radio.busy())" cycle.
 
Can anyone help me with this issue?
 
Thank you
 
 
 
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.
 
SENSOR:
#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);
}

 


Viewing all articles
Browse latest Browse all 2077

Trending Articles