找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4371|回复: 6
打印 上一主题 下一主题
收起左侧

sx1278LORA+stm32单片机无线模块可用源程序分享

  [复制链接]
跳转到指定楼层
楼主
ID:385001 发表于 2019-7-19 20:59 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
弄了这个半天了    不想别人也这么累
出现了很多问题  本来以为GND 接一个就可以  谁知道所有都要接地
SX1278端口配置:


复位:PA1

射频开关芯片收发切换:       CTRL  /CTRL
CTRL:  PA2                   1     0      RF_RX
/CTRL: PA3                   0     1      RF_TX

DIO0: PA0    可做收发中断用
DIO1: PB1
DIO2: PB2
DIO3: PA8
DIO4: PA11
DIO5: PA12

LED指示灯: PB0

单片机源程序如下:
  1. /****************************************************************************
  2. * 本例程在 STM32开发板上调试通过           
  3. *
  4. * 文件名: main.c
  5. * 内容简述:        *      
  6. *        演示的是安信可LoRa无线通信的功能。
  7. *   
  8. *        定义:       
  9. *        LED1-LED3 ---V1--V3  注意郭版的开发板上LED灯为高电平点亮!
  10. *                V1----- PB5-LED1
  11. *                V2----- PD6-LED2
  12. *                V3----- PD3-LED3                       
  13. *                Key1----PC5
  14. *                Key2----PC2
  15. *                Key3----PC3
  16. *                Key4----PE6
  17. * 硬件连接:
  18. *
  19. * LoRa模块引脚连接
  20. *  1--VDD--3.3V
  21. *  3--GND--GND
  22. *  5--PE1--RESET
  23. *  7--PD4--DIO0
  24. *  9--PD5--DIO1
  25. * 11--PD7--DIO2
  26. * 13--PD11--DIO3
  27. *
  28. * 2--PA5--SCK
  29. * 4--PB7--NSS
  30. * 6--PA7--MOSI
  31. * 8--PA6--MISO
  32. * -----
  33. *20--PD8--DIO5
  34. * 22--PE15--DIO4
  35. * 24--GND--GND
  36. *  ------------------------
  37. * | PA9  - USART1(Tx)      |
  38. * | PA10 - USART1(Rx)      |
  39. *  ------------------------   
  40. *        基于MDK版本:        3.8
  41. *        基于官方外设库版本: 3.5
  42. *
  43. * 文件历史:
  44. * 版本号  日期       作者    说明
  45. * v0.1   2017-2-11         Duke 创建该文件
  46. *
  47. *******************************************************************************/

  48. #include "sys_config.h"

  49. #define BUFFER_SIZE     30                          // Define the payload size here

  50. static uint16_t BufferSize = BUFFER_SIZE;                        // RF buffer size
  51. static uint8_t  Buffer[BUFFER_SIZE];                                // RF buffer

  52. static uint8_t EnableMaster = false;                                 // Master/Slave selection

  53. tRadioDriver *Radio = NULL;

  54. const uint8_t PingMsg[] = "PING";
  55. const uint8_t PongMsg[] = "PONG";
  56. const uint8_t MY_TEST_Msg[] = "LoRa_SX1278_TEST";


  57. void OnMaster( void );
  58. void OnSlave( void );
  59. /*
  60. * Manages the master operation
  61. */
  62. void OnMaster( void )
  63. {
  64.     uint8_t i;
  65.    
  66.     switch( Radio->Process( ) )
  67.     {
  68.     case RF_RX_TIMEOUT:
  69.         // Send the next PING frame
  70.         Buffer[0] = 'P';
  71.         Buffer[1] = 'I';
  72.         Buffer[2] = 'N';
  73.         Buffer[3] = 'G';
  74.         for( i = 4; i < BufferSize; i++ )
  75.         {
  76.             Buffer[i] = i - 4;
  77.         }
  78.         Radio->SetTxPacket( Buffer, BufferSize );   //RFLR_STATE_TX_INIT
  79.         break;
  80.     case RF_RX_DONE:
  81.         Radio->GetRxPacket( Buffer, ( uint16_t* )&BufferSize );

  82.                 for(i=0;i<17;i++)
  83.                 {
  84.                         USART_putchar(USART1,Buffer[i]);
  85.                 }
  86.                 printf("\n");
  87.    
  88.                 if( BufferSize > 0 )
  89.         {
  90.             if( strncmp( ( const char* )Buffer, ( const char* )PongMsg, 4 ) == 0 )
  91.             {
  92.                 // Indicates on a LED that the received frame is a PONG
  93. //                LedToggle( LED_GREEN );
  94.                                 LED0_TOGGLE;

  95.                 // Send the next PING frame            
  96.                 Buffer[0] = 'P';
  97.                 Buffer[1] = 'I';
  98.                 Buffer[2] = 'N';
  99.                 Buffer[3] = 'G';
  100.                 // We fill the buffer with numbers for the payload
  101.                 for( i = 4; i < BufferSize; i++ )
  102.                 {
  103.                     Buffer[i] = i - 4;
  104.                 }
  105.                 Radio->SetTxPacket( Buffer, BufferSize );    //RFLR_STATE_TX_INIT
  106.             }
  107.             else if( strncmp( ( const char* )Buffer, ( const char* )PingMsg, 4 ) == 0 )
  108.             { // A master already exists then become a slave
  109.                 EnableMaster = false;
  110. //                LedOff( LED_RED );
  111.                                 LED0_OFF;
  112.             }
  113.         }            
  114.         break;
  115.     case RF_TX_DONE:
  116.         // Indicates on a LED that we have sent a PING
  117. //        LedToggle( LED_RED );
  118.                 LED0_TOGGLE;
  119.         Radio->StartRx( );   //RFLR_STATE_RX_INIT
  120.         break;
  121.     default:
  122.         break;
  123.     }
  124. }

  125. /*
  126. * Manages the slave operation
  127. */
  128. void OnSlave( void )
  129. {
  130.     uint8_t i;

  131.     switch( Radio->Process( ) )
  132.     {
  133.     case RF_RX_DONE:
  134.         Radio->GetRxPacket( Buffer, ( uint16_t* )&BufferSize );
  135.    
  136.         if( BufferSize > 0 )
  137.         {
  138.             if( strncmp( ( const char* )Buffer, ( const char* )PingMsg, 4 ) == 0 )
  139.             {
  140.                 // Indicates on a LED that the received frame is a PING
  141. //                LedToggle( LED_GREEN );
  142.                                 LED0_TOGGLE;

  143.                // Send the reply to the PONG string
  144.                 Buffer[0] = 'P';
  145.                 Buffer[1] = 'O';
  146.                 Buffer[2] = 'N';
  147.                 Buffer[3] = 'G';
  148.                 // We fill the buffer with numbers for the payload
  149.                 for( i = 4; i < BufferSize; i++ )
  150.                 {
  151.                     Buffer[i] = i - 4;
  152.                 }

  153.                 Radio->SetTxPacket( Buffer, BufferSize );      //RFLR_STATE_TX_INIT
  154.             }
  155.         }
  156.         break;
  157.     case RF_TX_DONE:
  158.         // Indicates on a LED that we have sent a PONG
  159. //        LedToggle( LED_RED );
  160.                 LED0_TOGGLE;
  161.         Radio->StartRx( );   //RFLR_STATE_RX_INIT
  162.         break;
  163.     default:
  164.         break;
  165.     }
  166. }




  167. #define SX1278_RX
  168. //#define SX1278_TX

  169. /**
  170.   * @brief  主函数
  171.   * @param  无
  172.   * @retval 无
  173.   */
  174. int main(void)
  175. {
  176.         uint8_t i;
  177.         //stm32 config
  178.         sys_Configuration();
  179.        
  180.         BoardInit( );
  181.    
  182.     Radio = RadioDriverInit( );
  183.    
  184.     Radio->Init( );
  185.                
  186. #if defined (SX1278_RX)
  187.     Radio->StartRx( );   //RFLR_STATE_RX_INIT
  188.         //printf("StartRx\n");
  189. #elif defined (SX1278_TX)
  190.         Radio->SetTxPacket( MY_TEST_Msg, 18 );
  191. #endif
  192.        
  193.         while(1)
  194.         {
  195. #if defined (SX1278_RX)
  196.                 while( Radio->Process( ) == RF_RX_DONE)
  197.                 {
  198.                         Radio->GetRxPacket( Buffer, ( uint16_t* )&BufferSize );
  199. //                        if( strncmp( ( const char* )Buffer, ( const char* )MY_TEST_Msg, 18 ) == 0 )
  200. //                        {
  201.                                 for(i=0;i < BufferSize;i++)
  202.                                 {
  203.                                         USART_putchar(USART1,Buffer[i]);
  204.                                 }
  205.                                 printf("\n");
  206.                                 LED0_TOGGLE;
  207.                                 for(i=0;i<BUFFER_SIZE;i++)
  208.                                 {
  209.                                                 Buffer[i] = 0;
  210.                                 }
  211.                                 Radio->StartRx( );
  212.                                
  213.                 }
  214. #elif defined (SX1278_TX)
  215. //                printf("运行在RF_LoRa_TX_OK? \n");
  216.                 while(Radio->Process( ) == RF_TX_DONE)
  217.                 {
  218.                         printf("RF_LoRa_TX_OK! \n");
  219.                         LED0_TOGGLE;
  220.                         Soft_delay_ms(500);
  221.                 Radio->SetTxPacket( MY_TEST_Msg, strlen(MY_TEST_Msg) );   //RFLR_STATE_TX_INIT
  222.                 }               
  223. #endif
  224.                
  225.         }
  226. }



  227. /*********************************************END OF FILE**********************/
复制代码

所有资料51hei提供下载:
STM32_SX1278_RX_Test.7z (268.74 KB, 下载次数: 104)

评分

参与人数 2黑币 +55 收起 理由
言西 + 5 绝世好帖!
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏5 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:230975 发表于 2019-11-2 11:00 | 只看该作者
楼主有没有LORA与51的通信范例程序
回复

使用道具 举报

板凳
ID:634328 发表于 2019-11-2 13:43 | 只看该作者
学习学习,谢谢分享
回复

使用道具 举报

地板
ID:412030 发表于 2019-11-25 23:36 | 只看该作者
hmgqljz111 发表于 2019-11-2 11:00
楼主有没有LORA与51的通信范例程序

51单片机直接写一个模拟SPI把楼主提供的demo中的SPI管脚替换一下就可以了
回复

使用道具 举报

5#
ID:502931 发表于 2020-2-2 18:43 | 只看该作者
多谢分享,学习了
回复

使用道具 举报

6#
ID:399111 发表于 2024-4-22 15:53 | 只看该作者
楼主,看来遇到坑不少啊,,,,
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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