// SoftwareSPI.h // Author: Chris Lapa (chris@lapa.com.au) // Copyright (C) 2014 Chris Lapa // Contributed by Chris Lapa #ifndef RHSoftwareSPI_h #define RHSoftwareSPI_h #include ///////////////////////////////////////////////////////////////////// /// \class RHSoftwareSPI RHSoftwareSPI.h /// \brief Encapsulate a software SPI interface /// /// This concrete subclass of RHGenericSPI enapsulates a bit-banged software SPI interface. /// Caution: this software SPI interface will be much slower than hardware SPI on most /// platforms. /// /// \par Usage /// /// Usage varies slightly depending on what driver you are using. /// /// For RF22, for example: /// \code /// #include /// RHSoftwareSPI spi; /// RH_RF22 driver(SS, 2, spi); /// RHReliableDatagram(driver, CLIENT_ADDRESS); /// void setup() /// { /// spi.setPins(6, 5, 7); // Or whatever SPI pins you need /// .... /// } /// \endcode class RHSoftwareSPI : public RHGenericSPI { public: /// Constructor /// Creates an instance of a bit-banged software SPI interface. /// Sets the SPI pins to the defaults of /// MISO = 12, MOSI = 11, SCK = 13. If you need other assigments, call setPins() before /// calling manager.init() or driver.init(). /// \param[in] frequency One of RHGenericSPI::Frequency to select the SPI bus frequency. The frequency /// is mapped to the closest available bus frequency on the platform. CAUTION: the achieved /// frequency will almost certainly be very much slower on most platforms. eg on Arduino Uno, the /// the clock rate is likely to be at best around 46kHz. /// \param[in] bitOrder Select the SPI bus bit order, one of RHGenericSPI::BitOrderMSBFirst or /// RHGenericSPI::BitOrderLSBFirst. /// \param[in] dataMode Selects the SPI bus data mode. One of RHGenericSPI::DataMode RHSoftwareSPI(Frequency frequency = Frequency1MHz, BitOrder bitOrder = BitOrderMSBFirst, DataMode dataMode = DataMode0); /// Transfer a single octet to and from the SPI interface /// \param[in] data The octet to send /// \return The octet read from SPI while the data octet was sent. uint8_t transfer(uint8_t data); /// Initialise the software SPI library /// Call this after configuring the SPI interface and before using it to transfer data. /// Initializes the SPI bus by setting SCK, MOSI, and SS to outputs, pulling SCK and MOSI low, and SS high. void begin(); /// Disables the SPI bus usually, in this case /// there is no hardware controller to disable. void end(); /// Sets the pins used by this SoftwareSPIClass instance. /// The defaults are: MISO = 12, MOSI = 11, SCK = 13. /// \param[in] miso master in slave out pin used /// \param[in] mosi master out slave in pin used /// \param[in] sck clock pin used void setPins(uint8_t miso = 12, uint8_t mosi = 11, uint8_t sck = 13); private: /// Delay routine for bus timing. void delayPeriod(); private: uint8_t _miso; uint8_t _mosi; uint8_t _sck; uint8_t _bitOrder; uint8_t _delayCounts; uint8_t _clockPolarity; uint8_t _clockPhase; }; #endif