sx1280-hal.c 9.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362
  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. uint32_t timeout = 0;
  112. // while( HAL_GPIO_ReadPin( RADIO_BUSY_PORT, RADIO_BUSY_PIN ) == 1 );
  113. while(READ_RF_SX128x_BUSY()==1)
  114. {
  115. timeout++;
  116. if( timeout > 100 )
  117. {
  118. break;
  119. }
  120. rf_delay(1);
  121. }
  122. }
  123. void SX1280HalInit( DioIrqHandler **irqHandlers )
  124. {
  125. SX1280HalReset( );
  126. SX1280HalIoIrqInit( irqHandlers );
  127. }
  128. void SX1280HalIoIrqInit( DioIrqHandler **irqHandlers )
  129. {
  130. //GpioSetIrq( RADIO_DIOx_PORT, RADIO_DIOx_PIN, IRQ_HIGH_PRIORITY, irqHandlers[0] );
  131. }
  132. void SX1280HalReset( void )
  133. {
  134. rf_delay( 20 );
  135. // GpioWrite( RADIO_nRESET_PORT, RADIO_nRESET_PIN, 0 );
  136. RF_SX128x_RST_L();
  137. rf_delay( 50 );
  138. //GpioWrite( RADIO_nRESET_PORT, RADIO_nRESET_PIN, 1 );
  139. RF_SX128x_RST_H();
  140. rf_delay( 20 );
  141. }
  142. void SX1280HalClearInstructionRam( void )
  143. {
  144. uint16_t index;
  145. // Clearing the instruction RAM is writing 0x00s on every bytes of the
  146. // instruction RAM
  147. uint16_t halSize = 3 + IRAM_SIZE;
  148. halTxBuffer[0] = RADIO_WRITE_REGISTER;
  149. halTxBuffer[1] = ( IRAM_START_ADDRESS >> 8 ) & 0x00FF;
  150. halTxBuffer[2] = IRAM_START_ADDRESS & 0x00FF;
  151. for( index = 0; index < IRAM_SIZE; index++ )
  152. {
  153. halTxBuffer[3+index] = 0x00;
  154. }
  155. SX1280HalWaitOnBusy( );
  156. // GpioWrite( RADIO_NSS_PORT, RADIO_NSS_PIN, 0 );
  157. RF_SPI_NSS_L();
  158. SpiWriteData( halTxBuffer, halSize );
  159. // GpioWrite( RADIO_NSS_PORT, RADIO_NSS_PIN, 1 );
  160. RF_SPI_NSS_H();
  161. SX1280HalWaitOnBusy( );
  162. }
  163. void SX120HalWakeup( void )
  164. {
  165. uint16_t halSize = 2;
  166. __disable_irq( );
  167. //GpioWrite( RADIO_NSS_PORT, RADIO_NSS_PIN, 0 );
  168. RF_SPI_NSS_L();
  169. halTxBuffer[0] = RADIO_GET_STATUS;
  170. halTxBuffer[1] = 0x00;
  171. SpiWriteData( halTxBuffer, halSize );
  172. //GpioWrite( RADIO_NSS_PORT, RADIO_NSS_PIN, 1 );
  173. RF_SPI_NSS_H();
  174. // Wait for chip to be ready.
  175. SX1280HalWaitOnBusy( );
  176. __enable_irq( );
  177. }
  178. void SX1280HalWriteCommand( RadioCommands_t command, uint8_t *buffer, uint16_t size )
  179. {
  180. uint16_t halSize = size + 1;
  181. SX1280HalWaitOnBusy( );
  182. //GpioWrite( RADIO_NSS_PORT, RADIO_NSS_PIN, 0 );
  183. RF_SPI_NSS_L();
  184. halTxBuffer[0] = command;
  185. memcpy( halTxBuffer + 1, ( uint8_t * )buffer, size * sizeof( uint8_t ) );
  186. SpiWriteData( halTxBuffer, halSize );
  187. //GpioWrite( RADIO_NSS_PORT, RADIO_NSS_PIN, 1 );
  188. RF_SPI_NSS_H();
  189. if( command != RADIO_SET_SLEEP )
  190. {
  191. SX1280HalWaitOnBusy( );
  192. }
  193. }
  194. void SX1280HalReadCommand( RadioCommands_t command, uint8_t *buffer, uint16_t size )
  195. {
  196. uint16_t index;
  197. uint16_t halSize = 2 + size;
  198. halTxBuffer[0] = command;
  199. halTxBuffer[1] = 0x00;
  200. for( index = 0; index < size; index++ )
  201. {
  202. halTxBuffer[2+index] = 0x00;
  203. }
  204. SX1280HalWaitOnBusy( );
  205. //GpioWrite( RADIO_NSS_PORT, RADIO_NSS_PIN, 0 );
  206. RF_SPI_NSS_L();
  207. SpiWriteReadData( halTxBuffer, halRxBuffer, halSize );
  208. memcpy( buffer, halRxBuffer + 2, size );
  209. //GpioWrite( RADIO_NSS_PORT, RADIO_NSS_PIN, 1 );
  210. RF_SPI_NSS_H();
  211. SX1280HalWaitOnBusy( );
  212. }
  213. void SX1280HalWriteRegisters( uint16_t address, uint8_t *buffer, uint16_t size )
  214. {
  215. uint16_t halSize = size + 3;
  216. halTxBuffer[0] = RADIO_WRITE_REGISTER;
  217. halTxBuffer[1] = ( address & 0xFF00 ) >> 8;
  218. halTxBuffer[2] = address & 0x00FF;
  219. memcpy( halTxBuffer + 3, buffer, size );
  220. SX1280HalWaitOnBusy( );
  221. //GpioWrite( RADIO_NSS_PORT, RADIO_NSS_PIN, 0 );
  222. RF_SPI_NSS_L();
  223. SpiWriteData( halTxBuffer, halSize );
  224. //GpioWrite( RADIO_NSS_PORT, RADIO_NSS_PIN, 1 );
  225. RF_SPI_NSS_H();
  226. SX1280HalWaitOnBusy( );
  227. }
  228. void SX1280HalWriteRegister( uint16_t address, uint8_t value )
  229. {
  230. SX1280HalWriteRegisters( address, &value, 1 );
  231. }
  232. void SX1280HalReadRegisters( uint16_t address, uint8_t *buffer, uint16_t size )
  233. {
  234. uint16_t index;
  235. uint16_t halSize = 4 + size;
  236. halTxBuffer[0] = RADIO_READ_REGISTER;
  237. halTxBuffer[1] = ( address & 0xFF00 ) >> 8;
  238. halTxBuffer[2] = address & 0x00FF;
  239. halTxBuffer[3] = 0x00;
  240. for( index = 0; index < size; index++ )
  241. {
  242. halTxBuffer[4+index] = 0x00;
  243. }
  244. SX1280HalWaitOnBusy( );
  245. //GpioWrite( RADIO_NSS_PORT, RADIO_NSS_PIN, 0 );
  246. RF_SPI_NSS_L();
  247. SpiWriteReadData( halTxBuffer, halRxBuffer, halSize );
  248. memcpy( buffer, halRxBuffer + 4, size );
  249. //GpioWrite( RADIO_NSS_PORT, RADIO_NSS_PIN, 1 );
  250. RF_SPI_NSS_H();
  251. SX1280HalWaitOnBusy( );
  252. }
  253. uint8_t SX1280HalReadRegister( uint16_t address )
  254. {
  255. uint8_t data;
  256. SX1280HalReadRegisters( address, &data, 1 );
  257. return data;
  258. }
  259. void SX1280HalWriteBuffer( uint8_t offset, uint8_t *buffer, uint8_t size )
  260. {
  261. uint16_t halSize = size + 2;
  262. halTxBuffer[0] = RADIO_WRITE_BUFFER;
  263. halTxBuffer[1] = ( offset ) >> 8;
  264. memcpy( halTxBuffer + 2, buffer, size );
  265. SX1280HalWaitOnBusy( );
  266. //GpioWrite( RADIO_NSS_PORT, RADIO_NSS_PIN, 0 );
  267. RF_SPI_NSS_L();
  268. SpiWriteData( halTxBuffer, halSize );
  269. //GpioWrite( RADIO_NSS_PORT, RADIO_NSS_PIN, 1 );
  270. RF_SPI_NSS_H();
  271. SX1280HalWaitOnBusy( );
  272. }
  273. void SX1280HalReadBuffer( uint8_t offset, uint8_t *buffer, uint8_t size )
  274. {
  275. uint16_t index;
  276. uint16_t halSize = size + 3;
  277. halTxBuffer[0] = RADIO_READ_BUFFER;
  278. halTxBuffer[1] = offset;
  279. halTxBuffer[2] = 0x00;
  280. for( index = 0; index < size; index++ )
  281. {
  282. halTxBuffer[3+index] = 0x00;
  283. }
  284. SX1280HalWaitOnBusy( );
  285. //GpioWrite( RADIO_NSS_PORT, RADIO_NSS_PIN, 0 );
  286. RF_SPI_NSS_L();
  287. SpiWriteReadData( halTxBuffer, halRxBuffer, halSize );
  288. memcpy( buffer, halRxBuffer + 3, size );
  289. //GpioWrite( RADIO_NSS_PORT, RADIO_NSS_PIN, 1 );
  290. RF_SPI_NSS_H();
  291. SX1280HalWaitOnBusy( );
  292. }
  293. uint8_t SX1280HalGetDioStatus( void )
  294. {
  295. return ( READ_RF_SX128x_IO1() << 1 ) | ( READ_RF_SX128x_BUSY() << 0 );
  296. }