sx1280-hal.c 8.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353
  1. /*
  2. ______ _
  3. / _____) _ | |
  4. ( (____ _____ ____ _| |_ _____ ____| |__
  5. \____ \| ___ | (_ _) ___ |/ ___) _ \
  6. _____) ) ____| | | || |_| ____( (___| | | |
  7. (______/|_____)_|_|_| \__)_____)\____)_| |_|
  8. (C)2016 Semtech
  9. Description: Handling of the node configuration protocol
  10. License: Revised BSD License, see LICENSE.TXT file include in the project
  11. Maintainer: Miguel Luis, Gregory Cristian and Matthieu Verdy
  12. */
  13. #include <string.h>
  14. #include "sx1280-hal.h"
  15. #include "radio.h"
  16. #include "myRadio_gpio.h"
  17. /*!
  18. * \brief Define the size of tx and rx hal buffers
  19. *
  20. * The Tx and Rx hal buffers are used for SPI communication to
  21. * store data to be sent/receive to/from the chip.
  22. *
  23. * \warning The application must ensure the maximal useful size to be much lower
  24. * than the MAX_HAL_BUFFER_SIZE
  25. */
  26. #define MAX_HAL_BUFFER_SIZE 255 //0xFFF
  27. #define IRQ_HIGH_PRIORITY 0
  28. /*!
  29. * Radio driver structure initialization
  30. */
  31. const struct Radio_s Radio =
  32. {
  33. SX1280Init,
  34. SX1280HalReset,
  35. SX1280GetStatus,
  36. SX1280HalWriteCommand,
  37. SX1280HalReadCommand,
  38. SX1280HalWriteRegisters,
  39. SX1280HalWriteRegister,
  40. SX1280HalReadRegisters,
  41. SX1280HalReadRegister,
  42. SX1280HalWriteBuffer,
  43. SX1280HalReadBuffer,
  44. SX1280HalGetDioStatus,
  45. SX1280GetFirmwareVersion,
  46. SX1280SetRegulatorMode,
  47. SX1280SetStandby,
  48. SX1280SetPacketType,
  49. SX1280SetModulationParams,
  50. SX1280SetPacketParams,
  51. SX1280SetRfFrequency,
  52. SX1280SetBufferBaseAddresses,
  53. SX1280SetTxParams,
  54. SX1280SetDioIrqParams,
  55. SX1280SetSyncWord,
  56. SX1280SetRx,
  57. SX1280GetPayload,
  58. SX1280SendPayload,
  59. SX1280SetRangingRole,
  60. SX1280SetPollingMode,
  61. SX1280SetInterruptMode,
  62. SX1280SetRegistersDefault,
  63. SX1280GetOpMode,
  64. SX1280SetSleep,
  65. SX1280SetFs,
  66. SX1280SetTx,
  67. SX1280SetRxDutyCycle,
  68. SX1280SetCad,
  69. SX1280SetTxContinuousWave,
  70. SX1280SetTxContinuousPreamble,
  71. SX1280GetPacketType,
  72. SX1280SetCadParams,
  73. SX1280GetRxBufferStatus,
  74. SX1280GetPacketStatus,
  75. SX1280GetRssiInst,
  76. SX1280GetIrqStatus,
  77. SX1280ClearIrqStatus,
  78. SX1280Calibrate,
  79. SX1280SetSaveContext,
  80. SX1280SetAutoTx,
  81. SX1280SetAutoFS,
  82. SX1280SetLongPreamble,
  83. SX1280SetPayload,
  84. SX1280SetSyncWordErrorTolerance,
  85. SX1280SetCrcSeed,
  86. SX1280SetBleAccessAddress,
  87. SX1280SetBleAdvertizerAccessAddress,
  88. SX1280SetCrcPolynomial,
  89. SX1280SetWhiteningSeed,
  90. SX1280SetRangingIdLength,
  91. SX1280SetDeviceRangingAddress,
  92. SX1280SetRangingRequestAddress,
  93. SX1280GetRangingResult,
  94. SX1280SetRangingCalibration,
  95. SX1280RangingClearFilterResult,
  96. SX1280RangingSetFilterNumSamples,
  97. SX1280GetFrequencyError,
  98. };
  99. static uint8_t halTxBuffer[MAX_HAL_BUFFER_SIZE] = {0x00};
  100. static uint8_t halRxBuffer[MAX_HAL_BUFFER_SIZE] = {0x00};
  101. void rf_delay(uint32_t time_ms)
  102. {
  103. delay1ms(time_ms);
  104. }
  105. /*!
  106. * \brief Used to block execution waiting for low state on radio busy pin.
  107. * Essentially used in SPI communications
  108. */
  109. void SX1280HalWaitOnBusy( void )
  110. {
  111. // while( HAL_GPIO_ReadPin( RADIO_BUSY_PORT, RADIO_BUSY_PIN ) == 1 );
  112. while(READ_RF_SX128x_BUSY()==1);
  113. }
  114. void SX1280HalInit( DioIrqHandler **irqHandlers )
  115. {
  116. SX1280HalReset( );
  117. SX1280HalIoIrqInit( irqHandlers );
  118. }
  119. void SX1280HalIoIrqInit( DioIrqHandler **irqHandlers )
  120. {
  121. //GpioSetIrq( RADIO_DIOx_PORT, RADIO_DIOx_PIN, IRQ_HIGH_PRIORITY, irqHandlers[0] );
  122. }
  123. void SX1280HalReset( void )
  124. {
  125. rf_delay( 20 );
  126. // GpioWrite( RADIO_nRESET_PORT, RADIO_nRESET_PIN, 0 );
  127. RF_SX128x_RST_L();
  128. rf_delay( 50 );
  129. //GpioWrite( RADIO_nRESET_PORT, RADIO_nRESET_PIN, 1 );
  130. RF_SX128x_RST_H();
  131. rf_delay( 20 );
  132. }
  133. void SX1280HalClearInstructionRam( void )
  134. {
  135. uint16_t index;
  136. // Clearing the instruction RAM is writing 0x00s on every bytes of the
  137. // instruction RAM
  138. uint16_t halSize = 3 + IRAM_SIZE;
  139. halTxBuffer[0] = RADIO_WRITE_REGISTER;
  140. halTxBuffer[1] = ( IRAM_START_ADDRESS >> 8 ) & 0x00FF;
  141. halTxBuffer[2] = IRAM_START_ADDRESS & 0x00FF;
  142. for( index = 0; index < IRAM_SIZE; index++ )
  143. {
  144. halTxBuffer[3+index] = 0x00;
  145. }
  146. SX1280HalWaitOnBusy( );
  147. // GpioWrite( RADIO_NSS_PORT, RADIO_NSS_PIN, 0 );
  148. RF_SPI_NSS_L();
  149. SpiWriteData( halTxBuffer, halSize );
  150. // GpioWrite( RADIO_NSS_PORT, RADIO_NSS_PIN, 1 );
  151. RF_SPI_NSS_H();
  152. SX1280HalWaitOnBusy( );
  153. }
  154. void SX120HalWakeup( void )
  155. {
  156. uint16_t halSize = 2;
  157. __disable_irq( );
  158. //GpioWrite( RADIO_NSS_PORT, RADIO_NSS_PIN, 0 );
  159. RF_SPI_NSS_L();
  160. halTxBuffer[0] = RADIO_GET_STATUS;
  161. halTxBuffer[1] = 0x00;
  162. SpiWriteData( halTxBuffer, halSize );
  163. //GpioWrite( RADIO_NSS_PORT, RADIO_NSS_PIN, 1 );
  164. RF_SPI_NSS_H();
  165. // Wait for chip to be ready.
  166. SX1280HalWaitOnBusy( );
  167. __enable_irq( );
  168. }
  169. void SX1280HalWriteCommand( RadioCommands_t command, uint8_t *buffer, uint16_t size )
  170. {
  171. uint16_t halSize = size + 1;
  172. SX1280HalWaitOnBusy( );
  173. //GpioWrite( RADIO_NSS_PORT, RADIO_NSS_PIN, 0 );
  174. RF_SPI_NSS_L();
  175. halTxBuffer[0] = command;
  176. memcpy( halTxBuffer + 1, ( uint8_t * )buffer, size * sizeof( uint8_t ) );
  177. SpiWriteData( halTxBuffer, halSize );
  178. //GpioWrite( RADIO_NSS_PORT, RADIO_NSS_PIN, 1 );
  179. RF_SPI_NSS_H();
  180. if( command != RADIO_SET_SLEEP )
  181. {
  182. SX1280HalWaitOnBusy( );
  183. }
  184. }
  185. void SX1280HalReadCommand( RadioCommands_t command, uint8_t *buffer, uint16_t size )
  186. {
  187. uint16_t index;
  188. uint16_t halSize = 2 + size;
  189. halTxBuffer[0] = command;
  190. halTxBuffer[1] = 0x00;
  191. for( index = 0; index < size; index++ )
  192. {
  193. halTxBuffer[2+index] = 0x00;
  194. }
  195. SX1280HalWaitOnBusy( );
  196. //GpioWrite( RADIO_NSS_PORT, RADIO_NSS_PIN, 0 );
  197. RF_SPI_NSS_L();
  198. SpiWriteReadData( halTxBuffer, halRxBuffer, halSize );
  199. memcpy( buffer, halRxBuffer + 2, size );
  200. //GpioWrite( RADIO_NSS_PORT, RADIO_NSS_PIN, 1 );
  201. RF_SPI_NSS_H();
  202. SX1280HalWaitOnBusy( );
  203. }
  204. void SX1280HalWriteRegisters( uint16_t address, uint8_t *buffer, uint16_t size )
  205. {
  206. uint16_t halSize = size + 3;
  207. halTxBuffer[0] = RADIO_WRITE_REGISTER;
  208. halTxBuffer[1] = ( address & 0xFF00 ) >> 8;
  209. halTxBuffer[2] = address & 0x00FF;
  210. memcpy( halTxBuffer + 3, buffer, size );
  211. SX1280HalWaitOnBusy( );
  212. //GpioWrite( RADIO_NSS_PORT, RADIO_NSS_PIN, 0 );
  213. RF_SPI_NSS_L();
  214. SpiWriteData( halTxBuffer, halSize );
  215. //GpioWrite( RADIO_NSS_PORT, RADIO_NSS_PIN, 1 );
  216. RF_SPI_NSS_H();
  217. SX1280HalWaitOnBusy( );
  218. }
  219. void SX1280HalWriteRegister( uint16_t address, uint8_t value )
  220. {
  221. SX1280HalWriteRegisters( address, &value, 1 );
  222. }
  223. void SX1280HalReadRegisters( uint16_t address, uint8_t *buffer, uint16_t size )
  224. {
  225. uint16_t index;
  226. uint16_t halSize = 4 + size;
  227. halTxBuffer[0] = RADIO_READ_REGISTER;
  228. halTxBuffer[1] = ( address & 0xFF00 ) >> 8;
  229. halTxBuffer[2] = address & 0x00FF;
  230. halTxBuffer[3] = 0x00;
  231. for( index = 0; index < size; index++ )
  232. {
  233. halTxBuffer[4+index] = 0x00;
  234. }
  235. SX1280HalWaitOnBusy( );
  236. //GpioWrite( RADIO_NSS_PORT, RADIO_NSS_PIN, 0 );
  237. RF_SPI_NSS_L();
  238. SpiWriteReadData( halTxBuffer, halRxBuffer, halSize );
  239. memcpy( buffer, halRxBuffer + 4, size );
  240. //GpioWrite( RADIO_NSS_PORT, RADIO_NSS_PIN, 1 );
  241. RF_SPI_NSS_H();
  242. SX1280HalWaitOnBusy( );
  243. }
  244. uint8_t SX1280HalReadRegister( uint16_t address )
  245. {
  246. uint8_t data;
  247. SX1280HalReadRegisters( address, &data, 1 );
  248. return data;
  249. }
  250. void SX1280HalWriteBuffer( uint8_t offset, uint8_t *buffer, uint8_t size )
  251. {
  252. uint16_t halSize = size + 2;
  253. halTxBuffer[0] = RADIO_WRITE_BUFFER;
  254. halTxBuffer[1] = ( offset ) >> 8;
  255. memcpy( halTxBuffer + 2, buffer, size );
  256. SX1280HalWaitOnBusy( );
  257. //GpioWrite( RADIO_NSS_PORT, RADIO_NSS_PIN, 0 );
  258. RF_SPI_NSS_L();
  259. SpiWriteData( halTxBuffer, halSize );
  260. //GpioWrite( RADIO_NSS_PORT, RADIO_NSS_PIN, 1 );
  261. RF_SPI_NSS_H();
  262. SX1280HalWaitOnBusy( );
  263. }
  264. void SX1280HalReadBuffer( uint8_t offset, uint8_t *buffer, uint8_t size )
  265. {
  266. uint16_t index;
  267. uint16_t halSize = size + 3;
  268. halTxBuffer[0] = RADIO_READ_BUFFER;
  269. halTxBuffer[1] = offset;
  270. halTxBuffer[2] = 0x00;
  271. for( index = 0; index < size; index++ )
  272. {
  273. halTxBuffer[3+index] = 0x00;
  274. }
  275. SX1280HalWaitOnBusy( );
  276. //GpioWrite( RADIO_NSS_PORT, RADIO_NSS_PIN, 0 );
  277. RF_SPI_NSS_L();
  278. SpiWriteReadData( halTxBuffer, halRxBuffer, halSize );
  279. memcpy( buffer, halRxBuffer + 3, size );
  280. //GpioWrite( RADIO_NSS_PORT, RADIO_NSS_PIN, 1 );
  281. RF_SPI_NSS_H();
  282. SX1280HalWaitOnBusy( );
  283. }
  284. uint8_t SX1280HalGetDioStatus( void )
  285. {
  286. return ( READ_RF_SX128x_IO1() << 1 ) | ( READ_RF_SX128x_BUSY() << 0 );
  287. }