找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 7293|回复: 9
收起左侧

SX1262在stm32上的完整程序+PCB封装 完全的设计资料

  [复制链接]
ID:588333 发表于 2019-7-23 09:40 | 显示全部楼层 |阅读模式
SX1262 在stm32单片机上的完整例子,SX1262TR4-GC资料包,包括:芯片数据手册,模块规格书,接线示意图,PCB封装,Demo程序(完整代码,keil5验证通过)
完整的资料,非常难得。

电路原理图如下:
0.png

0.png

PCB封装:
0.png

STM32单片机源程序如下:
  1. #include <string.h>
  2. #include "user.h"
  3. #include "sx126x-board.h"


  4. /**************************************************************************************************************************************
  5. Demo 程序流程  EnableMaster=true  为主机端,主机端发送一个"PING"数据后切换到接收,等待从机返回的应答"PONG"数据LED闪烁

  6.                EnableMaster=false 为从机端,从机端接收到主机端发过来的"PING"数据后LED闪烁并发送一个"PONG"数据作为应答
  7. ***************************************************************************************************************************************/


  8. #define USE_MODEM_LORA
  9. #define REGION_CN779

  10. #if defined( REGION_AS923 )

  11. #define RF_FREQUENCY                                923000000 // Hz

  12. #elif defined( REGION_AU915 )

  13. #define RF_FREQUENCY                                915000000 // Hz

  14. #elif defined( REGION_CN779 )

  15. #define RF_FREQUENCY                                434000000 // Hz

  16. #elif defined( REGION_EU868 )

  17. #define RF_FREQUENCY                                868000000 // Hz

  18. #elif defined( REGION_KR920 )

  19. #define RF_FREQUENCY                                920000000 // Hz

  20. #elif defined( REGION_IN865 )

  21. #define RF_FREQUENCY                                865000000 // Hz

  22. #elif defined( REGION_US915 )

  23. #define RF_FREQUENCY                                915000000 // Hz

  24. #elif defined( REGION_US915_HYBRID )

  25. #define RF_FREQUENCY                                915000000 // Hz

  26. #else

  27.     #error "Please define a frequency band in the compiler options."

  28. #endif

  29. #define TX_OUTPUT_POWER                             22        // 22 dBm

  30. extern bool IrqFired;




  31. bool EnableMaster=false;//主从选择

  32. uint16_t  crc_value;
  33. /*!
  34. * Radio events function pointer
  35. */
  36. static RadioEvents_t RadioEvents;

  37. #if defined( USE_MODEM_LORA )

  38. #define LORA_BANDWIDTH                              1         // [0: 125 kHz,
  39.                                                               //  1: 250 kHz,
  40.                                                               //  2: 500 kHz,
  41.                                                               //  3: Reserved]
  42. #define LORA_SPREADING_FACTOR                       11         // [SF7..SF12]
  43. #define LORA_CODINGRATE                             2         // [1: 4/5,
  44.                                                               //  2: 4/6,
  45.                                                               //  3: 4/7,
  46.                                                               //  4: 4/8]
  47. #define LORA_PREAMBLE_LENGTH                        8         // Same for Tx and Rx
  48. #define LORA_SYMBOL_TIMEOUT                         0         // Symbols
  49. #define LORA_FIX_LENGTH_PAYLOAD_ON                  false
  50. #define LORA_IQ_INVERSION_ON                        false

  51. #elif defined( USE_MODEM_FSK )

  52. #define FSK_FDEV                                    5e3      // Hz
  53. #define FSK_DATARATE                                2.4e3      // bps
  54. #define FSK_BANDWIDTH                               20e3     // Hz >> DSB in sx126x
  55. #define FSK_AFC_BANDWIDTH                           100e3     // Hz
  56. #define FSK_PREAMBLE_LENGTH                         5         // Same for Tx and Rx
  57. #define FSK_FIX_LENGTH_PAYLOAD_ON                   false

  58. #else
  59.     #error "Please define a modem in the compiler options."
  60. #endif

  61. typedef enum
  62. {
  63.     LOWPOWER,
  64.     RX,
  65.     RX_TIMEOUT,
  66.     RX_ERROR,
  67.     TX,
  68.     TX_TIMEOUT,
  69. }States_t;

  70. #define RX_TIMEOUT_VALUE                            1000
  71. #define BUFFER_SIZE                                 64 // Define the payload size here

  72. const uint8_t PingMsg[] = "PING";
  73. const uint8_t PongMsg[] = "PONG";

  74. uint16_t BufferSize = BUFFER_SIZE;
  75. uint8_t TX_Buffer[BUFFER_SIZE];
  76. uint8_t RX_Buffer[BUFFER_SIZE];


  77. States_t State = LOWPOWER;

  78. int8_t RssiValue = 0;
  79. int8_t SnrValue = 0;
  80. void OnTxDone( void );
  81. void OnRxDone( uint8_t *payload, uint16_t size, int16_t rssi, int8_t snr );
  82. void OnTxTimeout( void );
  83. void OnRxTimeout( void );
  84. void OnRxError( void );


  85. void SysClock_48()
  86. {
  87.    RCC_PLLCmd(DISABLE);
  88.    RCC_PLLConfig(RCC_PLLSource_HSI_Div2, RCC_PLLMul_12);//48M
  89.    RCC_PLLCmd(ENABLE);
  90.    while(!RCC_GetFlagStatus(RCC_FLAG_PLLRDY));
  91.    RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
  92. }

  93. void Tick_Configration()
  94. {
  95.     /* Setup SysTick Timer for 1ms interrupts ( not too often to save power ) */
  96.     if( SysTick_Config( SystemCoreClock / 1000 ) )
  97.     {
  98.         /* Capture error */
  99.         while (1);
  100.     }
  101. }

  102. void RCC_Configuration()
  103. {   
  104.   /* Enable GPIO clock */
  105.   RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA|RCC_AHBPeriph_GPIOB|RCC_AHBPeriph_GPIOC|RCC_AHBPeriph_GPIOF, ENABLE);
  106.   
  107.   /* Enable peripheral Clock */
  108.   RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2|RCC_APB1Periph_PWR, ENABLE);  
  109.   
  110.   RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_SYSCFG, ENABLE);
  111. }

  112. void HW_int(void)
  113. {
  114.     SysClock_48();
  115.     Tick_Configration();
  116.     RCC_Configuration();
  117.     GPIO_int();
  118.     SPI2_Int();
  119. }


  120. void LedToggle(void)
  121. {
  122.   GPIO_WriteBit( LED1_PORT, LED1_PIN,Bit_RESET);//LED闪烁
  123.   HAL_Delay_nMS(10);
  124.   GPIO_WriteBit( LED1_PORT, LED1_PIN,Bit_SET);
  125. }


  126. int main( void )
  127. {   
  128. //    uint8_t data[2]={0x12,0x34};
  129. //    static uint8_t test[2];
  130.    
  131.     HW_int();//MCU外围资源初始化
  132.    
  133.    
  134.     // Radio initialization
  135.     RadioEvents.TxDone = OnTxDone;
  136.     RadioEvents.RxDone = OnRxDone;
  137.     RadioEvents.TxTimeout = OnTxTimeout;
  138.     RadioEvents.RxTimeout = OnRxTimeout;
  139.     RadioEvents.RxError = OnRxError;
  140.    
  141.    
  142.     Radio.Init( &RadioEvents );
  143.     Radio.SetChannel( RF_FREQUENCY );
  144.    
  145. //    Radio.WriteBuffer(0x06C0,data,2);
  146. //    Radio.ReadBuffer(0x06C0,test,2);
  147.    
  148. #if defined( USE_MODEM_LORA )

  149.     Radio.SetTxConfig( MODEM_LORA, TX_OUTPUT_POWER, 0, LORA_BANDWIDTH,
  150.                                    LORA_SPREADING_FACTOR, LORA_CODINGRATE,
  151.                                    LORA_PREAMBLE_LENGTH, LORA_FIX_LENGTH_PAYLOAD_ON,
  152.                                    true, 0, 0, LORA_IQ_INVERSION_ON, 3000 );

  153.     Radio.SetRxConfig( MODEM_LORA, LORA_BANDWIDTH, LORA_SPREADING_FACTOR,
  154.                                    LORA_CODINGRATE, 0, LORA_PREAMBLE_LENGTH,
  155.                                    LORA_SYMBOL_TIMEOUT, LORA_FIX_LENGTH_PAYLOAD_ON,
  156.                                    0, true, 0, 0, LORA_IQ_INVERSION_ON, false );

  157. #elif defined( USE_MODEM_FSK )
  158.    
  159.     Radio.SetTxConfig( MODEM_FSK, TX_OUTPUT_POWER, FSK_FDEV, 0,
  160.                                   FSK_DATARATE, 0,
  161.                                   FSK_PREAMBLE_LENGTH, FSK_FIX_LENGTH_PAYLOAD_ON,
  162.                                   true, 0, 0, 0, 3000 );

  163.     Radio.SetRxConfig( MODEM_FSK, FSK_BANDWIDTH, FSK_DATARATE,
  164.                                   0, FSK_AFC_BANDWIDTH, FSK_PREAMBLE_LENGTH,
  165.                                   0, FSK_FIX_LENGTH_PAYLOAD_ON, 0, true,
  166.                                   0, 0,false, true );
  167. #else
  168.     #error "Please define a frequency band in the compiler options."
  169. #endif

  170.    
  171.     if(EnableMaster)
  172.     {
  173.           TX_Buffer[0] = 'P';
  174.           TX_Buffer[1] = 'I';
  175.           TX_Buffer[2] = 'N';
  176.           TX_Buffer[3] = 'G';
  177.          
  178.           crc_value=RadioComputeCRC(TX_Buffer,4,CRC_TYPE_IBM);//计算得出要发送数据包CRC值
  179.           TX_Buffer[4]=crc_value>>8;
  180.           TX_Buffer[5]=crc_value;
  181.           Radio.Send( TX_Buffer, 6);
  182.     }
  183.     else
  184.     {
  185.        Radio.Rx( RX_TIMEOUT_VALUE );
  186.     }
  187.    
  188.     while( 1 )
  189.     {
  190.         Radio.IrqProcess( ); // Process Radio IRQ
  191.     }
  192. }

  193. void OnTxDone( void )
  194. {   
  195.     Radio.Standby();
  196.     Radio.Rx( RX_TIMEOUT_VALUE ); //进入接收

  197. }

  198. void OnRxDone( uint8_t *payload, uint16_t size, int16_t rssi, int8_t snr )
  199. {
  200.     BufferSize = size;
  201.     memcpy( RX_Buffer, payload, BufferSize );
  202.     RssiValue = rssi;
  203.     SnrValue = snr;
  204.    
  205.     Radio.Standby();
  206.    
  207.     if(EnableMaster)
  208.     {
  209.       if(memcmp(RX_Buffer,PongMsg,4)==0)
  210.       {
  211.         LedToggle();//LED闪烁
  212.         
  213.       }
  214.      
  215.         TX_Buffer[0] = 'P';
  216.         TX_Buffer[1] = 'I';
  217.         TX_Buffer[2] = 'N';
  218.         TX_Buffer[3] = 'G';
  219.         
  220.         crc_value=RadioComputeCRC(TX_Buffer,4,CRC_TYPE_IBM);//计算得出要发送数据包CRC值
  221.         TX_Buffer[4]=crc_value>>8;
  222.         TX_Buffer[5]=crc_value;
  223.         Radio.Send( TX_Buffer, 6);
  224.     }
  225.     else
  226.     {
  227.       if(memcmp(RX_Buffer,PingMsg,4)==0)
  228.       {
  229.         LedToggle();//LED闪烁
  230.         
  231.         TX_Buffer[0] = 'P';
  232.         TX_Buffer[1] = 'O';
  233.         TX_Buffer[2] = 'N';
  234.         TX_Buffer[3] = 'G';
  235.         
  236.         crc_value=RadioComputeCRC(TX_Buffer,4,CRC_TYPE_IBM);//计算得出要发送数据包CRC值
  237.         TX_Buffer[4]=crc_value>>8;
  238.         TX_Buffer[5]=crc_value;
  239.         Radio.Send( TX_Buffer, 6);
  240.       }
  241.       else
  242.       {
  243.         Radio.Rx( RX_TIMEOUT_VALUE );
  244.       }   
  245.     }
  246. }

  247. void OnTxTimeout( void )
  248. {
  249.    
  250. }

  251. void OnRxTimeout( void )
  252. {
  253.     Radio.Standby();
  254.     if(EnableMaster)
  255.     {
  256.         TX_Buffer[0] = 'P';
  257.         TX_Buffer[1] = 'I';
  258.         TX_Buffer[2] = 'N';
  259.         TX_Buffer[3] = 'G';
  260.         
  261.         crc_value=RadioComputeCRC(TX_Buffer,4,CRC_TYPE_IBM);//计算得出要发送数据包CRC值
  262.         TX_Buffer[4]=crc_value>>8;
  263.         TX_Buffer[5]=crc_value;
  264.         Radio.Send( TX_Buffer, 6);
  265.     }
  266.     else
  267.     {
  268.       Radio.Rx( RX_TIMEOUT_VALUE );
  269.     }
  270. }

  271. void OnRxError( void )
  272. {

  273.   
  274. }
