V148

Fork of RadioHead-148 by David Rimer

Revision:
0:ab4e012489ef
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/RHNRFSPIDriver.cpp	Thu Oct 15 01:27:00 2015 +0000
@@ -0,0 +1,95 @@
+// RHNRFSPIDriver.cpp
+//
+// Copyright (C) 2014 Mike McCauley
+// $Id: RHNRFSPIDriver.cpp,v 1.2 2014/05/03 00:20:36 mikem Exp $
+
+#include <RHNRFSPIDriver.h>
+
+RHNRFSPIDriver::RHNRFSPIDriver(PINS slaveSelectPin, RHGenericSPI& spi)
+    : 
+    _spi(spi),
+    _slaveSelectPin(slaveSelectPin)
+{
+}
+
+bool RHNRFSPIDriver::init()
+{
+    // start the SPI library with the default speeds etc:
+    // On Arduino Due this defaults to SPI1 on the central group of 6 SPI pins
+    _spi.begin();
+
+    // Initialise the slave select pin
+    // On Maple, this must be _after_ spi.begin
+#if (RH_PLATFORM != RH_PLATFORM_MBED)
+    pinMode(_slaveSelectPin, OUTPUT);
+#endif
+    digitalWrite(_slaveSelectPin, HIGH);
+
+    delay(100);
+    return true;
+}
+
+// Low level commands for interfacing with the device
+uint8_t RHNRFSPIDriver::spiCommand(uint8_t command)
+{
+    uint8_t status;
+    ATOMIC_BLOCK_START;
+    digitalWrite(_slaveSelectPin, LOW);
+    status = _spi.transfer(command);
+    digitalWrite(_slaveSelectPin, HIGH);
+    ATOMIC_BLOCK_END;
+    return status;
+}
+
+uint8_t RHNRFSPIDriver::spiRead(uint8_t reg)
+{
+    uint8_t val;
+    ATOMIC_BLOCK_START;
+    digitalWrite(_slaveSelectPin, LOW);
+    _spi.transfer(reg); // Send the address, discard the status
+    val = _spi.transfer(0); // The written value is ignored, reg value is read
+    digitalWrite(_slaveSelectPin, HIGH);
+    ATOMIC_BLOCK_END;
+    return val;
+}
+
+uint8_t RHNRFSPIDriver::spiWrite(uint8_t reg, uint8_t val)
+{
+    uint8_t status = 0;
+    ATOMIC_BLOCK_START;
+    digitalWrite(_slaveSelectPin, LOW);
+    status = _spi.transfer(reg); // Send the address
+    _spi.transfer(val); // New value follows
+    digitalWrite(_slaveSelectPin, HIGH);
+    ATOMIC_BLOCK_END;
+    return status;
+}
+
+uint8_t RHNRFSPIDriver::spiBurstRead(uint8_t reg, uint8_t* dest, uint8_t len)
+{
+    uint8_t status = 0;
+    ATOMIC_BLOCK_START;
+    digitalWrite(_slaveSelectPin, LOW);
+    status = _spi.transfer(reg); // Send the start address
+    while (len--)
+	*dest++ = _spi.transfer(0);
+    digitalWrite(_slaveSelectPin, HIGH);
+    ATOMIC_BLOCK_END;
+    return status;
+}
+
+uint8_t RHNRFSPIDriver::spiBurstWrite(uint8_t reg, const uint8_t* src, uint8_t len)
+{
+    uint8_t status = 0;
+    ATOMIC_BLOCK_START;
+    digitalWrite(_slaveSelectPin, LOW);
+    status = _spi.transfer(reg); // Send the start address
+    while (len--)
+	_spi.transfer(*src++);
+    digitalWrite(_slaveSelectPin, HIGH);
+    ATOMIC_BLOCK_END;
+    return status;
+}
+
+
+