sx126x-board.c 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191
  1. /*
  2. ______ _
  3. / _____) _ | |
  4. ( (____ _____ ____ _| |_ _____ ____| |__
  5. \____ \| ___ | (_ _) ___ |/ ___) _ \
  6. _____) ) ____| | | || |_| ____( (___| | | |
  7. (______/|_____)_|_|_| \__)_____)\____)_| |_|
  8. (C)2013 Semtech
  9. Description: SX126x driver specific target board functions implementation
  10. License: Revised BSD License, see LICENSE.TXT file include in the project
  11. Maintainer: Miguel Luis and Gregory Cristian
  12. */
  13. #include "luat_base.h"
  14. #include "luat_gpio.h"
  15. #include "luat_spi.h"
  16. #include "luat_timer.h"
  17. #include "radio.h"
  18. #include "sx126x.h"
  19. #include "sx126x-board.h"
  20. uint8_t SX126xSpi;
  21. uint8_t SX126xCsPin;
  22. uint8_t SX126xResetPin;
  23. uint8_t SX126xBusyPin;
  24. uint8_t SX126xDio1Pin;
  25. uint8_t SX126xGetIrqFired( void ){
  26. return luat_gpio_get(SX126xDio1Pin);
  27. }
  28. void SX126xDelayMs(uint32_t ms){
  29. luat_timer_mdelay(ms);
  30. }
  31. void SX126xReset( void ){
  32. SX126xDelayMs( 10 );
  33. luat_gpio_set( SX126xResetPin, 0 );
  34. SX126xDelayMs( 20 );
  35. luat_gpio_set( SX126xResetPin, 1 );
  36. SX126xDelayMs( 10 );
  37. }
  38. void SX126xWaitOnBusy( void ){
  39. while(luat_gpio_get(SX126xBusyPin)==1){
  40. SX126xDelayMs(1);
  41. }
  42. }
  43. uint8_t SX126xSpiIn(void){
  44. char data;
  45. luat_spi_recv(SX126xSpi, &data, 1);
  46. return (uint8_t)data;
  47. }
  48. void SX126xSpiOut(const char data){
  49. luat_spi_send(SX126xSpi, &data, 1);
  50. }
  51. void SX126xSetNss(uint8_t lev ){
  52. luat_gpio_set( SX126xCsPin, lev);
  53. }
  54. void SX126xWakeup( void ){
  55. SX126xSetNss(0);
  56. SX126xSpiOut(RADIO_GET_STATUS);
  57. SX126xSpiOut(0x00);
  58. SX126xSetNss(1);
  59. // Wait for chip to be ready.
  60. SX126xWaitOnBusy( );
  61. }
  62. void SX126xWriteCommand( RadioCommands_t command, uint8_t *buffer, uint16_t size ){
  63. uint16_t i = 0;
  64. SX126xCheckDeviceReady( );
  65. SX126xSetNss(0);
  66. SX126xSpiOut((uint8_t)command);
  67. for( i = 0; i < size; i++ ){
  68. SX126xSpiOut(buffer[i]);
  69. }
  70. SX126xSetNss(1);
  71. if( command != RADIO_SET_SLEEP ){
  72. SX126xWaitOnBusy( );
  73. }
  74. }
  75. void SX126xReadCommand( RadioCommands_t command, uint8_t *buffer, uint16_t size ){
  76. uint16_t i = 0;
  77. SX126xCheckDeviceReady( );
  78. SX126xSetNss(0);
  79. SX126xSpiOut((uint8_t)command);
  80. SX126xSpiOut(0x00);
  81. for( i = 0; i < size; i++ ){
  82. buffer[i] = SX126xSpiIn();
  83. }
  84. SX126xSetNss(1);
  85. SX126xWaitOnBusy( );
  86. }
  87. void SX126xWriteRegisters( uint16_t address, uint8_t *buffer, uint16_t size ){
  88. uint16_t i = 0;
  89. SX126xCheckDeviceReady( );
  90. SX126xSetNss(0);
  91. SX126xSpiOut(RADIO_WRITE_REGISTER);
  92. SX126xSpiOut(( address & 0xFF00 ) >> 8);
  93. SX126xSpiOut(address & 0x00FF);
  94. for( i = 0; i < size; i++ ){
  95. SX126xSpiOut(buffer[i]);
  96. }
  97. SX126xSetNss(1);
  98. SX126xWaitOnBusy( );
  99. }
  100. void SX126xWriteRegister( uint16_t address, uint8_t value ){
  101. SX126xWriteRegisters( address, &value, 1 );
  102. }
  103. void SX126xReadRegisters( uint16_t address, uint8_t *buffer, uint16_t size ){
  104. uint16_t i = 0;
  105. SX126xCheckDeviceReady( );
  106. SX126xSetNss(0);
  107. SX126xSpiOut((uint8_t)RADIO_READ_REGISTER);
  108. SX126xSpiOut(( address & 0xFF00 ) >> 8);
  109. SX126xSpiOut(address & 0x00FF);
  110. SX126xSpiOut(0x00);
  111. for( i = 0; i < size; i++ ){
  112. buffer[i] = SX126xSpiIn();
  113. }
  114. SX126xSetNss(1);
  115. SX126xWaitOnBusy( );
  116. }
  117. uint8_t SX126xReadRegister( uint16_t address ){
  118. uint8_t data;
  119. SX126xReadRegisters( address, &data, 1 );
  120. return data;
  121. }
  122. void SX126xWriteBuffer( uint8_t offset, uint8_t *buffer, uint8_t size ){
  123. uint16_t i = 0;
  124. SX126xCheckDeviceReady( );
  125. SX126xSetNss(0);
  126. SX126xSpiOut(RADIO_WRITE_BUFFER);
  127. SX126xSpiOut(offset);
  128. for( i = 0; i < size; i++ ){
  129. SX126xSpiOut(buffer[i]);
  130. }
  131. SX126xSetNss(1);
  132. SX126xWaitOnBusy( );
  133. }
  134. void SX126xReadBuffer( uint8_t offset, uint8_t *buffer, uint8_t size ){
  135. uint16_t i = 0;
  136. SX126xCheckDeviceReady( );
  137. SX126xSetNss(0);
  138. SX126xSpiOut((uint8_t)RADIO_READ_BUFFER);
  139. SX126xSpiOut(offset);
  140. SX126xSpiOut(0x00);
  141. for( i = 0; i < size; i++ ){
  142. buffer[i] = SX126xSpiIn();
  143. }
  144. SX126xSetNss(1);
  145. SX126xWaitOnBusy( );
  146. }
  147. void SX126xSetRfTxPower( int8_t power ){
  148. SX126xSetTxParams( power, RADIO_RAMP_40_US );
  149. }
  150. uint8_t SX126xGetPaSelect( uint32_t channel ){
  151. return SX1262;
  152. }
  153. void SX126xAntSwOn( void ){
  154. }
  155. void SX126xAntSwOff( void ){
  156. }
  157. bool SX126xCheckRfFrequency( uint32_t frequency ){
  158. // Implement check. Currently all frequencies are supported
  159. return true;
  160. }