Jump to content
bazuchan

Can't get shockburst work on NRF24L01 with msprf24 library

Recommended Posts

I can't get shockburst work on NRF24L01 with msprf24 library. If I use w_tx_payload_noack instead of w_tx_payload everything works, but without shockburst.

Transmitter on msp430g2553

#include <msp430.h> 
#include "uart.h"
#include "msprf24.h"
#include "nrf_userconfig.h"

int main(void) {
	uint8_t addr[5] = { 0xDE, 0xAD, 0xBE, 0xEF, 0x01 };
	uint8_t buf[32];
	uint8_t onoff = 0;

	WDTCTL = WDTPW | WDTHOLD;
	if (CALBC1_16MHZ==0xFF)
	{
		while(1);
	}

	// MCLK 16MHz, SMCLK 8MHz
	DCOCTL = CALDCO_16MHZ;
	BCSCTL1 = CALBC1_16MHZ;
	BCSCTL2 = DIVS_1;

	uart_init();
	uart_puts("ready\n");

	rf_crc = RF24_EN_CRC;
	rf_addr_width      = 5;
	rf_speed_power     = RF24_SPEED_1MBPS | RF24_POWER_MAX;
	rf_channel         = 120;

	msprf24_init();
	msprf24_set_pipe_packetsize(0, 32);
	msprf24_open_pipe(0, 1);
	msprf24_standby();
	w_tx_addr(addr);
	w_rx_addr(0, addr);

	__bis_SR_register(GIE);

	while (1)
	{
		if (onoff=!onoff)
			strcpy(buf, "ON");
		else
			strcpy(buf, "OFF");

		uart_puts(buf);
		uart_puts("\n");
		w_tx_payload_noack(32, buf);
		//w_tx_payload(32, buf);
		msprf24_activate_tx();

		while (!(rf_irq & RF24_IRQ_FLAGGED))
		  LPM4;

		msprf24_get_irq_reason();
		if (rf_irq & RF24_IRQ_TX)
			uart_puts("txon ok\n");
		if (rf_irq & RF24_IRQ_TXFAILED)
			uart_puts("txon fail\n");
		msprf24_irq_clear(RF24_IRQ_MASK);
		msprf24_standby();

		__delay_cycles(100*DELAY_CYCLES_5MS);
	}
}

Receiver on msp430f5529

#include <msp430.h> 
#include "uart.h"
#include "msprf24.h"
#include "nrf_userconfig.h"

int main(void) {
	uint8_t addr[5] = { 0xDE, 0xAD, 0xBE, 0xEF, 0x01 };
	uint8_t buf[32];

	WDTCTL = WDTPW | WDTHOLD;				// Stop WDT

	UCSCTL3 = SELREF__REFOCLK; // Set DCO FLL reference = REFO
	UCSCTL4 = SELA__REFOCLK | SELM__DCOCLKDIV | SELS__DCOCLKDIV; // Set ACLK = REFO, MCLK = DCOCLKDIV, SMCLK = DCOCLKDIV
	UCSCTL5 = DIVA__1 | DIVM__1 | DIVS__2; // ACK = REF0, MSCK = DCO, SMCLK = DCO/2

	__bis_SR_register(SCG0); // Disable the FLL control loop
	UCSCTL0 = 0x0000; // Set lowest possible DCOx, MODx
	UCSCTL1 = DCORSEL_5; // Select DCO range 24MHz operation
	UCSCTL2 = FLLD_1 + 499; // Set DCO Multiplier for 16MHz
							// (N + 1) * FLLRef = Fdco
							// 499 + 1) * 32768 = 16MHz
							// Set FLL Div = fDCOCLK/2
	__bic_SR_register(SCG0);  // Enable the FLL control loop

	__delay_cycles(375000);

	// Loop until XT1,XT2 & DCO fault flag is cleared
	do
	{
		UCSCTL7 &= ~(XT2OFFG + XT1LFOFFG + DCOFFG); // Clear XT2,XT1,DCO fault flags
		SFRIFG1 &= ~OFIFG; // Clear fault flags
	} while (SFRIFG1&OFIFG); // Test oscillator fault flag

	uart_init();
	uart_puts("ready\n");

	rf_crc = RF24_EN_CRC;
	rf_addr_width      = 5;
	rf_speed_power     = RF24_SPEED_1MBPS | RF24_POWER_MAX;
	rf_channel         = 120;

	msprf24_init();
	msprf24_set_pipe_packetsize(0, 32);
	msprf24_open_pipe(0, 1);
	msprf24_standby();
	w_tx_addr(addr);
	w_rx_addr(0, addr);

	if (!(RF24_QUEUE_RXEMPTY & msprf24_queue_state()))
		flush_rx();
	msprf24_activate_rx();

	__bis_SR_register(GIE);

	while (1)
	{
		while (!(rf_irq & RF24_IRQ_FLAGGED))
		  LPM4;

		msprf24_get_irq_reason();
		while (rf_irq & RF24_IRQ_RX || msprf24_rx_pending()) {
			r_rx_payload(32, buf);
			msprf24_irq_clear(RF24_IRQ_RX);
			uart_puts("received: ");
			uart_puts(buf);
			uart_puts("\n");
		}
	}
}

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×