myRadio_gpio.c 8.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275
  1. #include "myRadio_gpio.h"
  2. #include "stm32f10x.h"
  3. #include "stm32f10x_exti.h"
  4. RADIO_GPIO_CALLBACK gpioCallback;
  5. //---------------------------射频SPI驱动部分---------------------
  6. void BOARD_SPI_NSS_H(void)
  7. {
  8. GPIO_WriteBit(BOARD_GPIO_SPI_CSN, BOARD_PIN_H);
  9. }
  10. void BOARD_SPI_NSS_L(void)
  11. {
  12. GPIO_WriteBit(BOARD_GPIO_SPI_CSN, BOARD_PIN_L);
  13. }
  14. void BOARD_SPI_SCK_H(void)
  15. {
  16. GPIO_WriteBit(BOARD_GPIO_SPI_CLK, BOARD_PIN_H);
  17. }
  18. void BOARD_SPI_SCK_L(void)
  19. {
  20. GPIO_WriteBit(BOARD_GPIO_SPI_CLK, BOARD_PIN_L);
  21. }
  22. void BOARD_SPI_MISO_H(void)
  23. {
  24. GPIO_WriteBit(BOARD_GPIO_SPI_MISO, BOARD_PIN_H);
  25. }
  26. void BOARD_SPI_MISO_L(void)
  27. {
  28. GPIO_WriteBit(BOARD_GPIO_SPI_MISO, BOARD_PIN_L);
  29. }
  30. void BOARD_SPI_MOSI_H(void)
  31. {
  32. GPIO_WriteBit(BOARD_GPIO_SPI_MOSI, BOARD_PIN_H);
  33. }
  34. void BOARD_SPI_MOSI_L(void)
  35. {
  36. GPIO_WriteBit(BOARD_GPIO_SPI_MOSI, BOARD_PIN_L);
  37. }
  38. uint8_t READ_BOARD_SPI_MISO(void)
  39. {
  40. return GPIO_ReadInputDataBit(BOARD_GPIO_SPI_MISO);
  41. }
  42. //---------------------------射频驱动IO部分---------------------
  43. void RF_PAN3031_IRQ_H(void)
  44. {
  45. GPIO_WriteBit(RF_PAN3031_IRQ, BOARD_PIN_H);
  46. }
  47. void RF_PAN3031_IRQ_L(void)
  48. {
  49. GPIO_WriteBit(RF_PAN3031_IRQ, BOARD_PIN_L);
  50. }
  51. void RF_PAN3031_IO5_H(void)
  52. {
  53. GPIO_WriteBit(RF_PAN3031_IO5, BOARD_PIN_H);
  54. }
  55. void RF_PAN3031_IO5_L(void)
  56. {
  57. GPIO_WriteBit(RF_PAN3031_IO5, BOARD_PIN_L);
  58. }
  59. void RF_PAN3031_IO8_H(void)
  60. {
  61. GPIO_WriteBit(RF_PAN3031_IO8, BOARD_PIN_H);
  62. }
  63. void RF_PAN3031_IO8_L(void)
  64. {
  65. GPIO_WriteBit(RF_PAN3031_IO8, BOARD_PIN_L);
  66. }
  67. void RF_EXT_PA_RE_H(void)
  68. {
  69. GPIO_WriteBit(RF_EXTPA_RE, BOARD_PIN_H);
  70. }
  71. void RF_EXT_PA_RE_L(void)
  72. {
  73. GPIO_WriteBit(RF_EXTPA_RE, BOARD_PIN_L);
  74. }
  75. void RF_EXT_PA_TE_H(void)
  76. {
  77. GPIO_WriteBit(RF_EXTPA_TE, BOARD_PIN_H);
  78. }
  79. void RF_EXT_PA_TE_L(void)
  80. {
  81. GPIO_WriteBit(RF_EXTPA_TE, BOARD_PIN_L);
  82. }
  83. uint8_t READ_RF_PAN3031_IRQ(void)
  84. {
  85. return GPIO_ReadInputDataBit(RF_PAN3031_IRQ);
  86. }
  87. void EXTI0_IRQHandler(void)
  88. {
  89. if(EXTI_GetITStatus(EXTI_Line0) != RESET)
  90. {
  91. /* Clear the EXTI line 1 pending bit */
  92. EXTI_ClearITPendingBit(EXTI_Line0);
  93. gpioCallback(1);
  94. }
  95. }
  96. // BOARD_GPIOB
  97. void myRadio_gpio_irq_init()
  98. {
  99. NVIC_InitTypeDef NVIC_InitStructure;
  100. EXTI_InitTypeDef EXTI_InitStructure;
  101. GPIO_InitTypeDef GPIO_InitStructure;
  102. GPIO_InitStructure.GPIO_Pin = RF_PAN3031_IRQ_PIN;
  103. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  104. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
  105. GPIO_Init(RF_PAN3031_IRQ_PORT, &GPIO_InitStructure);
  106. EXTI_ClearITPendingBit(EXTI_Line1);
  107. EXTI_InitStructure.EXTI_Line = EXTI_Line0;
  108. EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
  109. EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;
  110. EXTI_InitStructure.EXTI_LineCmd = ENABLE;
  111. EXTI_Init(&EXTI_InitStructure);
  112. GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource0);
  113. /* Enable and set EXTI1 Interrupt */
  114. NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn;
  115. NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x01;
  116. NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x00;
  117. NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  118. NVIC_Init(&NVIC_InitStructure);
  119. }
  120. void myRadio_gpio_init(RADIO_GPIO_CALLBACK cb)
  121. {
  122. GPIO_InitTypeDef GPIO_InitStructure;
  123. SPI_InitTypeDef SPI_InitStructure;
  124. #if defined(SPI_HARD)
  125. //----------SPI1时钟使能
  126. RCC_APB2PeriphClockCmd( RCC_APB2Periph_SPI1, ENABLE );
  127. GPIO_InitStructure.GPIO_Pin = BOARD_PIN_SPI_CLK | BOARD_PIN_SPI_MISO | BOARD_PIN_SPI_MOSI;
  128. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出
  129. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  130. GPIO_Init(BOARD_PORT_SPI_CLK, &GPIO_InitStructure);
  131. GPIO_SetBits(BOARD_GPIO_SPI_CLK | BOARD_PIN_SPI_MISO | BOARD_PIN_SPI_MOSI);
  132. /*!< SPI configuration */
  133. SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
  134. SPI_InitStructure.SPI_Mode = SPI_Mode_Master;
  135. SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;
  136. SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;
  137. SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge;
  138. SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;
  139. SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_8;
  140. SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;
  141. SPI_InitStructure.SPI_CRCPolynomial = 7;
  142. SPI_Init(SPI1, &SPI_InitStructure);
  143. /*!< Enable the SPI1 */
  144. SPI_Cmd(SPI1, ENABLE);
  145. #else
  146. GPIO_InitStructure.GPIO_Pin = BOARD_PIN_SPI_MOSI;
  147. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  148. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  149. GPIO_Init(BOARD_PORT_SPI_MOSI, &GPIO_InitStructure);
  150. GPIO_InitStructure.GPIO_Pin = BOARD_PIN_SPI_MISO;
  151. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  152. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  153. GPIO_Init(BOARD_PORT_SPI_MISO, &GPIO_InitStructure);
  154. GPIO_InitStructure.GPIO_Pin = BOARD_PIN_SPI_CLK;
  155. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  156. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  157. GPIO_Init(BOARD_PORT_SPI_CLK, &GPIO_InitStructure);
  158. BOARD_SPI_SCK_L();
  159. #endif
  160. GPIO_InitStructure.GPIO_Pin = BOARD_PIN_SPI_CSN;
  161. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  162. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  163. GPIO_Init(BOARD_PORT_SPI_CSN, &GPIO_InitStructure);
  164. GPIO_InitStructure.GPIO_Pin = RF_PAN3031_IRQ_PIN;
  165. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
  166. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  167. GPIO_Init(RF_PAN3031_IRQ_PORT, &GPIO_InitStructure);
  168. GPIO_InitStructure.GPIO_Pin = RF_PAN3031_IO5_PIN;
  169. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
  170. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  171. GPIO_Init(RF_PAN3031_IO5_PORT, &GPIO_InitStructure);
  172. GPIO_InitStructure.GPIO_Pin = RF_PAN3031_IO8_PIN;
  173. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
  174. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  175. GPIO_Init(RF_PAN3031_IO8_PORT, &GPIO_InitStructure);
  176. GPIO_InitStructure.GPIO_Pin = RF_PAN3031_IO11_PIN;
  177. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
  178. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  179. GPIO_Init(RF_PAN3031_IO11_PORT, &GPIO_InitStructure);
  180. GPIO_InitStructure.GPIO_Pin = RF_EXTPA_RE_PIN;
  181. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  182. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  183. GPIO_Init(RF_EXTPA_RE_PORT, &GPIO_InitStructure);
  184. GPIO_InitStructure.GPIO_Pin = RF_EXTPA_TE_PIN;
  185. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  186. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  187. GPIO_Init(RF_EXTPA_TE_PORT, &GPIO_InitStructure);
  188. BOARD_SPI_NSS_H();
  189. myRadio_gpio_irq_init();
  190. gpioCallback = cb;
  191. }
  192. uint8_t myRadioSpi_rwByte(uint8_t byteToWrite)
  193. {
  194. uint8_t i, temp;
  195. temp = 0;
  196. #if defined(SPI_HARD)
  197. while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET) //检查指定的SPI标志位设置与否:发送缓存空标志位
  198. {
  199. i++;
  200. if(i > 200)return 0;
  201. }
  202. SPI_I2S_SendData(SPI1, byteToWrite); //通过外设SPIx发送一个数据
  203. i=0;
  204. while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) == RESET)//检查指定的SPI标志位设置与否:接受缓存非空标志位
  205. {
  206. i++;
  207. if(i > 200)return 0;
  208. }
  209. /*!< Return the byte read from the SPI bus */
  210. temp = SPI_I2S_ReceiveData(SPI1);
  211. #else
  212. BOARD_SPI_SCK_L();
  213. for(i = 0; i < 8; i ++)
  214. {
  215. if(byteToWrite & 0x80)
  216. {
  217. BOARD_SPI_MOSI_H();
  218. }
  219. else
  220. {
  221. BOARD_SPI_MOSI_L();
  222. }
  223. byteToWrite <<= 1;
  224. BOARD_SPI_SCK_H();
  225. temp <<= 1;
  226. if(READ_BOARD_SPI_MISO())
  227. {
  228. temp ++;
  229. }
  230. BOARD_SPI_SCK_L();
  231. }
  232. #endif
  233. return temp;
  234. }
  235. void myRadioSpi_wBuffer(uint8_t* pData, uint8_t len)
  236. {
  237. uint8_t i;
  238. for(i = 0; i < len; i++)
  239. {
  240. myRadioSpi_rwByte(*pData);
  241. pData ++;
  242. }
  243. }
  244. void myRadioSpi_rBuffer(uint8_t* pData, uint8_t len)
  245. {
  246. uint8_t i;
  247. for(i = 0; i < len; i++)
  248. {
  249. *pData = myRadioSpi_rwByte(0xFF);
  250. pData ++;
  251. }
  252. }