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
RHHardwareSPI.cpp@7:250d1c72df36, 2021-06-23 (annotated)
- Committer:
- rlanders73
- Date:
- Wed Jun 23 15:53:12 2021 +0000
- Revision:
- 7:250d1c72df36
- Parent:
- 3:6ffa8c82a713
explicitly not disabling interrupts for mbed
Who changed what in which revision?
User | Revision | Line number | New 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 |