myRadio_gpio.c 8.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290
  1. #include "myRadio_gpio.h"
  2. #include "stm32f10x.h"
  3. #include "stm32f10x_exti.h"
  4. #include "stm32f10x_it.h"
  5. RADIO_GPIO_CALLBACK gpioCallback;
  6. static irqCallback_ts myIrqCallback_rfIrq;
  7. //---------------------------射频SPI驱动部分---------------------
  8. void BOARD_SPI_NSS_H(void)
  9. {
  10. GPIO_WriteBit(RF_SX126x_SPI_CSN, BOARD_PIN_H);
  11. }
  12. void BOARD_SPI_NSS_L(void)
  13. {
  14. GPIO_WriteBit(RF_SX126x_SPI_CSN, BOARD_PIN_L);
  15. }
  16. void BOARD_SPI_SCK_H(void)
  17. {
  18. GPIO_WriteBit(RF_SX126x_SPI_CLK, BOARD_PIN_H);
  19. }
  20. void BOARD_SPI_SCK_L(void)
  21. {
  22. GPIO_WriteBit(RF_SX126x_SPI_CLK, BOARD_PIN_L);
  23. }
  24. void BOARD_SPI_MISO_H(void)
  25. {
  26. GPIO_WriteBit(RF_SX126x_SPI_MISO, BOARD_PIN_H);
  27. }
  28. void BOARD_SPI_MISO_L(void)
  29. {
  30. GPIO_WriteBit(RF_SX126x_SPI_MISO, BOARD_PIN_L);
  31. }
  32. void BOARD_SPI_MOSI_H(void)
  33. {
  34. GPIO_WriteBit(RF_SX126x_SPI_MOSI, BOARD_PIN_H);
  35. }
  36. void BOARD_SPI_MOSI_L(void)
  37. {
  38. GPIO_WriteBit(RF_SX126x_SPI_MOSI, BOARD_PIN_L);
  39. }
  40. uint8_t READ_BOARD_SPI_MISO(void)
  41. {
  42. return GPIO_ReadInputDataBit(RF_SX126x_SPI_MISO);
  43. }
  44. //---------------------------射频驱动IO部分---------------------
  45. void RF_SX126x_IO1_H(void)
  46. {
  47. GPIO_WriteBit(RF_SX126x_IO1, BOARD_PIN_H);
  48. }
  49. void RF_SX126x_IO1_L(void)
  50. {
  51. GPIO_WriteBit(RF_SX126x_IO1, BOARD_PIN_L);
  52. }
  53. void RF_SX126x_IO3_H(void)
  54. {
  55. GPIO_WriteBit(RF_SX126x_IO3, BOARD_PIN_H);
  56. }
  57. void RF_SX126x_IO3_L(void)
  58. {
  59. GPIO_WriteBit(RF_SX126x_IO3, BOARD_PIN_L);
  60. }
  61. void RF_SX126x_RST_H(void)
  62. {
  63. GPIO_WriteBit(RF_SX126x_RST, BOARD_PIN_H);
  64. }
  65. void RF_SX126x_RST_L(void)
  66. {
  67. GPIO_WriteBit(RF_SX126x_RST, BOARD_PIN_L);
  68. }
  69. void RF_SX126x_EXT_PA_RE_H(void)
  70. {
  71. GPIO_WriteBit(RF_SX126x_EXTPA_RE, BOARD_PIN_H);
  72. }
  73. void RF_SX126x_EXT_PA_RE_L(void)
  74. {
  75. GPIO_WriteBit(RF_SX126x_EXTPA_RE, BOARD_PIN_L);
  76. }
  77. void RF_SX126x_EXT_PA_TE_H(void)
  78. {
  79. GPIO_WriteBit(RF_SX126x_EXTPA_TE, BOARD_PIN_H);
  80. }
  81. void RF_SX126x_EXT_PA_TE_L(void)
  82. {
  83. GPIO_WriteBit(RF_SX126x_EXTPA_TE, BOARD_PIN_L);
  84. }
  85. uint8_t READ_RF_SX126x_IO1(void)
  86. {
  87. return GPIO_ReadInputDataBit(RF_SX126x_IO1);
  88. }
  89. uint8_t READ_RF_SX12xx_DIO3(void)
  90. {
  91. return GPIO_ReadInputDataBit(RF_SX126x_IO3);
  92. }
  93. uint8_t READ_RF_SX126x_BUSY(void)
  94. {
  95. return GPIO_ReadInputDataBit(RF_SX126x_BUSY);
  96. }
  97. void rfIrq_callback(uint8_t status, uint32_t param)
  98. {
  99. if (gpioCallback)
  100. {
  101. gpioCallback(1);
  102. }
  103. }
  104. // BOARD_GPIOB
  105. void myRadio_gpio_irq_init()
  106. {
  107. NVIC_InitTypeDef NVIC_InitStructure;
  108. EXTI_InitTypeDef EXTI_InitStructure;
  109. GPIO_InitTypeDef GPIO_InitStructure;
  110. GPIO_InitStructure.GPIO_Pin = RF_SX126x_IO1_PIN;
  111. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  112. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
  113. GPIO_Init(RF_SX126x_IO1_PORT, &GPIO_InitStructure);
  114. EXTI_ClearITPendingBit(EXTI_Line1);
  115. EXTI_InitStructure.EXTI_Line = EXTI_Line0;
  116. EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
  117. EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;
  118. EXTI_InitStructure.EXTI_LineCmd = ENABLE;
  119. EXTI_Init(&EXTI_InitStructure);
  120. GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource0);
  121. /* Enable and set EXTI1 Interrupt */
  122. NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn;
  123. NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x01;
  124. NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x00;
  125. NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  126. NVIC_Init(&NVIC_InitStructure);
  127. myIrqCallback_rfIrq.thisCb = rfIrq_callback;
  128. EXTILINE0_callbackRegiste(&myIrqCallback_rfIrq);
  129. }
  130. void myRadio_gpio_init(RADIO_GPIO_CALLBACK cb)
  131. {
  132. GPIO_InitTypeDef GPIO_InitStructure;
  133. SPI_InitTypeDef SPI_InitStructure;
  134. #if defined(SPI_HARD)
  135. //----------SPI1时钟使能
  136. RCC_APB2PeriphClockCmd( RCC_APB2Periph_SPI1, ENABLE );
  137. GPIO_InitStructure.GPIO_Pin = RF_SX126x_SPI_CLK_PIN | RF_SX126x_SPI_MISO_PIN | RF_SX126x_SPI_MOSI_PIN;
  138. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出
  139. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  140. GPIO_Init(RF_SX126x_SPI_CLK_PORT, &GPIO_InitStructure);
  141. // GPIO_SetBits(BOARD_GPIO_SPI_CLK | RF_SX126x_SPI_MISO_PIN | RF_SX126x_SPI_MOSI_PIN);
  142. /*!< SPI configuration */
  143. SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
  144. SPI_InitStructure.SPI_Mode = SPI_Mode_Master;
  145. SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;
  146. SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;
  147. SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge;
  148. SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;
  149. SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_16;
  150. SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;
  151. SPI_InitStructure.SPI_CRCPolynomial = 7;
  152. SPI_Init(SPI1, &SPI_InitStructure);
  153. /*!< Enable the SPI1 */
  154. SPI_Cmd(SPI1, ENABLE);
  155. #else
  156. GPIO_InitStructure.GPIO_Pin = RF_SX126x_SPI_MOSI_PIN;
  157. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  158. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  159. GPIO_Init(BOARD_PORT_SPI_MOSI, &GPIO_InitStructure);
  160. GPIO_InitStructure.GPIO_Pin = RF_SX126x_SPI_MISO_PIN;
  161. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  162. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  163. GPIO_Init(BOARD_PORT_SPI_MISO, &GPIO_InitStructure);
  164. GPIO_InitStructure.GPIO_Pin = RF_SX126x_SPI_CLK_PIN;
  165. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  166. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  167. GPIO_Init(BOARD_PORT_SPI_CLK, &GPIO_InitStructure);
  168. #endif
  169. GPIO_InitStructure.GPIO_Pin = RF_SX126x_SPI_CSN_PIN;
  170. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  171. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  172. GPIO_Init(RF_SX126x_SPI_CSN_PORT, &GPIO_InitStructure);
  173. GPIO_InitStructure.GPIO_Pin = RF_SX126x_RST_PIN;
  174. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  175. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  176. GPIO_Init(RF_SX126x_RST_PORT, &GPIO_InitStructure);
  177. GPIO_InitStructure.GPIO_Pin = RF_SX126x_IO1_PIN;
  178. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
  179. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  180. GPIO_Init(RF_SX126x_IO1_PORT, &GPIO_InitStructure);
  181. GPIO_InitStructure.GPIO_Pin = RF_SX126x_IO3_PIN;
  182. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  183. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  184. GPIO_Init(RF_SX126x_IO3_PORT, &GPIO_InitStructure);
  185. GPIO_InitStructure.GPIO_Pin = RF_SX126x_BUSY_PIN;
  186. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
  187. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  188. GPIO_Init(RF_SX126x_BUSY_PORT, &GPIO_InitStructure);
  189. GPIO_InitStructure.GPIO_Pin = RF_SX126x_EXTPA_RE_PIN;
  190. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  191. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  192. GPIO_Init(RF_SX126x_EXTPA_RE_PORT, &GPIO_InitStructure);
  193. GPIO_InitStructure.GPIO_Pin = RF_SX126x_EXTPA_TE_PIN;
  194. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  195. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  196. GPIO_Init(RF_SX126x_EXTPA_TE_PORT, &GPIO_InitStructure);
  197. BOARD_SPI_NSS_H();
  198. GPIO_WriteBit(RF_SX126x_IO3, BOARD_PIN_H);
  199. myRadio_gpio_irq_init();
  200. gpioCallback = cb;
  201. }
  202. uint8_t myRadioSpi_rwByte(uint8_t byteToWrite)
  203. {
  204. uint16_t i = 0;
  205. uint8_t temp = 0;
  206. #if defined(SPI_HARD)
  207. while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET) //检查指定的SPI标志位设置与否:发送缓存空标志位
  208. {
  209. i++;
  210. if(i > 2000)return 0;
  211. }
  212. SPI_I2S_SendData(SPI1, byteToWrite); //通过外设SPIx发送一个数据
  213. i=0;
  214. while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) == RESET)//检查指定的SPI标志位设置与否:接受缓存非空标志位
  215. {
  216. i++;
  217. if(i > 2000)return 0;
  218. }
  219. /*!< Return the byte read from the SPI bus */
  220. temp = SPI_I2S_ReceiveData(SPI1);
  221. #else
  222. BOARD_SPI_SCK_L();
  223. for(i = 0; i < 8; i ++)
  224. {
  225. if(byteToWrite & 0x80)
  226. {
  227. //SpiSetMosiHigh();
  228. BOARD_SPI_MOSI_H();
  229. }
  230. else
  231. {
  232. //SpiSetMosiLow();
  233. BOARD_SPI_MOSI_L();
  234. }
  235. byteToWrite <<= 1;
  236. //SpiSetSckHigh();
  237. BOARD_SPI_SCK_H();
  238. temp <<= 1;
  239. if(READ_BOARD_SPI_MISO())
  240. {
  241. temp ++;
  242. }
  243. //SpiSetSckLow();
  244. BOARD_SPI_SCK_L();
  245. }
  246. #endif
  247. return temp;
  248. }
  249. void myRadioSpi_wBuffer(uint8_t* pData, uint8_t len)
  250. {
  251. uint8_t i;
  252. for(i = 0; i < len; i++)
  253. {
  254. myRadioSpi_rwByte(*pData);
  255. pData ++;
  256. }
  257. }
  258. void myRadioSpi_rBuffer(uint8_t* pData, uint8_t len)
  259. {
  260. uint8_t i;
  261. for(i = 0; i < len; i++)
  262. {
  263. *pData = myRadioSpi_rwByte(0xFF);
  264. pData ++;
  265. }
  266. }