📄 spptest.c
字号:
/*****************************************************************************
* *
* ********** *
* ************ *
* *** *** *
* *** +++ *** *
* *** + + *** *
* *** + CHIPCON CC1010 EXAMPLE PROGRAM *
* *** + + *** Simple Packet Protocol (SPP) test program *
* *** +++ *** *
* *** *** *
* *********** *
* ********* *
* *
*****************************************************************************
* This program demonstrates the use of the simple packet protocol (SPP). *
* *
* Use the CC1010EB switches (1-4) to transmit messages: *
* SW1: Send packet with ack (timeout) *
* SW2: Send packet without ack *
* SW3: Send broadcast packet *
* SW4: Send too long packet with ack *
* None: Receive packets (with timeout) *
* *
* CC1010EB LEDs: *
* Green: Successful transmission/reception *
* Yellow: Timeout *
* Red: Packet too long / received invalid ack *
*****************************************************************************
* Author: JOL *
*****************************************************************************
* Revision history: *
* 1.0 2002/08/29 First Public Release *
* *
* $Log: sppTest.c,v $
* Revision 1.3 2003/04/03 12:34:57 tos
* Modified for compatibility with CUL version 1.3.
*
* Revision 1.2 2002/11/19 15:23:45 kht
* Added startup macros
*
* Revision 1.1 2002/10/14 11:02:04 tos
* Initial version in CVS.
*
* *
****************************************************************************/
#include <chipcon/cc1010eb.h>
#include <chipcon/cul.h>
#include <stdlib.h> // srand(), rand()
// Test packet
#define TEST_DATA_LENGTH 254
#define MY_ADDRESS 255
#define DEST_ADDRESS 255
// SPP variables
SPP_SETTINGS xdata sppSettings;
/*****************************************************************************
MAIN PROGRAM
*****************************************************************************/
void main() {
int n;
SPP_RX_INFO xdata RXI;
SPP_TX_INFO xdata TXI;
byte xdata pRXData[TEST_DATA_LENGTH];
byte xdata pTXData[TEST_DATA_LENGTH];
#ifdef FREQ868
// X-tal frequency: 14.745600 MHz
// RF frequency A: 868.277200 MHz Rx
// RF frequency B: 868.277200 MHz Tx
// RX Mode: Low side LO
// Frequency separation: 64 kHz
// Data rate: 19.2 kBaud
// Data Format: NRZ
// RF output power: 4 dBm
// IF/RSSI: RSSI Enabled
RF_RXTXPAIR_SETTINGS code RF_SETTINGS = {
0xA3, 0x2F, 0x15, // Modem 0, 1 and 2
0x75, 0xA0, 0x00, // Freq A
0x58, 0x32, 0x8D, // Freq B
0x01, 0xAB, // FSEP 1 and 0
0x40, // PLL_RX
0x30, // PLL_TX
0x6C, // CURRENT_RX
0xF3, // CURRENT_TX
0x32, // FREND
0xFF, // PA_POW
0x00, // MATCH
0x00, // PRESCALER
};
#endif
#ifdef FREQ915
// X-tal frequency: 14.745600 MHz
// RF frequency A: 915.027455 MHz Rx
// RF frequency B: 915.027455 MHz Tx
// RX Mode: Low side LO
// Frequency separation: 64 kHz
// Data rate: 19.2 kBaud
// Data Format: NRZ
// RF output power: 4 dBm
// IF/RSSI: RSSI Enabled
RF_RXTXPAIR_SETTINGS code RF_SETTINGS = {
0xA3, 0x2F, 0x15, // Modem 0, 1 and 2
0xAA, 0x80, 0x00, // Freq A
0x5C, 0xF4, 0x02, // Freq B
0x01, 0xAB, // FSEP 1 and 0
0x58, // PLL_RX
0x30, // PLL_TX
0x6C, // CURRENT_RX
0xF3, // CURRENT_TX
0x32, // FREND
0xFF, // PA_POW
0x00, // MATCH
0x00, // PRESCALER
};
#endif
#ifdef FREQ433
// X-tal frequency: 14.745600 MHz
// RF frequency A: 433.302000 MHz Rx
// RF frequency B: 433.302000 MHz Tx
// RX Mode: Low side LO
// Frequency separation: 64 kHz
// Data rate: 19.2 kBaud
// Data Format: NRZ
// RF output power: 10 dBm
// IF/RSSI: RSSI Enabled
RF_RXTXPAIR_SETTINGS code RF_SETTINGS = {
0xA3, 0x2F, 0x0E, // Modem 0, 1 and 2
0x58, 0x00, 0x00, // Freq A
0x41, 0xFC, 0x9C, // Freq B
0x02, 0x80, // FSEP 1 and 0
0x60, // PLL_RX
0x48, // PLL_TX
0x44, // CURRENT_RX
0x81, // CURRENT_TX
0x0A, // FREND
0xFF, // PA_POW
0xC0, // MATCH
0x00, // PRESCALER
};
#endif
// Calibration data
RF_RXTXPAIR_CALDATA xdata RF_CALDATA;
// Initialize peripherals
WDT_ENABLE(FALSE);
RLED_OE(TRUE);
YLED_OE(TRUE);
GLED_OE(TRUE);
BLED_OE(TRUE);
// Set optimum settings for speed and low power consumption
MEM_NO_WAIT_STATES();
FLASH_SET_POWER_MODE(FLASH_STANDBY_BETWEEN_READS);
// Local settings
sppSettings.myAddress = MY_ADDRESS;
sppSettings.rxTimeout = 30;
sppSettings.txAckTimeout = 2;
sppSettings.txAttempts = 4;
sppSettings.txPreambleByteCount = 7;
// RF setup
sppSetupRF(&RF_SETTINGS, &RF_CALDATA, TRUE);
// Initialize the SPP timer
sppStartTimer(CC1010EB_CLKFREQ);
SPP_INIT_TIMEOUTS();
// Prepare TX data
srand(0x1234);
for (n = 0; n < TEST_DATA_LENGTH; n++) {
pTXData[n] = rand();
}
TXI.flags = 0x00;
// Test loop:
while (TRUE) {
if (SW1_PRESSED) {
// Prepare to transmit
TXI.destination = DEST_ADDRESS;
TXI.flags |= SPP_ACK_REQ;
TXI.pDataBuffer = pTXData;
TXI.dataLen = TEST_DATA_LENGTH;
if (sppSend(&TXI) == SPP_TX_STARTED) {
// Wait
do { /* nothing */ } while (SPP_STATUS() != SPP_IDLE_MODE);
if (TXI.status == SPP_TX_ACK_INVALID) {
RLED = LED_ON;
} else if (TXI.status == SPP_TX_ACK_TIMEOUT) {
YLED = LED_ON;
} else if (TXI.status == SPP_TX_FINISHED) {
GLED = LED_ON;
}
}
} else if (SW2_PRESSED) {
// Prepare to transmit
TXI.destination = DEST_ADDRESS;
TXI.flags &= ~SPP_ACK_REQ;
TXI.pDataBuffer = pTXData;
TXI.dataLen = TEST_DATA_LENGTH;
if (sppSend(&TXI) == SPP_TX_STARTED) {
// Wait
do { /* nothing */ } while (SPP_STATUS() != SPP_IDLE_MODE);
if (TXI.status == SPP_TX_ACK_INVALID) {
RLED = LED_ON;
} else if (TXI.status == SPP_TX_ACK_TIMEOUT) {
YLED = LED_ON;
} else if (TXI.status == SPP_TX_FINISHED) {
GLED = LED_ON;
}
}
} else if (SW3_PRESSED) {
// Prepare to transmit
TXI.destination = SPP_BROADCAST;
TXI.flags &= ~SPP_ACK_REQ;
TXI.pDataBuffer = pTXData;
TXI.dataLen = 15;
if (sppSend(&TXI) == SPP_TX_STARTED) {
// Wait
do { /* nothing */ } while (SPP_STATUS() != SPP_IDLE_MODE);
if (TXI.status == SPP_TX_ACK_INVALID) {
RLED = LED_ON;
} else if (TXI.status == SPP_TX_ACK_TIMEOUT) {
YLED = LED_ON;
} else if (TXI.status == SPP_TX_FINISHED) {
GLED = LED_ON;
}
}
} else if (SW4_PRESSED) {
// Prepare to transmit
TXI.destination = DEST_ADDRESS;
TXI.flags |= SPP_ACK_REQ;
TXI.pDataBuffer = pTXData;
TXI.dataLen = TEST_DATA_LENGTH + 1;
if (sppSend(&TXI) == SPP_TX_STARTED) {
// Wait
do { /* nothing */ } while (SPP_STATUS() != SPP_IDLE_MODE);
if (TXI.status == SPP_TX_ACK_INVALID) {
RLED = LED_ON;
} else if (TXI.status == SPP_TX_ACK_TIMEOUT) {
YLED = LED_ON;
} else if (TXI.status == SPP_TX_FINISHED) {
GLED = LED_ON;
}
}
} else { // RX
// Prepare to receive
RXI.pDataBuffer = pRXData;
RXI.maxDataLen = TEST_DATA_LENGTH;
if (sppReceive(&RXI) == SPP_RX_STARTED) {
// Wait
do { /* nothing */ } while (SPP_STATUS() != SPP_IDLE_MODE);
if (RXI.status == SPP_RX_TIMEOUT) {
YLED = LED_ON;
} else if (RXI.status == SPP_RX_TOO_LONG) {
RLED = LED_ON;
} else if (RXI.status == SPP_RX_FINISHED) {
GLED = LED_ON;
if (RXI.flags & SPP_SEQUENCE_BIT) {
BLED = LED_ON;
}
}
}
}
// Wait, then turn off LEDs
halWait(20, CC1010EB_CLKFREQ);
GLED = LED_OFF;
RLED = LED_OFF;
YLED = LED_OFF;
BLED = LED_OFF;
}
} // main
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -