Patrick Clary / Radio

Dependents:   WalkingRobot PcRadioBridge FzeroXcontroller WalkingRobot ... more

Revision:
1:32635715529f
Parent:
0:fb0cf6209cd3
Child:
2:24a6ae7c3f69
diff -r fb0cf6209cd3 -r 32635715529f Radio.cpp
--- a/Radio.cpp	Sun Dec 23 04:48:16 2012 +0000
+++ b/Radio.cpp	Sun Dec 23 04:56:14 2012 +0000
@@ -16,12 +16,6 @@
     _spi.frequency(SPI_FREQUENCY);
     _spi.format(8, 0);
     
-    // Power up
-    int config = getRegister(CONFIG);
-    config |= CONFIG_PWR_UP;
-    setRegister(CONFIG, config);
-    wait_us(TIMING_Tpd2stby);
-    
     // Set to use controller channel 0
     controller = 0;
     
@@ -205,3 +199,108 @@
     }
     
 }
+
+
+
+/************************************************************************/
+
+
+
+RadioController::RadioController(PinName mosi, PinName miso, PinName sck, PinName csn, PinName ce) 
+: _spi(mosi, miso, sck), _csn(csn), _ce(ce)
+{
+    // Disable nRF24L01+
+    _ce = 0;
+    
+    // Disable chip select
+    _csn = 1;
+    
+    // Set up SPI
+    _spi.frequency(SPI_FREQUENCY);
+    _spi.format(8, 0);
+    
+    // Set to use controller channel 0
+    controller = 0;
+}
+
+
+
+void RadioController::reset()
+{
+    // Wait for power on reset
+    wait_us(TIMING_Tpor);
+
+    // Put into standby
+    _ce = 0;
+    
+    // Configure registers
+    setRegister(CONFIG, CONFIG_MASK_RX_DR | CONFIG_MASK_TX_DS | CONFIG_MASK_MAX_RT | CONFIG_EN_CRC | CONFIG_PWR_UP);
+    setRegister(EN_AA, 0x00);
+    setRegister(EN_RXADDR, 0x00);
+    setRegister(SETUP_AW, SETUP_AW_3BYTES);
+    setRegister(SETUP_RETR, 0x00);
+    setRegister(RF_CH, RF_CHANNEL);
+    setRegister(RF_SETUP, RF_SETUP_RF_DR_HIGH | RF_SETUP_RF_PWR_0);
+    setRegister(STATUS, STATUS_RX_DR | STATUS_TX_DS | STATUS_MAX_RT);
+    setRegister(DYNPD, 0x00);
+    setRegister(FEATURE, 0x00);
+    
+    // Set transmit address
+    _csn = 0;
+    _spi.write(W_REGISTER | TX_ADDR);
+    _spi.write(CTRL_BASE_ADDRESS_1 + (controller & 0xf));
+    _spi.write(CTRL_BASE_ADDRESS_2);
+    _spi.write(CTRL_BASE_ADDRESS_3);
+    _csn = 1;
+    
+    // Flush TX FIFO
+    _csn = 0;
+    _spi.write(FLUSH_TX);
+    _csn = 1;
+}
+
+
+
+void RadioController::transmit(uint32_t data)
+{   
+    // Write packet data
+    _csn = 0;
+    _spi.write(W_TX_PAYLOAD);
+    _spi.write( (data>>0) & 0xff );
+    _spi.write( (data>>8) & 0xff );
+    _spi.write( (data>>16) & 0xff );
+    _spi.write( (data>>24) & 0xff );
+    _csn = 1;
+    
+    // Put into PTX and transmit packet
+    _ce = 1;
+    wait_us(TIMING_Tstby2a);
+    
+    // Go back into standby
+    _ce = 0;
+}
+
+
+
+void RadioController::setRegister(int address, int data)
+{
+    bool enabled = false;
+    if (_ce == 1)
+    {
+        enabled = true;
+        _ce = 0;
+    }
+    
+    _csn = 0;
+    int rc = W_REGISTER | (address & REGISTER_ADDRESS_MASK);
+    _spi.write(rc);
+    _spi.write(data & 0xff);
+    _csn = 1;
+    
+    if (enabled)
+    {
+        _ce = 1;
+        wait_us(TIMING_Tpece2csn);
+    }
+    
+}