复制代码

所有资料51hei提供下载:
SX1262TR4-GC资料包.7z (5.78 MB, 下载次数: 287)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:588333 发表于 2019-7-23 09:41 | 显示全部楼层
附件怎么没了?
回复

使用道具 举报

ID:609438 发表于 2019-9-9 12:10 | 显示全部楼层
想问一下楼主有没有遇到发射功率达不到的情况
回复

使用道具 举报

ID:286308 发表于 2019-11-1 14:14 | 显示全部楼层
非常好,非常感谢!
回复

使用道具 举报

ID:85498 发表于 2019-12-16 20:16 | 显示全部楼层
非常好,非常感谢!
回复

使用道具 举报

ID:672719 发表于 2019-12-24 18:03 | 显示全部楼层
这款芯片不需要用外部晶振吗
回复

使用道具 举报

ID:681479 发表于 2020-1-5 12:22 | 显示全部楼层
非常好,非常感谢!
回复

使用道具 举报

ID:41107 发表于 2020-3-29 19:00 | 显示全部楼层
没有mondy,how to do
回复

使用道具 举报

ID:134779 发表于 2020-6-2 22:17 | 显示全部楼层
厉害了
回复

使用道具 举报

ID:389181 发表于 2020-8-12 21:04 | 显示全部楼层
感谢提供资源
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表