|
- // RHNRFSPIDriver.cpp
- //
- // Copyright (C) 2014 Mike McCauley
- // $Id: RHNRFSPIDriver.cpp,v 1.3 2015/12/16 04:55:33 mikem Exp $
-
- #include <RHNRFSPIDriver.h>
-
- RHNRFSPIDriver::RHNRFSPIDriver(uint8_t 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
- pinMode(_slaveSelectPin, OUTPUT);
- 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;
- _spi.beginTransaction();
- digitalWrite(_slaveSelectPin, LOW);
- status = _spi.transfer(command);
- digitalWrite(_slaveSelectPin, HIGH);
- _spi.endTransaction();
- ATOMIC_BLOCK_END;
- return status;
- }
-
- uint8_t RHNRFSPIDriver::spiRead(uint8_t reg)
- {
- uint8_t val;
- ATOMIC_BLOCK_START;
- _spi.beginTransaction();
- 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);
- _spi.endTransaction();
- ATOMIC_BLOCK_END;
- return val;
- }
-
- uint8_t RHNRFSPIDriver::spiWrite(uint8_t reg, uint8_t val)
- {
- uint8_t status = 0;
- ATOMIC_BLOCK_START;
- _spi.beginTransaction();
- digitalWrite(_slaveSelectPin, LOW);
- status = _spi.transfer(reg); // Send the address
- _spi.transfer(val); // New value follows
- #if (RH_PLATFORM == RH_PLATFORM_ARDUINO) && defined(__arm__) && defined(CORE_TEENSY)
- // Sigh: some devices, such as MRF89XA dont work properly on Teensy 3.1:
- // At 1MHz, the clock returns low _after_ slave select goes high, which prevents SPI
- // write working. This delay gixes time for the clock to return low.
- delayMicroseconds(5);
- #endif
- digitalWrite(_slaveSelectPin, HIGH);
- _spi.endTransaction();
- 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;
- _spi.beginTransaction();
- digitalWrite(_slaveSelectPin, LOW);
- status = _spi.transfer(reg); // Send the start address
- while (len--)
- *dest++ = _spi.transfer(0);
- digitalWrite(_slaveSelectPin, HIGH);
- _spi.endTransaction();
- 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;
- _spi.beginTransaction();
- digitalWrite(_slaveSelectPin, LOW);
- status = _spi.transfer(reg); // Send the start address
- while (len--)
- _spi.transfer(*src++);
- digitalWrite(_slaveSelectPin, HIGH);
- _spi.endTransaction();
- ATOMIC_BLOCK_END;
- return status;
- }
-
- void RHNRFSPIDriver::setSlaveSelectPin(uint8_t slaveSelectPin)
- {
- _slaveSelectPin = slaveSelectPin;
- }
-
|