V148

Fork of RadioHead-148 by David Rimer

Committer:
davidr99
Date:
Thu Oct 15 01:27:00 2015 +0000
Revision:
0:ab4e012489ef
Messy start, but a port for RadioHead.; Currently the SPI modulus are the only ones that work.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
davidr99 0:ab4e012489ef 1 // RHGenericSPI.h
davidr99 0:ab4e012489ef 2 // Author: Mike McCauley (mikem@airspayce.com)
davidr99 0:ab4e012489ef 3 // Copyright (C) 2011 Mike McCauley
davidr99 0:ab4e012489ef 4 // Contributed by Joanna Rutkowska
davidr99 0:ab4e012489ef 5 // $Id: RHGenericSPI.h,v 1.7 2014/04/14 08:37:11 mikem Exp $
davidr99 0:ab4e012489ef 6
davidr99 0:ab4e012489ef 7 #ifndef RHGenericSPI_h
davidr99 0:ab4e012489ef 8 #define RHGenericSPI_h
davidr99 0:ab4e012489ef 9
davidr99 0:ab4e012489ef 10 #include <RadioHead.h>
davidr99 0:ab4e012489ef 11
davidr99 0:ab4e012489ef 12 /////////////////////////////////////////////////////////////////////
davidr99 0:ab4e012489ef 13 /// \class RHGenericSPI RHGenericSPI.h <RHGenericSPI.h>
davidr99 0:ab4e012489ef 14 /// \brief Base class for SPI interfaces
davidr99 0:ab4e012489ef 15 ///
davidr99 0:ab4e012489ef 16 /// This generic abstract class is used to encapsulate hardware or software SPI interfaces for
davidr99 0:ab4e012489ef 17 /// a variety of platforms.
davidr99 0:ab4e012489ef 18 /// The intention is so that driver classes can be configured to use hardware or software SPI
davidr99 0:ab4e012489ef 19 /// without changing the main code.
davidr99 0:ab4e012489ef 20 ///
davidr99 0:ab4e012489ef 21 /// You must provide a subclass of this class to driver constructors that require SPI.
davidr99 0:ab4e012489ef 22 /// A concrete subclass that encapsualates the standard Arduino hardware SPI and a bit-banged
davidr99 0:ab4e012489ef 23 /// software implementation is included.
davidr99 0:ab4e012489ef 24 ///
davidr99 0:ab4e012489ef 25 /// Do not directly use this class: it must be subclassed and the following abstract functions at least
davidr99 0:ab4e012489ef 26 /// must be implmented:
davidr99 0:ab4e012489ef 27 /// - begin()
davidr99 0:ab4e012489ef 28 /// - end()
davidr99 0:ab4e012489ef 29 /// - transfer()
davidr99 0:ab4e012489ef 30 class RHGenericSPI
davidr99 0:ab4e012489ef 31 {
davidr99 0:ab4e012489ef 32 public:
davidr99 0:ab4e012489ef 33
davidr99 0:ab4e012489ef 34 /// \brief Defines constants for different SPI modes
davidr99 0:ab4e012489ef 35 ///
davidr99 0:ab4e012489ef 36 /// Defines constants for different SPI modes
davidr99 0:ab4e012489ef 37 /// that can be passed to the constructor or setMode()
davidr99 0:ab4e012489ef 38 /// We need to define these in a device and platform independent way, because the
davidr99 0:ab4e012489ef 39 /// SPI implementation is different on each platform.
davidr99 0:ab4e012489ef 40 typedef enum
davidr99 0:ab4e012489ef 41 {
davidr99 0:ab4e012489ef 42 DataMode0 = 0, ///< SPI Mode 0: CPOL = 0, CPHA = 0
davidr99 0:ab4e012489ef 43 DataMode1, ///< SPI Mode 1: CPOL = 0, CPHA = 1
davidr99 0:ab4e012489ef 44 DataMode2, ///< SPI Mode 2: CPOL = 1, CPHA = 0
davidr99 0:ab4e012489ef 45 DataMode3, ///< SPI Mode 3: CPOL = 1, CPHA = 1
davidr99 0:ab4e012489ef 46 } DataMode;
davidr99 0:ab4e012489ef 47
davidr99 0:ab4e012489ef 48 /// \brief Defines constants for different SPI bus frequencies
davidr99 0:ab4e012489ef 49 ///
davidr99 0:ab4e012489ef 50 /// Defines constants for different SPI bus frequencies
davidr99 0:ab4e012489ef 51 /// that can be passed to setFrequency().
davidr99 0:ab4e012489ef 52 /// The frequency you get may not be exactly the one according to the name.
davidr99 0:ab4e012489ef 53 /// We need to define these in a device and platform independent way, because the
davidr99 0:ab4e012489ef 54 /// SPI implementation is different on each platform.
davidr99 0:ab4e012489ef 55 typedef enum
davidr99 0:ab4e012489ef 56 {
davidr99 0:ab4e012489ef 57 Frequency1MHz = 0, ///< SPI bus frequency close to 1MHz
davidr99 0:ab4e012489ef 58 Frequency2MHz, ///< SPI bus frequency close to 2MHz
davidr99 0:ab4e012489ef 59 Frequency4MHz, ///< SPI bus frequency close to 4MHz
davidr99 0:ab4e012489ef 60 Frequency8MHz, ///< SPI bus frequency close to 8MHz
davidr99 0:ab4e012489ef 61 Frequency16MHz ///< SPI bus frequency close to 16MHz
davidr99 0:ab4e012489ef 62 } Frequency;
davidr99 0:ab4e012489ef 63
davidr99 0:ab4e012489ef 64 /// \brief Defines constants for different SPI endianness
davidr99 0:ab4e012489ef 65 ///
davidr99 0:ab4e012489ef 66 /// Defines constants for different SPI endianness
davidr99 0:ab4e012489ef 67 /// that can be passed to setBitOrder()
davidr99 0:ab4e012489ef 68 /// We need to define these in a device and platform independent way, because the
davidr99 0:ab4e012489ef 69 /// SPI implementation is different on each platform.
davidr99 0:ab4e012489ef 70 typedef enum
davidr99 0:ab4e012489ef 71 {
davidr99 0:ab4e012489ef 72 BitOrderMSBFirst = 0, ///< SPI MSB first
davidr99 0:ab4e012489ef 73 BitOrderLSBFirst, ///< SPI LSB first
davidr99 0:ab4e012489ef 74 } BitOrder;
davidr99 0:ab4e012489ef 75
davidr99 0:ab4e012489ef 76 /// Constructor
davidr99 0:ab4e012489ef 77 /// Creates an instance of an abstract SPI interface.
davidr99 0:ab4e012489ef 78 /// Do not use this contructor directly: you must instead use on of the concrete subclasses provided
davidr99 0:ab4e012489ef 79 /// such as RHHardwareSPI or RHSoftwareSPI
davidr99 0:ab4e012489ef 80 /// \param[in] frequency One of RHGenericSPI::Frequency to select the SPI bus frequency. The frequency
davidr99 0:ab4e012489ef 81 /// is mapped to the closest available bus frequency on the platform.
davidr99 0:ab4e012489ef 82 /// \param[in] bitOrder Select the SPI bus bit order, one of RHGenericSPI::BitOrderMSBFirst or
davidr99 0:ab4e012489ef 83 /// RHGenericSPI::BitOrderLSBFirst.
davidr99 0:ab4e012489ef 84 /// \param[in] dataMode Selects the SPI bus data mode. One of RHGenericSPI::DataMode
davidr99 0:ab4e012489ef 85 RHGenericSPI(Frequency frequency = Frequency1MHz, BitOrder bitOrder = BitOrderMSBFirst, DataMode dataMode = DataMode0);
davidr99 0:ab4e012489ef 86
davidr99 0:ab4e012489ef 87 /// Transfer a single octet to and from the SPI interface
davidr99 0:ab4e012489ef 88 /// \param[in] data The octet to send
davidr99 0:ab4e012489ef 89 /// \return The octet read from SPI while the data octet was sent
davidr99 0:ab4e012489ef 90 virtual uint8_t transfer(uint8_t data) = 0;
davidr99 0:ab4e012489ef 91
davidr99 0:ab4e012489ef 92 /// SPI Configuration methods
davidr99 0:ab4e012489ef 93 /// Enable SPI interrupts (if supported)
davidr99 0:ab4e012489ef 94 /// This can be used in an SPI slave to indicate when an SPI message has been received
davidr99 0:ab4e012489ef 95 virtual void attachInterrupt() {};
davidr99 0:ab4e012489ef 96
davidr99 0:ab4e012489ef 97 /// Disable SPI interrupts (if supported)
davidr99 0:ab4e012489ef 98 /// This can be used to diable the SPI interrupt in slaves where that is supported.
davidr99 0:ab4e012489ef 99 virtual void detachInterrupt() {};
davidr99 0:ab4e012489ef 100
davidr99 0:ab4e012489ef 101 /// Initialise the SPI library.
davidr99 0:ab4e012489ef 102 /// Call this after configuring and before using the SPI library
davidr99 0:ab4e012489ef 103 virtual void begin() = 0;
davidr99 0:ab4e012489ef 104
davidr99 0:ab4e012489ef 105 /// Disables the SPI bus (leaving pin modes unchanged).
davidr99 0:ab4e012489ef 106 /// Call this after you have finished using the SPI interface
davidr99 0:ab4e012489ef 107 virtual void end() = 0;
davidr99 0:ab4e012489ef 108
davidr99 0:ab4e012489ef 109 /// Sets the bit order the SPI interface will use
davidr99 0:ab4e012489ef 110 /// Sets the order of the bits shifted out of and into the SPI bus, either
davidr99 0:ab4e012489ef 111 /// LSBFIRST (least-significant bit first) or MSBFIRST (most-significant bit first).
davidr99 0:ab4e012489ef 112 /// \param[in] bitOrder Bit order to be used: one of RHGenericSPI::BitOrder
davidr99 0:ab4e012489ef 113 virtual void setBitOrder(BitOrder bitOrder);
davidr99 0:ab4e012489ef 114
davidr99 0:ab4e012489ef 115 /// Sets the SPI data mode: that is, clock polarity and phase.
davidr99 0:ab4e012489ef 116 /// See the Wikipedia article on SPI for details.
davidr99 0:ab4e012489ef 117 /// \param[in] dataMode The mode to use: one of RHGenericSPI::DataMode
davidr99 0:ab4e012489ef 118 virtual void setDataMode(DataMode dataMode);
davidr99 0:ab4e012489ef 119
davidr99 0:ab4e012489ef 120 /// Sets the SPI clock divider relative to the system clock.
davidr99 0:ab4e012489ef 121 /// On AVR based boards, the dividers available are 2, 4, 8, 16, 32, 64 or 128.
davidr99 0:ab4e012489ef 122 /// The default setting is SPI_CLOCK_DIV4, which sets the SPI clock to one-quarter
davidr99 0:ab4e012489ef 123 /// the frequency of the system clock (4 Mhz for the boards at 16 MHz).
davidr99 0:ab4e012489ef 124 /// \param[in] frequency The data rate to use: one of RHGenericSPI::Frequency
davidr99 0:ab4e012489ef 125 virtual void setFrequency(Frequency frequency);
davidr99 0:ab4e012489ef 126
davidr99 0:ab4e012489ef 127 protected:
davidr99 0:ab4e012489ef 128 /// The configure SPI Bus frequency, one of RHGenericSPI::Frequency
davidr99 0:ab4e012489ef 129 Frequency _frequency; // Bus frequency, one of RHGenericSPI::Frequency
davidr99 0:ab4e012489ef 130
davidr99 0:ab4e012489ef 131 /// Bit order, one of RHGenericSPI::BitOrder
davidr99 0:ab4e012489ef 132 BitOrder _bitOrder;
davidr99 0:ab4e012489ef 133
davidr99 0:ab4e012489ef 134 /// SPI bus mode, one of RHGenericSPI::DataMode
davidr99 0:ab4e012489ef 135 DataMode _dataMode;
davidr99 0:ab4e012489ef 136 };
davidr99 0:ab4e012489ef 137 #endif