-
Notifications
You must be signed in to change notification settings - Fork 32
msprf24_rxtx_ike
spirilis edited this page Nov 5, 2014
·
6 revisions
Simple RX/TX example from ike -- uses USCI_A SPI port on the MSP430G2553, flip-flops the Red and Green LEDs back and forth; TX side signals Green for successful transmission, Red for unsuccessful transmission, and the RX side reflects the contents of the data packet sent by the TX; it should show the red & green LEDs alternating.
This is not compatible with my nRF24L01+ boosterpack because that is hardwired to use USCI_B; this requires USCI_A so you may need to use jumper wires to hook up the transceiver.
TX example:
#include <msp430.h>
#include "msprf24.h"
#include "nrf_userconfig.h"
#include "stdint.h"
volatile unsigned int user;
void main()
{
char addr[5];
char buf[32];
WDTCTL = WDTHOLD | WDTPW;
DCOCTL = CALDCO_16MHZ;
BCSCTL1 = CALBC1_16MHZ;
BCSCTL2 = DIVS_1; // SMCLK = DCOCLK/2
// SPI (USCI) uses SMCLK, prefer SMCLK < 10MHz (SPI speed limit for nRF24 = 10MHz)
// Red, Green LED used for status
P1DIR |= 0x41;
P1OUT &= ~0x41;
user = 0xFE; // this is just used for testing, examined via debugger, it can be ignored
/* Initial values for nRF24L01+ library config variables */
rf_crc = RF24_EN_CRC | RF24_CRCO; // CRC enabled, 16-bit
rf_addr_width = 5;
rf_speed_power = RF24_SPEED_1MBPS | RF24_POWER_0DBM;
rf_channel = 120;
msprf24_init(); // All RX pipes closed by default
msprf24_set_pipe_packetsize(0, 32);
msprf24_open_pipe(0, 1); // Open pipe#0 with Enhanced ShockBurst enabled for receiving Auto-ACKs
// Transmit to 'rad01' (0x72 0x61 0x64 0x30 0x31)
msprf24_standby();
user = msprf24_current_state();
addr[0] = 0xDE; addr[1] = 0xAD; addr[2] = 0xBE; addr[3] = 0xEF; addr[4] = 0x00;
w_tx_addr(addr);
w_rx_addr(0, addr); // Pipe 0 receives auto-ack's, autoacks are sent back to the TX addr so the PTX node
// needs to listen to the TX addr on pipe#0 to receive them.
while(1){
__delay_cycles(800000);
if(buf[0]=='0'){buf[0] = '1';buf[1] = '0';}
else {buf[0] = '0';buf[1] = '1';}
w_tx_payload(32, buf);
msprf24_activate_tx();
LPM4;
if (rf_irq & RF24_IRQ_FLAGGED) {
msprf24_get_irq_reason();
if (rf_irq & RF24_IRQ_TX){
P1OUT &= ~BIT0; // Red LED off
P1OUT |= 0x40; // Green LED on
}
if (rf_irq & RF24_IRQ_TXFAILED){
P1OUT &= ~BIT6; // Green LED off
P1OUT |= BIT0; // Red LED on
}
msprf24_irq_clear(rf_irq);
user = msprf24_get_last_retransmits();
}
}
}
Example nrf_userconfig.h file for TX (shed the comments at the top for brevity):
#ifndef _NRF_USERCONFIG_H
#define _NRF_USERCONFIG_H
/* CPU clock cycles for the specified amounts of time--accurate minimum delays
* required for reliable operation of the nRF24L01+'s state machine.
*/
/* Settings for 1MHz MCLK.
#define DELAY_CYCLES_5MS 5000
#define DELAY_CYCLES_130US 130
#define DELAY_CYCLES_15US 15
*/
/* Settings for 8MHz MCLK.
#define DELAY_CYCLES_5MS 40000
#define DELAY_CYCLES_130US 1040
#define DELAY_CYCLES_15US 120
*/
/* Settings for 16MHz MCLK */
#define DELAY_CYCLES_5MS 80000
#define DELAY_CYCLES_130US 2080
#define DELAY_CYCLES_15US 240
/* SPI port--Select which USCI port we're using.
* Applies only to USCI devices. USI users can keep these
* commented out.
*/
#define SPI_DRIVER_USCI_A 1
//#define SPI_DRIVER_USCI_B 1
/* Operational pins -- IRQ, CE, CSN (SPI chip-select)
*/
/* IRQ */
#define nrfIRQport 2
#define nrfIRQpin BIT2
/* CSN SPI chip-select */
#define nrfCSNport 2
#define nrfCSNportout P2OUT
#define nrfCSNpin BIT1
/* CE Chip-Enable (used to put RF transceiver on-air for RX or TX) */
#define nrfCEport 2
#define nrfCEportout P2OUT
#define nrfCEpin BIT0
#endif
RX example:
#include <msp430.h>
#include "msprf24.h"
#include "nrf_userconfig.h"
#include "stdint.h"
volatile unsigned int user;
void main()
{
char addr[5];
char buf[32];
WDTCTL = WDTHOLD | WDTPW;
DCOCTL = CALDCO_16MHZ;
BCSCTL1 = CALBC1_16MHZ;
BCSCTL2 = DIVS_1; // SMCLK = DCOCLK/2
// SPI (USCI) uses SMCLK, prefer SMCLK < 10MHz (SPI speed limit for nRF24 = 10MHz)
// Red LED will be our output
P1DIR |= BIT0+BIT6;
P1OUT &= ~(BIT0+BIT6);
user = 0xFE;
/* Initial values for nRF24L01+ library config variables */
rf_crc = RF24_EN_CRC | RF24_CRCO; // CRC enabled, 16-bit
rf_addr_width = 5;
rf_speed_power = RF24_SPEED_1MBPS | RF24_POWER_0DBM;
rf_channel = 120;
msprf24_init();
msprf24_set_pipe_packetsize(0, 32);
msprf24_open_pipe(0, 1); // Open pipe#0 with Enhanced ShockBurst
// Set our RX address
addr[0] = 0xDE; addr[1] = 0xAD; addr[2] = 0xBE; addr[3] = 0xEF; addr[4] = 0x00;
w_rx_addr(0, addr);
// Receive mode
if (!(RF24_QUEUE_RXEMPTY & msprf24_queue_state())) {
flush_rx();
}
msprf24_activate_rx();
LPM4;
while (1) {
if (rf_irq & RF24_IRQ_FLAGGED) {
msprf24_get_irq_reason();
}
if (rf_irq & RF24_IRQ_RX) {
r_rx_payload(32, buf);
msprf24_irq_clear(RF24_IRQ_RX);
user = buf[0];
if (buf[0] == '0')
P1OUT &= ~BIT0;
if (buf[0] == '1')
P1OUT |= BIT0;
if (buf[1] == '0')
P1OUT &= ~BIT6;
if (buf[1] == '1')
P1OUT |= BIT6;
} else {
user = 0xFF;
}
LPM4;
}
}
The nrf_userconfig.h used by the RX code is the same as that used by the TX code.