Driver for the SX1280 RF Transceiver

Dependents:   SX1280PingPong RangignMaster RangingSlave MSNV2-Terminal_V1-6 ... more

Committer:
GregCr
Date:
Wed Jul 18 08:48:34 2018 +0000
Revision:
11:d60df50e108f
Parent:
4:abf14b677777
Child:
12:c4f110f3fe3e
Updated drivers to latest revision

Who changed what in which revision?

UserRevisionLine numberNew contents of line
GregCr 0:03ec2f3bde8c 1 /*
GregCr 0:03ec2f3bde8c 2 ______ _
GregCr 0:03ec2f3bde8c 3 / _____) _ | |
GregCr 0:03ec2f3bde8c 4 ( (____ _____ ____ _| |_ _____ ____| |__
GregCr 0:03ec2f3bde8c 5 \____ \| ___ | (_ _) ___ |/ ___) _ \
GregCr 0:03ec2f3bde8c 6 _____) ) ____| | | || |_| ____( (___| | | |
GregCr 0:03ec2f3bde8c 7 (______/|_____)_|_|_| \__)_____)\____)_| |_|
GregCr 0:03ec2f3bde8c 8 (C)2016 Semtech
GregCr 0:03ec2f3bde8c 9
GregCr 0:03ec2f3bde8c 10 Description: Handling of the node configuration protocol
GregCr 0:03ec2f3bde8c 11
GregCr 0:03ec2f3bde8c 12 License: Revised BSD License, see LICENSE.TXT file include in the project
GregCr 0:03ec2f3bde8c 13
GregCr 0:03ec2f3bde8c 14 Maintainer: Miguel Luis, Gregory Cristian and Matthieu Verdy
GregCr 0:03ec2f3bde8c 15 */
GregCr 0:03ec2f3bde8c 16 #include "sx1280-hal.h"
GregCr 0:03ec2f3bde8c 17
GregCr 0:03ec2f3bde8c 18 /*!
GregCr 0:03ec2f3bde8c 19 * \brief Helper macro to create Interrupt objects only if the pin name is
GregCr 0:03ec2f3bde8c 20 * different from NC
GregCr 0:03ec2f3bde8c 21 */
GregCr 0:03ec2f3bde8c 22 #define CreateDioPin( pinName, dio ) \
GregCr 0:03ec2f3bde8c 23 if( pinName == NC ) \
GregCr 0:03ec2f3bde8c 24 { \
GregCr 0:03ec2f3bde8c 25 dio = NULL; \
GregCr 0:03ec2f3bde8c 26 } \
GregCr 0:03ec2f3bde8c 27 else \
GregCr 0:03ec2f3bde8c 28 { \
GregCr 0:03ec2f3bde8c 29 dio = new InterruptIn( pinName ); \
GregCr 0:03ec2f3bde8c 30 }
GregCr 0:03ec2f3bde8c 31
GregCr 0:03ec2f3bde8c 32 /*!
GregCr 0:03ec2f3bde8c 33 * \brief Helper macro to avoid duplicating code for setting dio pins parameters
GregCr 0:03ec2f3bde8c 34 */
GregCr 0:03ec2f3bde8c 35 #if defined( TARGET_NUCLEO_L476RG )
GregCr 0:03ec2f3bde8c 36 #define DioAssignCallback( dio, pinMode, callback ) \
GregCr 0:03ec2f3bde8c 37 if( dio != NULL ) \
GregCr 0:03ec2f3bde8c 38 { \
GregCr 0:03ec2f3bde8c 39 dio->mode( pinMode ); \
GregCr 0:03ec2f3bde8c 40 dio->rise( this, static_cast <Trigger>( callback ) ); \
GregCr 0:03ec2f3bde8c 41 }
GregCr 0:03ec2f3bde8c 42 #else
GregCr 0:03ec2f3bde8c 43 #define DioAssignCallback( dio, pinMode, callback ) \
GregCr 0:03ec2f3bde8c 44 if( dio != NULL ) \
GregCr 0:03ec2f3bde8c 45 { \
GregCr 0:03ec2f3bde8c 46 dio->rise( this, static_cast <Trigger>( callback ) ); \
GregCr 0:03ec2f3bde8c 47 }
GregCr 0:03ec2f3bde8c 48 #endif
GregCr 0:03ec2f3bde8c 49 /*!
GregCr 0:03ec2f3bde8c 50 * \brief Used to block execution waiting for low state on radio busy pin.
GregCr 0:03ec2f3bde8c 51 * Essentially used in SPI communications
GregCr 0:03ec2f3bde8c 52 */
GregCr 0:03ec2f3bde8c 53 #define WaitOnBusy( ) while( BUSY == 1 ){ }
GregCr 0:03ec2f3bde8c 54
GregCr 0:03ec2f3bde8c 55 /*!
GregCr 0:03ec2f3bde8c 56 * \brief Blocking routine for waiting the UART to be writeable
GregCr 0:03ec2f3bde8c 57 *
GregCr 0:03ec2f3bde8c 58 */
GregCr 0:03ec2f3bde8c 59 #define WaitUartWritable( ) while( RadioUart->writeable( ) == false ){ }
GregCr 0:03ec2f3bde8c 60
GregCr 0:03ec2f3bde8c 61 /*!
GregCr 0:03ec2f3bde8c 62 * \brief Blocking routine for waiting the UART to be readable
GregCr 0:03ec2f3bde8c 63 *
GregCr 0:03ec2f3bde8c 64 */
GregCr 0:03ec2f3bde8c 65 #define WaitUartReadable( ) while( RadioUart->readable( ) == false ){ }
GregCr 0:03ec2f3bde8c 66
GregCr 0:03ec2f3bde8c 67 // This code handles cases where assert_param is undefined
GregCr 0:03ec2f3bde8c 68 #ifndef assert_param
GregCr 0:03ec2f3bde8c 69 #define assert_param( ... )
GregCr 0:03ec2f3bde8c 70 #endif
GregCr 0:03ec2f3bde8c 71
GregCr 0:03ec2f3bde8c 72 SX1280Hal::SX1280Hal( PinName mosi, PinName miso, PinName sclk, PinName nss,
GregCr 0:03ec2f3bde8c 73 PinName busy, PinName dio1, PinName dio2, PinName dio3, PinName rst,
GregCr 0:03ec2f3bde8c 74 RadioCallbacks_t *callbacks )
GregCr 0:03ec2f3bde8c 75 : SX1280( callbacks ),
GregCr 0:03ec2f3bde8c 76 RadioNss( nss ),
GregCr 0:03ec2f3bde8c 77 RadioReset( rst ),
GregCr 0:03ec2f3bde8c 78 RadioCtsn( NC ),
GregCr 0:03ec2f3bde8c 79 BUSY( busy )
GregCr 0:03ec2f3bde8c 80 {
GregCr 0:03ec2f3bde8c 81 CreateDioPin( dio1, DIO1 );
GregCr 0:03ec2f3bde8c 82 CreateDioPin( dio2, DIO2 );
GregCr 0:03ec2f3bde8c 83 CreateDioPin( dio3, DIO3 );
GregCr 0:03ec2f3bde8c 84 RadioSpi = new SPI( mosi, miso, sclk );
GregCr 0:03ec2f3bde8c 85 RadioUart = NULL;
GregCr 0:03ec2f3bde8c 86
GregCr 0:03ec2f3bde8c 87 RadioNss = 1;
GregCr 0:03ec2f3bde8c 88 RadioReset = 1;
GregCr 0:03ec2f3bde8c 89 }
GregCr 0:03ec2f3bde8c 90
GregCr 0:03ec2f3bde8c 91 SX1280Hal::SX1280Hal( PinName tx, PinName rx, PinName ctsn,
GregCr 0:03ec2f3bde8c 92 PinName busy, PinName dio1, PinName dio2, PinName dio3, PinName rst,
GregCr 0:03ec2f3bde8c 93 RadioCallbacks_t *callbacks )
GregCr 0:03ec2f3bde8c 94 : SX1280( callbacks ),
GregCr 0:03ec2f3bde8c 95 RadioNss( NC ),
GregCr 0:03ec2f3bde8c 96 RadioReset( rst ),
GregCr 0:03ec2f3bde8c 97 RadioCtsn( ctsn ),
GregCr 0:03ec2f3bde8c 98 BUSY( busy )
GregCr 0:03ec2f3bde8c 99 {
GregCr 0:03ec2f3bde8c 100 CreateDioPin( dio1, DIO1 );
GregCr 0:03ec2f3bde8c 101 CreateDioPin( dio2, DIO2 );
GregCr 0:03ec2f3bde8c 102 CreateDioPin( dio3, DIO3 );
GregCr 0:03ec2f3bde8c 103 RadioSpi = NULL;
GregCr 0:03ec2f3bde8c 104 RadioUart = new Serial( tx, rx );
GregCr 0:03ec2f3bde8c 105 RadioCtsn = 0;
GregCr 0:03ec2f3bde8c 106 RadioReset = 1;
GregCr 0:03ec2f3bde8c 107 }
GregCr 0:03ec2f3bde8c 108
GregCr 0:03ec2f3bde8c 109 SX1280Hal::~SX1280Hal( void )
GregCr 0:03ec2f3bde8c 110 {
GregCr 0:03ec2f3bde8c 111 if( this->RadioSpi != NULL )
GregCr 0:03ec2f3bde8c 112 {
GregCr 0:03ec2f3bde8c 113 delete RadioSpi;
GregCr 0:03ec2f3bde8c 114 }
GregCr 0:03ec2f3bde8c 115 if( this->RadioUart != NULL )
GregCr 0:03ec2f3bde8c 116 {
GregCr 0:03ec2f3bde8c 117 delete RadioUart;
GregCr 0:03ec2f3bde8c 118 }
GregCr 0:03ec2f3bde8c 119 if( DIO1 != NULL )
GregCr 0:03ec2f3bde8c 120 {
GregCr 0:03ec2f3bde8c 121 delete DIO1;
GregCr 0:03ec2f3bde8c 122 }
GregCr 0:03ec2f3bde8c 123 if( DIO2 != NULL )
GregCr 0:03ec2f3bde8c 124 {
GregCr 0:03ec2f3bde8c 125 delete DIO2;
GregCr 0:03ec2f3bde8c 126 }
GregCr 0:03ec2f3bde8c 127 if( DIO3 != NULL )
GregCr 0:03ec2f3bde8c 128 {
GregCr 0:03ec2f3bde8c 129 delete DIO3;
GregCr 0:03ec2f3bde8c 130 }
GregCr 0:03ec2f3bde8c 131 };
GregCr 0:03ec2f3bde8c 132
GregCr 0:03ec2f3bde8c 133 void SX1280Hal::SpiInit( void )
GregCr 0:03ec2f3bde8c 134 {
GregCr 0:03ec2f3bde8c 135 RadioNss = 1;
GregCr 0:03ec2f3bde8c 136 RadioSpi->format( 8, 0 );
GregCr 0:03ec2f3bde8c 137 #if defined( TARGET_KL25Z )
GregCr 11:d60df50e108f 138 this->SetSpiSpeed( 4000000 );
GregCr 0:03ec2f3bde8c 139 #elif defined( TARGET_NUCLEO_L476RG )
GregCr 11:d60df50e108f 140 this->SetSpiSpeed( 8000000 );
GregCr 0:03ec2f3bde8c 141 #else
GregCr 11:d60df50e108f 142 this->SetSpiSpeed( 8000000 );
GregCr 0:03ec2f3bde8c 143 #endif
GregCr 11:d60df50e108f 144 wait( 0.1 );
GregCr 11:d60df50e108f 145 }
GregCr 0:03ec2f3bde8c 146
GregCr 11:d60df50e108f 147 void SX1280Hal::SetSpiSpeed( uint32_t spiSpeed )
GregCr 11:d60df50e108f 148 {
GregCr 11:d60df50e108f 149 RadioSpi->frequency( spiSpeed );
GregCr 0:03ec2f3bde8c 150 }
GregCr 0:03ec2f3bde8c 151
GregCr 0:03ec2f3bde8c 152 void SX1280Hal::UartInit( void )
GregCr 0:03ec2f3bde8c 153 {
GregCr 0:03ec2f3bde8c 154 RadioUart->format( 9, SerialBase::Even, 1 ); // 8 data bits + 1 even parity bit + 1 stop bit
GregCr 0:03ec2f3bde8c 155 RadioUart->baud( 115200 );
GregCr 0:03ec2f3bde8c 156
GregCr 0:03ec2f3bde8c 157 // By default the SX1280 UART is setup to handle bytes MSB first.
GregCr 0:03ec2f3bde8c 158 // In order to setup the radio to use the UART standard way we first send
GregCr 0:03ec2f3bde8c 159 // the equivalent of a WriteRegister with reversed bit order in order to
GregCr 0:03ec2f3bde8c 160 // change the endianness.
GregCr 0:03ec2f3bde8c 161 uint8_t regVal = 0;
GregCr 0:03ec2f3bde8c 162 RadioUart->putc( 0x98 ); // Reversed opcode for read register (0x19)
GregCr 0:03ec2f3bde8c 163 RadioUart->putc( 0x10 ); // Reversed MSB register address (0x08)
GregCr 0:03ec2f3bde8c 164 RadioUart->putc( 0x18 ); // Reversed LSB register address (0x18)
GregCr 0:03ec2f3bde8c 165 RadioUart->putc( 0x80 ); // Reversed value for reading only 1 byte (0x01)
GregCr 0:03ec2f3bde8c 166 regVal = RadioUart->getc( )& 0xF3; // Read reversed value and mask it
GregCr 0:03ec2f3bde8c 167
GregCr 0:03ec2f3bde8c 168 RadioUart->putc( 0x18 ); // Reversed opcode for read register (0x18)
GregCr 0:03ec2f3bde8c 169 RadioUart->putc( 0x10 ); // Reversed MSB register address (0x08)
GregCr 0:03ec2f3bde8c 170 RadioUart->putc( 0x18 ); // Reversed LSB register address (0x18)
GregCr 0:03ec2f3bde8c 171 RadioUart->putc( 0x80 ); // Reversed value for writing only 1 byte (0x01)
GregCr 0:03ec2f3bde8c 172 RadioUart->putc( regVal ); // The new value of the register
GregCr 0:03ec2f3bde8c 173
GregCr 0:03ec2f3bde8c 174 // After this point, the UART is running standard mode: 8 data bit, 1 even
GregCr 0:03ec2f3bde8c 175 // parity bit, 1 stop bit, 115200 baud, LSB first
GregCr 0:03ec2f3bde8c 176 wait_us( 10 );
GregCr 0:03ec2f3bde8c 177 }
GregCr 0:03ec2f3bde8c 178
GregCr 0:03ec2f3bde8c 179 void SX1280Hal::IoIrqInit( DioIrqHandler irqHandler )
GregCr 0:03ec2f3bde8c 180 {
GregCr 0:03ec2f3bde8c 181 assert_param( RadioSpi != NULL || RadioUart != NULL );
GregCr 0:03ec2f3bde8c 182 if( RadioSpi != NULL )
GregCr 0:03ec2f3bde8c 183 {
GregCr 0:03ec2f3bde8c 184 SpiInit( );
GregCr 0:03ec2f3bde8c 185 }
GregCr 0:03ec2f3bde8c 186 if( RadioUart != NULL )
GregCr 0:03ec2f3bde8c 187 {
GregCr 0:03ec2f3bde8c 188 UartInit( );
GregCr 0:03ec2f3bde8c 189 }
GregCr 0:03ec2f3bde8c 190
GregCr 0:03ec2f3bde8c 191 BUSY.mode( PullNone );
GregCr 0:03ec2f3bde8c 192
GregCr 0:03ec2f3bde8c 193 DioAssignCallback( DIO1, PullNone, irqHandler );
GregCr 0:03ec2f3bde8c 194 DioAssignCallback( DIO2, PullNone, irqHandler );
GregCr 0:03ec2f3bde8c 195 DioAssignCallback( DIO3, PullNone, irqHandler );
GregCr 0:03ec2f3bde8c 196 }
GregCr 0:03ec2f3bde8c 197
GregCr 0:03ec2f3bde8c 198 void SX1280Hal::Reset( void )
GregCr 0:03ec2f3bde8c 199 {
GregCr 0:03ec2f3bde8c 200 __disable_irq( );
GregCr 0:03ec2f3bde8c 201 wait_ms( 20 );
GregCr 0:03ec2f3bde8c 202 RadioReset.output( );
GregCr 0:03ec2f3bde8c 203 RadioReset = 0;
GregCr 0:03ec2f3bde8c 204 wait_ms( 50 );
GregCr 0:03ec2f3bde8c 205 RadioReset = 1;
GregCr 0:03ec2f3bde8c 206 RadioReset.input( ); // Using the internal pull-up
GregCr 0:03ec2f3bde8c 207 wait_ms( 20 );
GregCr 0:03ec2f3bde8c 208 __enable_irq( );
GregCr 0:03ec2f3bde8c 209 }
GregCr 0:03ec2f3bde8c 210
GregCr 0:03ec2f3bde8c 211 void SX1280Hal::Wakeup( void )
GregCr 0:03ec2f3bde8c 212 {
GregCr 0:03ec2f3bde8c 213 __disable_irq( );
GregCr 0:03ec2f3bde8c 214
GregCr 0:03ec2f3bde8c 215 //Don't wait for BUSY here
GregCr 0:03ec2f3bde8c 216
GregCr 0:03ec2f3bde8c 217 if( RadioSpi != NULL )
GregCr 0:03ec2f3bde8c 218 {
GregCr 0:03ec2f3bde8c 219 RadioNss = 0;
GregCr 0:03ec2f3bde8c 220 RadioSpi->write( RADIO_GET_STATUS );
GregCr 0:03ec2f3bde8c 221 RadioSpi->write( 0 );
GregCr 0:03ec2f3bde8c 222 RadioNss = 1;
GregCr 0:03ec2f3bde8c 223 }
GregCr 0:03ec2f3bde8c 224 if( RadioUart != NULL )
GregCr 0:03ec2f3bde8c 225 {
GregCr 0:03ec2f3bde8c 226 RadioUart->putc( RADIO_GET_STATUS );
GregCr 0:03ec2f3bde8c 227 WaitUartReadable( );
GregCr 0:03ec2f3bde8c 228 RadioUart->getc( );
GregCr 0:03ec2f3bde8c 229 }
GregCr 0:03ec2f3bde8c 230
GregCr 0:03ec2f3bde8c 231 // Wait for chip to be ready.
GregCr 0:03ec2f3bde8c 232 WaitOnBusy( );
GregCr 0:03ec2f3bde8c 233
GregCr 0:03ec2f3bde8c 234 __enable_irq( );
GregCr 0:03ec2f3bde8c 235 }
GregCr 0:03ec2f3bde8c 236
GregCr 0:03ec2f3bde8c 237 void SX1280Hal::WriteCommand( RadioCommands_t command, uint8_t *buffer, uint16_t size )
GregCr 0:03ec2f3bde8c 238 {
GregCr 0:03ec2f3bde8c 239 WaitOnBusy( );
GregCr 0:03ec2f3bde8c 240
GregCr 0:03ec2f3bde8c 241 if( RadioSpi != NULL )
GregCr 0:03ec2f3bde8c 242 {
GregCr 0:03ec2f3bde8c 243 RadioNss = 0;
GregCr 0:03ec2f3bde8c 244 RadioSpi->write( ( uint8_t )command );
GregCr 0:03ec2f3bde8c 245 for( uint16_t i = 0; i < size; i++ )
GregCr 0:03ec2f3bde8c 246 {
GregCr 0:03ec2f3bde8c 247 RadioSpi->write( buffer[i] );
GregCr 0:03ec2f3bde8c 248 }
GregCr 0:03ec2f3bde8c 249 RadioNss = 1;
GregCr 0:03ec2f3bde8c 250 }
GregCr 0:03ec2f3bde8c 251 if( RadioUart != NULL )
GregCr 0:03ec2f3bde8c 252 {
GregCr 0:03ec2f3bde8c 253 RadioUart->putc( command );
GregCr 0:03ec2f3bde8c 254 if( size > 0 )
GregCr 0:03ec2f3bde8c 255 {
GregCr 0:03ec2f3bde8c 256 RadioUart->putc( size );
GregCr 0:03ec2f3bde8c 257 for( uint16_t i = 0; i < size; i++ )
GregCr 0:03ec2f3bde8c 258 {
GregCr 0:03ec2f3bde8c 259 RadioUart->putc( buffer[i] );
GregCr 0:03ec2f3bde8c 260 }
GregCr 0:03ec2f3bde8c 261 }
GregCr 0:03ec2f3bde8c 262 }
GregCr 0:03ec2f3bde8c 263
GregCr 0:03ec2f3bde8c 264 if( command != RADIO_SET_SLEEP )
GregCr 0:03ec2f3bde8c 265 {
GregCr 0:03ec2f3bde8c 266 WaitOnBusy( );
GregCr 0:03ec2f3bde8c 267 }
GregCr 0:03ec2f3bde8c 268 }
GregCr 0:03ec2f3bde8c 269
GregCr 0:03ec2f3bde8c 270 void SX1280Hal::ReadCommand( RadioCommands_t command, uint8_t *buffer, uint16_t size )
GregCr 0:03ec2f3bde8c 271 {
GregCr 0:03ec2f3bde8c 272 WaitOnBusy( );
GregCr 0:03ec2f3bde8c 273
GregCr 0:03ec2f3bde8c 274 if( RadioSpi != NULL )
GregCr 0:03ec2f3bde8c 275 {
GregCr 0:03ec2f3bde8c 276 RadioNss = 0;
GregCr 4:abf14b677777 277 if( command == RADIO_GET_STATUS )
GregCr 0:03ec2f3bde8c 278 {
GregCr 4:abf14b677777 279 buffer[0] = RadioSpi->write( ( uint8_t )command );
GregCr 4:abf14b677777 280 RadioSpi->write( 0 );
GregCr 4:abf14b677777 281 RadioSpi->write( 0 );
GregCr 4:abf14b677777 282 }
GregCr 4:abf14b677777 283 else
GregCr 4:abf14b677777 284 {
GregCr 4:abf14b677777 285 RadioSpi->write( ( uint8_t )command );
GregCr 4:abf14b677777 286 RadioSpi->write( 0 );
GregCr 4:abf14b677777 287 for( uint16_t i = 0; i < size; i++ )
GregCr 4:abf14b677777 288 {
GregCr 4:abf14b677777 289 buffer[i] = RadioSpi->write( 0 );
GregCr 4:abf14b677777 290 }
GregCr 0:03ec2f3bde8c 291 }
GregCr 0:03ec2f3bde8c 292 RadioNss = 1;
GregCr 0:03ec2f3bde8c 293 }
GregCr 0:03ec2f3bde8c 294 if( RadioUart != NULL )
GregCr 0:03ec2f3bde8c 295 {
GregCr 0:03ec2f3bde8c 296 RadioUart->putc( command );
GregCr 0:03ec2f3bde8c 297
GregCr 0:03ec2f3bde8c 298 // Behavior on the UART is different depending of the opcode command
GregCr 0:03ec2f3bde8c 299 if( ( command == RADIO_GET_PACKETTYPE ) ||
GregCr 0:03ec2f3bde8c 300 ( command == RADIO_GET_RXBUFFERSTATUS ) ||
GregCr 0:03ec2f3bde8c 301 ( command == RADIO_GET_RSSIINST ) ||
GregCr 0:03ec2f3bde8c 302 ( command == RADIO_GET_PACKETSTATUS ) ||
GregCr 0:03ec2f3bde8c 303 ( command == RADIO_GET_IRQSTATUS ) )
GregCr 0:03ec2f3bde8c 304 {
GregCr 0:03ec2f3bde8c 305 /*
GregCr 0:03ec2f3bde8c 306 * TODO : Check size size in UART (uint8_t in putc)
GregCr 0:03ec2f3bde8c 307 */
GregCr 0:03ec2f3bde8c 308 RadioUart->putc( size );
GregCr 0:03ec2f3bde8c 309 }
GregCr 0:03ec2f3bde8c 310
GregCr 0:03ec2f3bde8c 311 WaitUartReadable( );
GregCr 0:03ec2f3bde8c 312 for( uint16_t i = 0; i < size; i++ )
GregCr 0:03ec2f3bde8c 313 {
GregCr 0:03ec2f3bde8c 314 buffer[i] = RadioUart->getc( );
GregCr 0:03ec2f3bde8c 315 }
GregCr 0:03ec2f3bde8c 316 }
GregCr 0:03ec2f3bde8c 317
GregCr 0:03ec2f3bde8c 318 WaitOnBusy( );
GregCr 0:03ec2f3bde8c 319 }
GregCr 0:03ec2f3bde8c 320
GregCr 0:03ec2f3bde8c 321 void SX1280Hal::WriteRegister( uint16_t address, uint8_t *buffer, uint16_t size )
GregCr 0:03ec2f3bde8c 322 {
GregCr 0:03ec2f3bde8c 323 WaitOnBusy( );
GregCr 0:03ec2f3bde8c 324
GregCr 0:03ec2f3bde8c 325 if( RadioSpi != NULL )
GregCr 0:03ec2f3bde8c 326 {
GregCr 0:03ec2f3bde8c 327 RadioNss = 0;
GregCr 0:03ec2f3bde8c 328 RadioSpi->write( RADIO_WRITE_REGISTER );
GregCr 0:03ec2f3bde8c 329 RadioSpi->write( ( address & 0xFF00 ) >> 8 );
GregCr 0:03ec2f3bde8c 330 RadioSpi->write( address & 0x00FF );
GregCr 0:03ec2f3bde8c 331 for( uint16_t i = 0; i < size; i++ )
GregCr 0:03ec2f3bde8c 332 {
GregCr 0:03ec2f3bde8c 333 RadioSpi->write( buffer[i] );
GregCr 0:03ec2f3bde8c 334 }
GregCr 0:03ec2f3bde8c 335 RadioNss = 1;
GregCr 0:03ec2f3bde8c 336 }
GregCr 0:03ec2f3bde8c 337 if( RadioUart != NULL )
GregCr 0:03ec2f3bde8c 338 {
GregCr 0:03ec2f3bde8c 339 uint16_t addr = address;
GregCr 0:03ec2f3bde8c 340 uint16_t i = 0;
GregCr 0:03ec2f3bde8c 341 for( addr = address; ( addr + 255 ) < ( address + size ); )
GregCr 0:03ec2f3bde8c 342 {
GregCr 0:03ec2f3bde8c 343 RadioUart->putc( RADIO_WRITE_REGISTER );
GregCr 0:03ec2f3bde8c 344 RadioUart->putc( ( addr & 0xFF00 ) >> 8 );
GregCr 0:03ec2f3bde8c 345 RadioUart->putc( addr & 0x00FF );
GregCr 0:03ec2f3bde8c 346 RadioUart->putc( 255 );
GregCr 0:03ec2f3bde8c 347 for( uint16_t lastAddr = addr + 255 ; addr < lastAddr; i++, addr++ )
GregCr 0:03ec2f3bde8c 348 {
GregCr 0:03ec2f3bde8c 349 RadioUart->putc( buffer[i] );
GregCr 0:03ec2f3bde8c 350 }
GregCr 0:03ec2f3bde8c 351 }
GregCr 0:03ec2f3bde8c 352 RadioUart->putc( RADIO_WRITE_REGISTER );
GregCr 0:03ec2f3bde8c 353 RadioUart->putc( ( addr & 0xFF00 ) >> 8 );
GregCr 0:03ec2f3bde8c 354 RadioUart->putc( addr & 0x00FF );
GregCr 0:03ec2f3bde8c 355 RadioUart->putc( address + size - addr );
GregCr 0:03ec2f3bde8c 356
GregCr 0:03ec2f3bde8c 357 for( ; addr < ( address + size ); addr++, i++ )
GregCr 0:03ec2f3bde8c 358 {
GregCr 0:03ec2f3bde8c 359 RadioUart->putc( buffer[i] );
GregCr 0:03ec2f3bde8c 360 }
GregCr 0:03ec2f3bde8c 361 }
GregCr 0:03ec2f3bde8c 362
GregCr 0:03ec2f3bde8c 363 WaitOnBusy( );
GregCr 0:03ec2f3bde8c 364 }
GregCr 0:03ec2f3bde8c 365
GregCr 0:03ec2f3bde8c 366 void SX1280Hal::WriteRegister( uint16_t address, uint8_t value )
GregCr 0:03ec2f3bde8c 367 {
GregCr 0:03ec2f3bde8c 368 WriteRegister( address, &value, 1 );
GregCr 0:03ec2f3bde8c 369 }
GregCr 0:03ec2f3bde8c 370
GregCr 0:03ec2f3bde8c 371 void SX1280Hal::ReadRegister( uint16_t address, uint8_t *buffer, uint16_t size )
GregCr 0:03ec2f3bde8c 372 {
GregCr 0:03ec2f3bde8c 373 WaitOnBusy( );
GregCr 0:03ec2f3bde8c 374
GregCr 0:03ec2f3bde8c 375 if( RadioSpi != NULL )
GregCr 0:03ec2f3bde8c 376 {
GregCr 0:03ec2f3bde8c 377 RadioNss = 0;
GregCr 0:03ec2f3bde8c 378 RadioSpi->write( RADIO_READ_REGISTER );
GregCr 0:03ec2f3bde8c 379 RadioSpi->write( ( address & 0xFF00 ) >> 8 );
GregCr 0:03ec2f3bde8c 380 RadioSpi->write( address & 0x00FF );
GregCr 0:03ec2f3bde8c 381 RadioSpi->write( 0 );
GregCr 0:03ec2f3bde8c 382 for( uint16_t i = 0; i < size; i++ )
GregCr 0:03ec2f3bde8c 383 {
GregCr 0:03ec2f3bde8c 384 buffer[i] = RadioSpi->write( 0 );
GregCr 0:03ec2f3bde8c 385 }
GregCr 0:03ec2f3bde8c 386 RadioNss = 1;
GregCr 0:03ec2f3bde8c 387 }
GregCr 0:03ec2f3bde8c 388 if( RadioUart != NULL )
GregCr 0:03ec2f3bde8c 389 {
GregCr 0:03ec2f3bde8c 390 uint16_t addr = address;
GregCr 0:03ec2f3bde8c 391 uint16_t i = 0;
GregCr 0:03ec2f3bde8c 392 for( addr = address; ( addr + 255 ) < ( address + size ); )
GregCr 0:03ec2f3bde8c 393 {
GregCr 0:03ec2f3bde8c 394 RadioUart->putc( RADIO_READ_REGISTER );
GregCr 0:03ec2f3bde8c 395 RadioUart->putc( ( addr & 0xFF00 ) >> 8 );
GregCr 0:03ec2f3bde8c 396 RadioUart->putc( addr & 0x00FF );
GregCr 0:03ec2f3bde8c 397 RadioUart->putc( 255 );
GregCr 0:03ec2f3bde8c 398 WaitUartReadable( );
GregCr 0:03ec2f3bde8c 399 for( uint16_t lastAddr = addr + 255 ; addr < lastAddr; i++, addr++ )
GregCr 0:03ec2f3bde8c 400 {
GregCr 0:03ec2f3bde8c 401 buffer[i] = RadioUart->getc( );
GregCr 0:03ec2f3bde8c 402 }
GregCr 0:03ec2f3bde8c 403 }
GregCr 0:03ec2f3bde8c 404 RadioUart->putc( RADIO_READ_REGISTER );
GregCr 0:03ec2f3bde8c 405 RadioUart->putc( ( addr & 0xFF00 ) >> 8 );
GregCr 0:03ec2f3bde8c 406 RadioUart->putc( addr & 0x00FF );
GregCr 0:03ec2f3bde8c 407 RadioUart->putc( address + size - addr );
GregCr 0:03ec2f3bde8c 408 WaitUartReadable( );
GregCr 0:03ec2f3bde8c 409 for( ; addr < ( address + size ); addr++, i++ )
GregCr 0:03ec2f3bde8c 410 {
GregCr 0:03ec2f3bde8c 411 buffer[i] = RadioUart->getc( );
GregCr 0:03ec2f3bde8c 412 }
GregCr 0:03ec2f3bde8c 413 }
GregCr 0:03ec2f3bde8c 414
GregCr 0:03ec2f3bde8c 415 WaitOnBusy( );
GregCr 0:03ec2f3bde8c 416 }
GregCr 0:03ec2f3bde8c 417
GregCr 0:03ec2f3bde8c 418 uint8_t SX1280Hal::ReadRegister( uint16_t address )
GregCr 0:03ec2f3bde8c 419 {
GregCr 0:03ec2f3bde8c 420 uint8_t data;
GregCr 0:03ec2f3bde8c 421
GregCr 0:03ec2f3bde8c 422 ReadRegister( address, &data, 1 );
GregCr 0:03ec2f3bde8c 423 return data;
GregCr 0:03ec2f3bde8c 424 }
GregCr 0:03ec2f3bde8c 425
GregCr 0:03ec2f3bde8c 426 void SX1280Hal::WriteBuffer( uint8_t offset, uint8_t *buffer, uint8_t size )
GregCr 0:03ec2f3bde8c 427 {
GregCr 0:03ec2f3bde8c 428 WaitOnBusy( );
GregCr 0:03ec2f3bde8c 429
GregCr 0:03ec2f3bde8c 430 if( RadioSpi != NULL )
GregCr 0:03ec2f3bde8c 431 {
GregCr 0:03ec2f3bde8c 432 RadioNss = 0;
GregCr 0:03ec2f3bde8c 433 RadioSpi->write( RADIO_WRITE_BUFFER );
GregCr 0:03ec2f3bde8c 434 RadioSpi->write( offset );
GregCr 0:03ec2f3bde8c 435 for( uint16_t i = 0; i < size; i++ )
GregCr 0:03ec2f3bde8c 436 {
GregCr 0:03ec2f3bde8c 437 RadioSpi->write( buffer[i] );
GregCr 0:03ec2f3bde8c 438 }
GregCr 0:03ec2f3bde8c 439 RadioNss = 1;
GregCr 0:03ec2f3bde8c 440 }
GregCr 0:03ec2f3bde8c 441 if( RadioUart != NULL )
GregCr 0:03ec2f3bde8c 442 {
GregCr 0:03ec2f3bde8c 443 RadioUart->putc( RADIO_WRITE_BUFFER );
GregCr 0:03ec2f3bde8c 444 RadioUart->putc( offset );
GregCr 0:03ec2f3bde8c 445 RadioUart->putc( size );
GregCr 0:03ec2f3bde8c 446 for( uint16_t i = 0; i < size; i++ )
GregCr 0:03ec2f3bde8c 447 {
GregCr 0:03ec2f3bde8c 448 RadioUart->putc( buffer[i] );
GregCr 0:03ec2f3bde8c 449 }
GregCr 0:03ec2f3bde8c 450 }
GregCr 0:03ec2f3bde8c 451
GregCr 0:03ec2f3bde8c 452 WaitOnBusy( );
GregCr 0:03ec2f3bde8c 453 }
GregCr 0:03ec2f3bde8c 454
GregCr 0:03ec2f3bde8c 455 void SX1280Hal::ReadBuffer( uint8_t offset, uint8_t *buffer, uint8_t size )
GregCr 0:03ec2f3bde8c 456 {
GregCr 0:03ec2f3bde8c 457 WaitOnBusy( );
GregCr 0:03ec2f3bde8c 458
GregCr 0:03ec2f3bde8c 459 if( RadioSpi != NULL )
GregCr 0:03ec2f3bde8c 460 {
GregCr 0:03ec2f3bde8c 461 RadioNss = 0;
GregCr 0:03ec2f3bde8c 462 RadioSpi->write( RADIO_READ_BUFFER );
GregCr 0:03ec2f3bde8c 463 RadioSpi->write( offset );
GregCr 0:03ec2f3bde8c 464 RadioSpi->write( 0 );
GregCr 0:03ec2f3bde8c 465 for( uint16_t i = 0; i < size; i++ )
GregCr 0:03ec2f3bde8c 466 {
GregCr 0:03ec2f3bde8c 467 buffer[i] = RadioSpi->write( 0 );
GregCr 0:03ec2f3bde8c 468 }
GregCr 0:03ec2f3bde8c 469 RadioNss = 1;
GregCr 0:03ec2f3bde8c 470 }
GregCr 0:03ec2f3bde8c 471 if( RadioUart != NULL )
GregCr 0:03ec2f3bde8c 472 {
GregCr 0:03ec2f3bde8c 473 RadioUart->putc( RADIO_READ_BUFFER );
GregCr 0:03ec2f3bde8c 474 RadioUart->putc( offset );
GregCr 0:03ec2f3bde8c 475 RadioUart->putc( size );
GregCr 0:03ec2f3bde8c 476 WaitUartReadable( );
GregCr 0:03ec2f3bde8c 477 for( uint16_t i = 0; i < size; i++ )
GregCr 0:03ec2f3bde8c 478 {
GregCr 0:03ec2f3bde8c 479 buffer[i] = RadioUart->getc( );
GregCr 0:03ec2f3bde8c 480 }
GregCr 0:03ec2f3bde8c 481 }
GregCr 0:03ec2f3bde8c 482
GregCr 0:03ec2f3bde8c 483 WaitOnBusy( );
GregCr 0:03ec2f3bde8c 484 }
GregCr 0:03ec2f3bde8c 485
GregCr 0:03ec2f3bde8c 486 uint8_t SX1280Hal::GetDioStatus( void )
GregCr 0:03ec2f3bde8c 487 {
GregCr 0:03ec2f3bde8c 488 return ( *DIO3 << 3 ) | ( *DIO2 << 2 ) | ( *DIO1 << 1 ) | ( BUSY << 0 );
GregCr 0:03ec2f3bde8c 489 }