myRadio_gpio.c 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355
  1. #include "myRadio_gpio.h"
  2. #include "stm32f10x.h"
  3. #include "stm32f10x_exti.h"
  4. RADIO_GPIO_CALLBACK gpioCallback;
  5. static irqCallback_ts myIrqCallback_extiLine1;
  6. //---------------------------射频SPI驱动部分---------------------
  7. void BOARD_SPI_NSS_H(void)
  8. {
  9. GPIO_WriteBit(BOARD_GPIO_SPI_CSN, BOARD_PIN_H);
  10. }
  11. void BOARD_SPI_NSS_L(void)
  12. {
  13. GPIO_WriteBit(BOARD_GPIO_SPI_CSN, BOARD_PIN_L);
  14. }
  15. void BOARD_SPI_SCK_H(void)
  16. {
  17. GPIO_WriteBit(BOARD_GPIO_SPI_CLK, BOARD_PIN_H);
  18. }
  19. void BOARD_SPI_SCK_L(void)
  20. {
  21. GPIO_WriteBit(BOARD_GPIO_SPI_CLK, BOARD_PIN_L);
  22. }
  23. void BOARD_SPI_MISO_H(void)
  24. {
  25. GPIO_WriteBit(BOARD_GPIO_SPI_MISO, BOARD_PIN_H);
  26. }
  27. void BOARD_SPI_MISO_L(void)
  28. {
  29. GPIO_WriteBit(BOARD_GPIO_SPI_MISO, BOARD_PIN_L);
  30. }
  31. void BOARD_SPI_MOSI_H(void)
  32. {
  33. GPIO_WriteBit(BOARD_GPIO_SPI_MOSI, BOARD_PIN_H);
  34. }
  35. void BOARD_SPI_MOSI_L(void)
  36. {
  37. GPIO_WriteBit(BOARD_GPIO_SPI_MOSI, BOARD_PIN_L);
  38. }
  39. uint8_t READ_BOARD_SPI_MISO(void)
  40. {
  41. return GPIO_ReadInputDataBit(BOARD_GPIO_SPI_MISO);
  42. }
  43. //---------------------------射频驱动IO部分---------------------
  44. void RF_SX128x_RST_H(void)
  45. {
  46. GPIO_WriteBit(RF_SX128x_RST, BOARD_PIN_H);
  47. }
  48. void RF_SX128x_RST_L(void)
  49. {
  50. GPIO_WriteBit(RF_SX128x_RST, BOARD_PIN_L);
  51. }
  52. void RF_SX128x_BUSY_H(void)
  53. {
  54. GPIO_WriteBit(RF_SX128x_BUSY, BOARD_PIN_H);
  55. }
  56. void RF_SX128x_BUSY_L(void)
  57. {
  58. GPIO_WriteBit(RF_SX128x_BUSY, BOARD_PIN_L);
  59. }
  60. void RF_SX128x_IO1_H(void)
  61. {
  62. GPIO_WriteBit(RF_SX128x_IO1, BOARD_PIN_H);
  63. }
  64. void RF_SX128x_IO1_L(void)
  65. {
  66. GPIO_WriteBit(RF_SX128x_IO1, BOARD_PIN_L);
  67. }
  68. void RF_SX128x_IO2_H(void)
  69. {
  70. GPIO_WriteBit(RF_SX128x_IO2, BOARD_PIN_H);
  71. }
  72. void RF_SX128x_IO2_L(void)
  73. {
  74. GPIO_WriteBit(RF_SX128x_IO2, BOARD_PIN_L);
  75. }
  76. void RF_SX128x_IO3_H(void)
  77. {
  78. GPIO_WriteBit(RF_SX128x_IO3, BOARD_PIN_H);
  79. }
  80. void RF_SX128x_IO3_L(void)
  81. {
  82. GPIO_WriteBit(RF_SX128x_IO3, BOARD_PIN_L);
  83. }
  84. void RF_EXT_PA_RE_H(void)
  85. {
  86. GPIO_WriteBit(RF_EXTPA_RE, BOARD_PIN_H);
  87. }
  88. void RF_EXT_PA_RE_L(void)
  89. {
  90. GPIO_WriteBit(RF_EXTPA_RE, BOARD_PIN_L);
  91. }
  92. void RF_EXT_PA_TE_H(void)
  93. {
  94. GPIO_WriteBit(RF_EXTPA_TE, BOARD_PIN_H);
  95. }
  96. void RF_EXT_PA_TE_L(void)
  97. {
  98. GPIO_WriteBit(RF_EXTPA_TE, BOARD_PIN_L);
  99. }
  100. uint8_t READ_RF_SX128x_BUSY(void)
  101. {
  102. return GPIO_ReadInputDataBit(RF_SX128x_BUSY);
  103. }
  104. uint8_t READ_RF_SX128x_IO1(void)
  105. {
  106. return GPIO_ReadInputDataBit(RF_SX128x_IO1);
  107. }
  108. /**
  109. * 低功耗时的IO口状态切换
  110. * @param 0: sta=true, 进入低功耗之前设置IO状态
  111. * sta=false, 退出低功耗之后恢复IO状态,
  112. * 备注:
  113. * 参考规格书9.3.3 SPI Timing When the Transceiver Leaves Sleep Mode
  114. * 参考规格书15.4 Sleep Mode Consumption
  115. */
  116. void myRadio_gpio_intoLwPwr(bool sta)
  117. {
  118. GPIO_InitTypeDef GPIO_InitStructure;
  119. if (sta == false)
  120. {
  121. }
  122. else
  123. {
  124. }
  125. }
  126. void extiLine1_callback(uint8_t status, uint32_t param)
  127. {
  128. if (gpioCallback)
  129. {
  130. gpioCallback(0);
  131. }
  132. }
  133. // BOARD_GPIOB
  134. void myRadio_gpio_irq_init()
  135. {
  136. NVIC_InitTypeDef NVIC_InitStructure;
  137. EXTI_InitTypeDef EXTI_InitStructure;
  138. GPIO_InitTypeDef GPIO_InitStructure;
  139. #ifdef MODULE_IS_1W
  140. myIrqCallback_extiLine1.thisCb = extiLine1_callback;
  141. EXTILINE0_callbackRegiste(&myIrqCallback_extiLine1);
  142. GPIO_InitStructure.GPIO_Pin = RF_SX128x_IO1_PIN;
  143. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  144. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
  145. GPIO_Init(RF_SX128x_IO1_PORT, &GPIO_InitStructure);
  146. EXTI_ClearITPendingBit(EXTI_Line0);
  147. EXTI_InitStructure.EXTI_Line = EXTI_Line0;
  148. EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
  149. EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;
  150. EXTI_InitStructure.EXTI_LineCmd = ENABLE;
  151. EXTI_Init(&EXTI_InitStructure);
  152. GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource0);
  153. /* Enable and set EXTI1 Interrupt */
  154. NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn;
  155. NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x01;
  156. NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x00;
  157. NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  158. NVIC_Init(&NVIC_InitStructure);
  159. #else
  160. myIrqCallback_extiLine1.thisCb = extiLine1_callback;
  161. EXTILINE1_callbackRegiste(&myIrqCallback_extiLine1);
  162. GPIO_InitStructure.GPIO_Pin = RF_SX128x_IO1_PIN;
  163. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  164. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
  165. GPIO_Init(RF_SX128x_IO1_PORT, &GPIO_InitStructure);
  166. EXTI_ClearITPendingBit(EXTI_Line1);
  167. EXTI_InitStructure.EXTI_Line = EXTI_Line1;
  168. EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
  169. EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;
  170. EXTI_InitStructure.EXTI_LineCmd = ENABLE;
  171. EXTI_Init(&EXTI_InitStructure);
  172. GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource1);
  173. /* Enable and set EXTI1 Interrupt */
  174. NVIC_InitStructure.NVIC_IRQChannel = EXTI1_IRQn;
  175. NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x01;
  176. NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x00;
  177. NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  178. NVIC_Init(&NVIC_InitStructure);
  179. #endif
  180. }
  181. void myRadio_gpio_init(RADIO_GPIO_CALLBACK cb)
  182. {
  183. GPIO_InitTypeDef GPIO_InitStructure;
  184. SPI_InitTypeDef SPI_InitStructure;
  185. #if defined(SPI_HARD)
  186. //----------SPI1时钟使能
  187. RCC_APB2PeriphClockCmd( RCC_APB2Periph_SPI1, ENABLE );
  188. GPIO_InitStructure.GPIO_Pin = BOARD_PIN_SPI_CLK | BOARD_PIN_SPI_MISO | BOARD_PIN_SPI_MOSI;
  189. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出
  190. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  191. GPIO_Init(BOARD_PORT_SPI_CLK, &GPIO_InitStructure);
  192. GPIO_SetBits(BOARD_GPIO_SPI_CLK | BOARD_PIN_SPI_MISO | BOARD_PIN_SPI_MOSI);
  193. /*!< SPI configuration */
  194. SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
  195. SPI_InitStructure.SPI_Mode = SPI_Mode_Master;
  196. SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;
  197. SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;
  198. SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge;
  199. SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;
  200. SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_8;
  201. SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;
  202. SPI_InitStructure.SPI_CRCPolynomial = 7;
  203. SPI_Init(SPI1, &SPI_InitStructure);
  204. /*!< Enable the SPI1 */
  205. SPI_Cmd(SPI1, ENABLE);
  206. #else
  207. GPIO_InitStructure.GPIO_Pin = BOARD_PIN_SPI_MOSI;
  208. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  209. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  210. GPIO_Init(BOARD_PORT_SPI_MOSI, &GPIO_InitStructure);
  211. GPIO_InitStructure.GPIO_Pin = BOARD_PIN_SPI_MISO;
  212. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  213. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  214. GPIO_Init(BOARD_PORT_SPI_MISO, &GPIO_InitStructure);
  215. GPIO_InitStructure.GPIO_Pin = BOARD_PIN_SPI_CLK;
  216. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  217. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  218. GPIO_Init(BOARD_PORT_SPI_CLK, &GPIO_InitStructure);
  219. #endif
  220. GPIO_InitStructure.GPIO_Pin = BOARD_PIN_SPI_CSN;
  221. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  222. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  223. GPIO_Init(BOARD_PORT_SPI_CSN, &GPIO_InitStructure);
  224. GPIO_InitStructure.GPIO_Pin = RF_SX128x_RST_PIN;
  225. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  226. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  227. GPIO_Init(RF_SX128x_RST_PORT, &GPIO_InitStructure);
  228. GPIO_InitStructure.GPIO_Pin = RF_SX128x_BUSY_PIN;
  229. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
  230. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  231. GPIO_Init(RF_SX128x_BUSY_PORT, &GPIO_InitStructure);
  232. GPIO_InitStructure.GPIO_Pin = RF_SX128x_IO1_PIN;
  233. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
  234. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  235. GPIO_Init(RF_SX128x_IO1_PORT, &GPIO_InitStructure);
  236. GPIO_InitStructure.GPIO_Pin = RF_SX128x_IO2_PIN;
  237. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
  238. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  239. GPIO_Init(RF_SX128x_IO2_PORT, &GPIO_InitStructure);
  240. GPIO_InitStructure.GPIO_Pin = RF_SX128x_IO3_PIN;
  241. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
  242. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  243. GPIO_Init(RF_SX128x_IO3_PORT, &GPIO_InitStructure);
  244. GPIO_InitStructure.GPIO_Pin = RF_EXTPA_RE_PIN;
  245. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  246. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  247. GPIO_Init(RF_EXTPA_RE_PORT, &GPIO_InitStructure);
  248. GPIO_InitStructure.GPIO_Pin = RF_EXTPA_TE_PIN;
  249. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  250. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  251. GPIO_Init(RF_EXTPA_TE_PORT, &GPIO_InitStructure);
  252. BOARD_SPI_NSS_H();
  253. myRadio_gpio_irq_init();
  254. gpioCallback = cb;
  255. }
  256. uint8_t myRadioSpi_rwByte(uint8_t byteToWrite)
  257. {
  258. uint8_t i, temp;
  259. temp = 0;
  260. #if defined(SPI_HARD)
  261. while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET) //检查指定的SPI标志位设置与否:发送缓存空标志位
  262. {
  263. i++;
  264. if(i > 200)return 0;
  265. }
  266. SPI_I2S_SendData(SPI1, byteToWrite); //通过外设SPIx发送一个数据
  267. i=0;
  268. while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) == RESET)//检查指定的SPI标志位设置与否:接受缓存非空标志位
  269. {
  270. i++;
  271. if(i > 200)return 0;
  272. }
  273. /*!< Return the byte read from the SPI bus */
  274. temp = SPI_I2S_ReceiveData(SPI1);
  275. #else
  276. BOARD_SPI_SCK_L();
  277. for(i = 0; i < 8; i ++)
  278. {
  279. if(byteToWrite & 0x80)
  280. {
  281. BOARD_SPI_MOSI_H();
  282. }
  283. else
  284. {
  285. BOARD_SPI_MOSI_L();
  286. }
  287. byteToWrite <<= 1;
  288. BOARD_SPI_SCK_H();
  289. temp <<= 1;
  290. if(READ_BOARD_SPI_MISO())
  291. {
  292. temp ++;
  293. }
  294. //SpiSetSckLow();
  295. BOARD_SPI_SCK_L();
  296. }
  297. #endif
  298. return temp;
  299. }
  300. void myRadioSpi_wBuffer(uint8_t* pData, uint8_t len)
  301. {
  302. uint8_t i;
  303. for(i = 0; i < len; i++)
  304. {
  305. myRadioSpi_rwByte(*pData);
  306. pData ++;
  307. }
  308. }
  309. void myRadioSpi_rBuffer(uint8_t* pData, uint8_t len)
  310. {
  311. uint8_t i;
  312. for(i = 0; i < len; i++)
  313. {
  314. *pData = myRadioSpi_rwByte(0xFF);
  315. pData ++;
  316. }
  317. }
  318. void myRadioSpi_rwBuffer(uint8_t* pDataR, uint8_t* pDataW, uint8_t len)
  319. {
  320. uint8_t i;
  321. for(i = 0; i < len; i++)
  322. {
  323. *pDataR = myRadioSpi_rwByte(*pDataW);
  324. pDataR ++;
  325. pDataW ++;
  326. }
  327. }