int main() { uint8_t addr[5]; uint8_t buf[32]; WDTCTL = WDTHOLD | WDTPW; DCOCTL = CALDCO_16MHZ; BCSCTL1 = CALBC1_16MHZ; BCSCTL2 = DIVS_2; // SMCLK = DCOCLK/4 // SPI (USCI) uses SMCLK, prefer SMCLK < 10MHz (SPI speed limit for nRF24 = 10MHz) user = 0xFE; // Red LED will be our output P1DIR |= BIT0; P1OUT &= ~BIT0; /* Initial values for nRF24L01+ library config variables */ rf_crc = RF24_EN_CRC; // CRC enabled, 8-bit rf_addr_width = 5; rf_speed_power = RF24_SPEED_MIN | RF24_POWER_MAX; rf_channel = 120; msprf24_init(); msprf24_set_pipe_packetsize(0, 0); msprf24_open_pipe(0, 1); // Open pipe#0 with Enhanced ShockBurst // Set our RX address memcpy(addr, "\xDE\xAD\xBE\xEF\x01", 5); 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 || msprf24_rx_pending()) { r_rx_payload(r_rx_peek_payload_size(), buf); msprf24_irq_clear(RF24_IRQ_RX); user = buf[0]; if (buf[0] == '0') P1OUT &= ~BIT0; if (buf[0] == '1') P1OUT |= BIT0; } else { user = 0xFF; } LPM4; } return 0; }
int main() { uint8_t pktlen, pipeid; uint8_t rfbuf[32]; WDTCTL = WDTPW | WDTHOLD; DCOCTL = CALDCO_16MHZ; BCSCTL1 = CALBC1_16MHZ; BCSCTL2 = DIVS_2; // SMCLK = 8MHz // Initialize red LED P1DIR |= BIT6; P1OUT &= ~BIT6; // Initialize nRF24L01+ RF transceiver rf_crc = RF24_EN_CRC; rf_addr_width = 5; rf_speed_power = RF24_SPEED_MIN | RF24_POWER_MAX; rf_channel = 8; msprf24_init(); msprf24_open_pipe(1, 1); // Receive pipe#1 (could use #0 too, as we don't do any TX...) msprf24_set_pipe_packetsize(1, 0); // Dynamic payload support w_rx_addr(1, (uint8_t*)ouraddr); msprf24_activate_rx(); // Start listening // Main loop while (1) { // Handle incoming nRF24 IRQs if (rf_irq & RF24_IRQ_FLAGGED) { msprf24_get_irq_reason(); if (rf_irq & RF24_IRQ_RX || msprf24_rx_pending()) { pktlen = r_rx_peek_payload_size(); if (!pktlen || pktlen > 32) { /* Erroneous >32byte packets need to be flushed right away * I have actually seen these occur, even with CRC enabled, and it * logjams the FIFOs because r_rx_payload() can't read them... */ flush_rx(); msprf24_irq_clear(RF24_IRQ_RX); } else { pipeid = r_rx_payload(pktlen, rfbuf); msprf24_irq_clear(RF24_IRQ_RX); if (pipeid == 1) { // Only paying attention to pipe#1 (this should always eval true) if (!memcmp(rfbuf, rfpayload, 3)) // Valid pushbutton packet P1OUT ^= BIT6; // Toggle red LED } } } } LPM4; } }
int main() { uint8_t buf[32]; WDTCTL = WDTPW | WDTHOLD; DCOCTL = 0; BCSCTL1 = CALBC1_16MHZ; DCOCTL = CALDCO_16MHZ; BCSCTL3 |= LFXT1S_2; P1DIR |= BIT0; P1OUT &= ~BIT0; _BIS_SR(GIE); #ifdef UART_DEBUG uart_setup(); #endif radio_setup(); // flush RX just in case if (!(RF24_RX_EMPTY & msprf24_queue_state())) { flush_rx(); } msprf24_activate_rx(); LPM4; while (1) { if (rf_irq & RF24_IRQ_FLAGGED) { rf_irq &= ~RF24_IRQ_FLAGGED; msprf24_get_irq_reason(); } if (rf_irq & RF24_IRQ_RX || msprf24_rx_pending()) { uint8_t nextPayloadSize = r_rx_peek_payload_size(); r_rx_payload(nextPayloadSize, buf); msprf24_irq_clear(RF24_IRQ_MASK); memcpy(dht_data.bytes, buf, nextPayloadSize); #ifdef UART_DEBUG int t = (((dht_data.val.th&0x7f)<<8) + dht_data.val.tl)*((dht_data.val.th&0x80)?-1:1); int h = (dht_data.val.hh<<8) + (dht_data.val.hl); uart_send(sprintf(txbuf, "%d.%1d;%d.%1d\r\n", t/10, t%10, h/10, h%10)); #endif } LPM4; } return 0; }
int main() { uint8_t rfbuf[32], i, do_lpm, pktlen, pipeid; WDTCTL = WDTPW | WDTHOLD; // I/O ports used for status LED //P3DIR |= BIT6; P1DIR |= BIT0; //P1OUT &= ~BIT7; P1OUT &= ~BIT0; //P3OUT |= BIT6; // Blue LED signifies clock startup /* MSP430 F5172 */ //ucs_clockinit(16000000, 0, 0); /* MSP430 G-series */ DCOCTL = CALDCO_16MHZ; BCSCTL1 = CALBC1_16MHZ; BCSCTL2 = DIVS_1; //P3OUT &= ~BIT6; // Configure Nordic nRF24L01+ rf_crc = RF24_EN_CRC | RF24_CRCO; // CRC enabled, 16-bit rf_addr_width = 5; rf_speed_power = RF_SPEED | RF24_POWER_MAX; // RF_SPEED from tcsender.h rf_channel = RF_CHANNEL; // This #define is located in tcsender.h msprf24_init(); msprf24_open_pipe(0, 0); msprf24_set_pipe_packetsize(0, 0); packet_init_tasklist(); dmx512_init(); // Submit one color change. memcpy(dmx512_buffer, rgb_cust, 3); dmx512_output_channels(0x00, 1, dmx512_buffer, 3); while(1) { do_lpm = 1; // Handle RF acknowledgements if (rf_irq & RF24_IRQ_FLAGGED || msprf24_rx_pending()) { msprf24_get_irq_reason(); // Handle TX acknowledgements if (rf_irq & RF24_IRQ_TX) { // Acknowledge msprf24_irq_clear(RF24_IRQ_TX); P1OUT &= ~BIT0; } if (rf_irq & RF24_IRQ_TXFAILED) { msprf24_irq_clear(RF24_IRQ_TXFAILED); flush_tx(); } if (rf_irq & RF24_IRQ_RX || msprf24_rx_pending()) { pktlen = r_rx_peek_payload_size(); if (pktlen > 0 && pktlen < 33) { pipeid = r_rx_payload(pktlen, (char*)rfbuf); if (pipeid == 1) { for (i=0; i < pktlen; i++) { if (rfbuf[i]) { /* Process this packet if it's valid (and payload length doesn't send us * past the end of the rfbuf buffer) */ if ( (i+rfbuf[i+1] + 1) < pktlen ) { packet_processor(rfbuf[i], rfbuf[i+1], &rfbuf[i+2]); i += rfbuf[i+1] + 1; } else { i = pktlen; /* Otherwise, we're done, we assume the * the rest of the payload is corrupt. */ } } /* rfbuf[i] != 0x00 (i.e. valid program ID) */ } /* for(0 .. pktlen) */ } /* pipeid == 1 */ } else { // False alarm; bad packet, nuke it. flush_rx(); } /* pktlen is 1..32 */ msprf24_irq_clear(RF24_IRQ_RX); } /* rf_irq & RF24_IRQ_RX */ do_lpm = 0; } /* rf_irq & RF24_IRQ_FLAGGED */ if (packet_task_next() != NULL) { packet_process_txqueue(); } if (do_lpm) LPM4; } /* while(1) */ return 0; // Should never reach here }