Lorawan.c 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179
  1. #include "lorawan.h"
  2. #include "USARTSetup.h"
  3. #include <stdarg.h>
  4. #include <string.h>
  5. #include <stdio.h>
  6. #include "stm32f10x_dma.h"
  7. uint8_t Recive_lorawanID_flag=0; //接收LORAWAN ID号
  8. uint16_t send_cont=0; //数据发送次数
  9. uint8_t init_sent=0; //初始化顺序完成次数
  10. uint8_t lorawan_init_flag=0;//lorawan初始化完成标志
  11. uint8_t lorawan_send_data_flag=0;////数据发送标志
  12. extern uint8_t lorawan_overtime_flag;
  13. extern uint16_t lorawan_overtime;
  14. extern uint8_t lorawan_send_finish_flag; //数据发送完成标志
  15. extern uint8_t lorawan_time_5sflag; //5秒时间标志
  16. extern uint16_t lorawan_time_5s; //5s时间,发送数据后,收不到发送完成标志,延时3s进入睡眠模式
  17. extern uint8_t lorawan_to_sleep; //lorawan模块进入睡眠标志
  18. /*int fputc(int ch, FILE *f)
  19. {
  20. USART_SendData(USART1, (unsigned char) ch);// USART1 可以换成 USART2 等
  21. while (!(USART1->SR & USART_FLAG_TXE));
  22. return (ch);
  23. }*/
  24. /**************************
  25. 函数名:void delay(unsigned int a)
  26. 函数功能: 1ms延时函数
  27. 输入变量: a 代表几ms
  28. 输出变量: 无
  29. ***************************/
  30. void LoraNode_Delay(uint32_t a) //ms延时函数
  31. {
  32. unsigned int i,j;
  33. for(j=0;j<a;j++)
  34. {
  35. for(i=0;i<1500;i++);
  36. }
  37. }
  38. void LoraNode_GPIO_Init(void)
  39. {
  40. GPIO_InitTypeDef GPIO_InitStruct;
  41. /* enable clock */
  42. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
  43. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
  44. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
  45. /* gpio config */
  46. GPIO_InitStruct.GPIO_Pin = LORANODE_WAKE_PIN|LORANODE_MODE_PIN;
  47. GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
  48. //GPIO_InitStruct.Pull = GPIO_NOPULL;
  49. GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
  50. GPIO_Init(GPIOC, &GPIO_InitStruct);
  51. GPIO_InitStruct.GPIO_Pin = LORANODE_NRST_PIN;
  52. GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
  53. //GPIO_InitStruct.Pull = GPIO_NOPULL;
  54. GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
  55. GPIO_Init(GPIOA, &GPIO_InitStruct);
  56. GPIO_InitStruct.GPIO_Pin = LORANODE_STAT_PIN;
  57. //GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  58. GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IPD; //下拉输入
  59. //GPIO_InitStruct.Pull = GPIO_NOPULL;
  60. GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
  61. GPIO_Init(GPIOC, &GPIO_InitStruct);
  62. GPIO_InitStruct.GPIO_Pin = LORANODE_BUSY_PIN;
  63. GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  64. //GPIO_InitStruct.Pull = GPIO_NOPULL;
  65. GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
  66. GPIO_Init(GPIOB, &GPIO_InitStruct);
  67. }
  68. void LoraNode_Init_Mode(LoraNode_Mode_T mode)
  69. {
  70. //LoraNode_Wake_Sleep(MODE_WAKEUP);
  71. LoraNode_Reset();
  72. }
  73. //----------------------------------------------------------------------
  74. // @funtion: set the lorawan module mode, wakeup or sleep mode
  75. // @paramters: MODE_WAKEUP, or MODE_SLEEP
  76. // @return: void
  77. //-------------------------------------------------------------------
  78. void LoraNode_Wake_Sleep(LoraNode_SleepMode_T mode)
  79. {
  80. if (mode == MODE_WAKEUP)
  81. {
  82. // wake signal, high for module wakeup, low for module sleep
  83. if (GPIO_ReadOutputDataBit(LORANODE_WAKE_GPIO_PORT,LORANODE_WAKE_PIN) != Bit_SET)
  84. {
  85. // wake module first, and wait 10 ms
  86. LORANODE_WAKE_HIGH();
  87. LoraNode_Delay(20);
  88. }
  89. }
  90. if (mode == MODE_SLEEP)
  91. {
  92. if (GPIO_ReadOutputDataBit(LORANODE_WAKE_GPIO_PORT,LORANODE_WAKE_PIN) != Bit_RESET)
  93. {
  94. LORANODE_WAKE_LOW();
  95. }
  96. }
  97. }
  98. static void LoraNode_Reset(void)
  99. {
  100. LORANODE_NRST_LOW();
  101. LoraNode_Delay(300); //15ms
  102. LORANODE_NRST_HIGH();
  103. }
  104. void transparent_send_data(uint8_t *DataBuf, uint32_t xmitLen)
  105. {
  106. //----唤醒模块 ----
  107. LoraNode_Wake_Sleep(MODE_WAKEUP);
  108. LoraNode_Delay(100);
  109. USART2Send(DataBuf, xmitLen);
  110. send_cont++;
  111. lorawan_send_data_flag=1; //数据发送标志
  112. lorawan_time_5s=0; //发送数据后,开始计时
  113. lorawan_time_5sflag=0; //5s定时晚上
  114. lorawan_overtime_flag=0; //清除超时标志
  115. lorawan_overtime=2000; //重新赋值超时寄存器,2s超时
  116. }
  117. //-----------------
  118. //数据发送后,判断lorawan模块是否发送完成,完成就进入睡眠模式,
  119. //收不到完成标志,为降低功耗,最多延时5s进入睡眠模式
  120. //------------------
  121. void lorawan_Sleep(void)
  122. {
  123. if(lorawan_send_data_flag != 1)
  124. return;
  125. //if((lorawan_send_finish_flag == 1) || (lorawan_time_5sflag == 1))
  126. if((lorawan_to_sleep == 1) && (lorawan_time_5sflag == 1))
  127. {
  128. lorawan_to_sleep=0;
  129. lorawan_send_finish_flag=0;
  130. LoraNode_Wake_Sleep(MODE_SLEEP);
  131. lorawan_send_data_flag=0; //进入睡眠后,清除发送标志
  132. lorawan_time_5sflag=0; //进入睡眠后,清除5s标志
  133. lorawan_time_5s=0; //进入睡眠后,清除5s倒计时寄存器
  134. }
  135. }
  136. /* Over-the-Air Activation */
  137. void LoraNode_OTAA_Config(void)
  138. {
  139. LoraNode_Init_Mode(MODE_CMD);
  140. }