This driver is a stripped down version of the Radiohead 1.45 driver, and covers fewer radios. Threading and an event queue have been added to make the ISR's more stable across architectures. Specifically The STM32L4 parts

Dependents:   Threaded_LoRa_Modem

Committer:
rlanders73
Date:
Mon May 31 02:49:19 2021 +0000
Revision:
3:6ffa8c82a713
Parent:
2:403a13ad43e6
Initial working version that is focused on the RF95 radio.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
davidr99 0:ab4e012489ef 1 // RHHardwareSPI.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: RHHardwareSPI.cpp,v 1.12 2015/07/01 00:46:05 mikem Exp $
davidr99 0:ab4e012489ef 6
davidr99 0:ab4e012489ef 7 #include <RHHardwareSPI.h>
davidr99 0:ab4e012489ef 8
davidr99 0:ab4e012489ef 9 // Declare a single default instance of the hardware SPI interface class
davidr99 0:ab4e012489ef 10 RHHardwareSPI hardware_spi;
davidr99 0:ab4e012489ef 11
davidr99 0:ab4e012489ef 12
rlanders73 1:dfeb5e8b199a 13 // grab config from mbed_app.json
rlanders73 2:403a13ad43e6 14 SPI _SPI(RADIO_MOSI, RADIO_MISO, RADIO_SCLK);
davidr99 0:ab4e012489ef 15
davidr99 0:ab4e012489ef 16 #define REVERSE_BITS(byte) (((reverse_lookup[(byte & 0x0F)]) << 4) + reverse_lookup[((byte & 0xF0) >> 4)])
davidr99 0:ab4e012489ef 17
davidr99 0:ab4e012489ef 18 static const uint8_t reverse_lookup[] = { 0, 8, 4, 12, 2, 10, 6, 14,1, 9, 5, 13,3, 11, 7, 15 };
davidr99 0:ab4e012489ef 19
davidr99 0:ab4e012489ef 20
davidr99 0:ab4e012489ef 21 // Arduino Due has default SPI pins on central SPI headers, and not on 10, 11, 12, 13
davidr99 0:ab4e012489ef 22 // as per otherArduinos
davidr99 0:ab4e012489ef 23 // http://21stdigitalhome.blogspot.com.au/2013/02/arduino-due-hardware-SPI.html
davidr99 0:ab4e012489ef 24 #if defined (__arm__) && !defined(CORE_TEENSY)
davidr99 0:ab4e012489ef 25 // Arduino Due in 1.5.5 has no definitions for SPI dividers
davidr99 0:ab4e012489ef 26 // SPI clock divider is based on MCK of 84MHz
davidr99 0:ab4e012489ef 27 #define SPI_CLOCK_DIV16 (VARIANT_MCK/84000000) // 1MHz
davidr99 0:ab4e012489ef 28 #define SPI_CLOCK_DIV8 (VARIANT_MCK/42000000) // 2MHz
davidr99 0:ab4e012489ef 29 #define SPI_CLOCK_DIV4 (VARIANT_MCK/21000000) // 4MHz
davidr99 0:ab4e012489ef 30 #define SPI_CLOCK_DIV2 (VARIANT_MCK/10500000) // 8MHz
davidr99 0:ab4e012489ef 31 #define SPI_CLOCK_DIV1 (VARIANT_MCK/5250000) // 16MHz
davidr99 0:ab4e012489ef 32
davidr99 0:ab4e012489ef 33 RHHardwareSPI::RHHardwareSPI(Frequency frequency, BitOrder bitOrder, DataMode dataMode)
davidr99 0:ab4e012489ef 34 :
davidr99 0:ab4e012489ef 35 RHGenericSPI(frequency, bitOrder, dataMode)
davidr99 0:ab4e012489ef 36 {
davidr99 0:ab4e012489ef 37 }
davidr99 0:ab4e012489ef 38
davidr99 0:ab4e012489ef 39 uint8_t RHHardwareSPI::transfer(uint8_t data)
davidr99 0:ab4e012489ef 40 {
davidr99 0:ab4e012489ef 41 if (_bitOrder == BitOrderLSBFirst)
davidr99 0:ab4e012489ef 42 data = REVERSE_BITS(data);
davidr99 0:ab4e012489ef 43
davidr99 0:ab4e012489ef 44 return _SPI.write(data);
davidr99 0:ab4e012489ef 45 }
davidr99 0:ab4e012489ef 46
davidr99 0:ab4e012489ef 47 void RHHardwareSPI::attachInterrupt()
davidr99 0:ab4e012489ef 48 {
rlanders73 3:6ffa8c82a713 49 // figure out how to do an interrupt thingy here
davidr99 0:ab4e012489ef 50 }
davidr99 0:ab4e012489ef 51
davidr99 0:ab4e012489ef 52 void RHHardwareSPI::detachInterrupt()
davidr99 0:ab4e012489ef 53 {
rlanders73 3:6ffa8c82a713 54 // figure out how to do an interrupt thingy here too
davidr99 0:ab4e012489ef 55 }
davidr99 0:ab4e012489ef 56
davidr99 0:ab4e012489ef 57 void RHHardwareSPI::begin()
davidr99 0:ab4e012489ef 58 {
davidr99 0:ab4e012489ef 59
davidr99 0:ab4e012489ef 60 uint8_t dataMode;
davidr99 0:ab4e012489ef 61 if (_dataMode == DataMode0)
davidr99 0:ab4e012489ef 62 dataMode = 0;
davidr99 0:ab4e012489ef 63 else if (_dataMode == DataMode1)
davidr99 0:ab4e012489ef 64 dataMode = 1;
davidr99 0:ab4e012489ef 65 else if (_dataMode == DataMode2)
davidr99 0:ab4e012489ef 66 dataMode = 2;
davidr99 0:ab4e012489ef 67 else if (_dataMode == DataMode3)
davidr99 0:ab4e012489ef 68 dataMode = 3;
rlanders73 3:6ffa8c82a713 69 // printf("mode %d\n", dataMode);
davidr99 0:ab4e012489ef 70 _SPI.format(8, dataMode);
davidr99 0:ab4e012489ef 71
davidr99 0:ab4e012489ef 72 int frequency;
davidr99 0:ab4e012489ef 73 switch (_frequency)
davidr99 0:ab4e012489ef 74 {
davidr99 0:ab4e012489ef 75 case Frequency1MHz:
davidr99 0:ab4e012489ef 76 default:
davidr99 0:ab4e012489ef 77 frequency = 1000000;
davidr99 0:ab4e012489ef 78 break;
davidr99 0:ab4e012489ef 79
davidr99 0:ab4e012489ef 80 case Frequency2MHz:
davidr99 0:ab4e012489ef 81 frequency = 2000000;
davidr99 0:ab4e012489ef 82 break;
davidr99 0:ab4e012489ef 83
davidr99 0:ab4e012489ef 84 case Frequency4MHz:
davidr99 0:ab4e012489ef 85 frequency = 4000000;
davidr99 0:ab4e012489ef 86 break;
davidr99 0:ab4e012489ef 87
davidr99 0:ab4e012489ef 88 case Frequency8MHz:
davidr99 0:ab4e012489ef 89 frequency = 8000000;
davidr99 0:ab4e012489ef 90 break;
davidr99 0:ab4e012489ef 91
davidr99 0:ab4e012489ef 92 case Frequency16MHz:
davidr99 0:ab4e012489ef 93 frequency = 16000000;
davidr99 0:ab4e012489ef 94 break;
davidr99 0:ab4e012489ef 95 }
rlanders73 3:6ffa8c82a713 96 // printf("@%dHz\n",frequency);
davidr99 0:ab4e012489ef 97 _SPI.frequency(frequency);
rlanders73 3:6ffa8c82a713 98
davidr99 0:ab4e012489ef 99 }
davidr99 0:ab4e012489ef 100
davidr99 0:ab4e012489ef 101 void RHHardwareSPI::end()
davidr99 0:ab4e012489ef 102 {
davidr99 0:ab4e012489ef 103 }
davidr99 0:ab4e012489ef 104
davidr99 0:ab4e012489ef 105 #endif
davidr99 0:ab4e012489ef 106