myRadio_gpio.c 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246
  1. #include "myRadio_gpio.h"
  2. #include "SN_SPI.h"
  3. RADIO_GPIO_CALLBACK gpioCallback;
  4. int spiMosiMode = 0;
  5. //---------------------------射频SPI驱动部分---------------------
  6. void BOARD_SPI_NSS_H(void)
  7. {
  8. std_spi_set_nss_output(SPI_NSS_OUTPUT_HIGH);
  9. SN_GPIO_PIN_write(BOARD_GPIO_SPI_CSN, 1);
  10. }
  11. void BOARD_SPI_NSS_L(void)
  12. {
  13. std_spi_set_nss_output(SPI_NSS_OUTPUT_LOW);
  14. SN_GPIO_PIN_write(BOARD_GPIO_SPI_CSN, 0);
  15. }
  16. void BOARD_SPI_SCK_H(void)
  17. {
  18. SN_GPIO_PIN_write(BOARD_GPIO_SPI_CLK, 1);
  19. }
  20. void BOARD_SPI_SCK_L(void)
  21. {
  22. SN_GPIO_PIN_write(BOARD_GPIO_SPI_CLK, 0);
  23. }
  24. void BOARD_SPI_MISO_H(void)
  25. {
  26. SN_GPIO_PIN_write(BOARD_GPIO_SPI_MISO, 1);
  27. }
  28. void BOARD_SPI_MISO_L(void)
  29. {
  30. SN_GPIO_PIN_write(BOARD_GPIO_SPI_MISO, 0);
  31. }
  32. void BOARD_SPI_MOSI_H(void)
  33. {
  34. #ifdef SPI_SOFT_3LINE
  35. int ret;
  36. if (spiMosiMode == 0)
  37. {
  38. GPIO_InitTypeDef GPIO_InitStructure;
  39. GPIO_InitStructure.GPIO_Pin = BOARD_PIN_SPI_MOSI;
  40. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  41. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  42. GPIO_Init(BOARD_PORT_SPI_MOSI, &GPIO_InitStructure);
  43. }
  44. spiMosiMode = 1;
  45. #endif
  46. SN_GPIO_PIN_write(BOARD_GPIO_SPI_MOSI, 1);
  47. }
  48. void BOARD_SPI_MOSI_L(void)
  49. {
  50. #ifdef SPI_SOFT_3LINE
  51. int ret;
  52. if (spiMosiMode == 0)
  53. {
  54. GPIO_InitTypeDef GPIO_InitStructure;
  55. GPIO_InitStructure.GPIO_Pin = BOARD_PIN_SPI_MOSI;
  56. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  57. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  58. GPIO_Init(BOARD_PORT_SPI_MOSI, &GPIO_InitStructure);
  59. }
  60. spiMosiMode = 1;
  61. #endif
  62. SN_GPIO_PIN_write(BOARD_GPIO_SPI_MOSI, 0);
  63. }
  64. uint8_t READ_BOARD_SPI_MISO(void)
  65. {
  66. #ifndef SPI_SOFT_3LINE
  67. return SN_GPIO_PIN_get(BOARD_GPIO_SPI_MISO);
  68. #else
  69. int ret;
  70. if (spiMosiMode == 1)
  71. {
  72. GPIO_InitTypeDef GPIO_InitStructure;
  73. GPIO_InitStructure.GPIO_Pin = BOARD_PIN_SPI_MOSI;
  74. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  75. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  76. GPIO_Init(BOARD_PORT_SPI_MOSI, &GPIO_InitStructure);
  77. }
  78. spiMosiMode = 0;
  79. ret = SN_GPIO_PIN_get(BOARD_GPIO_SPI_MOSI);
  80. return ret;
  81. #endif
  82. }
  83. //---------------------------射频驱动IO部分---------------------
  84. void RF_PAN3029_IRQ_H(void)
  85. {
  86. SN_GPIO_PIN_write(RF_PAN3029_IRQ, 1);
  87. }
  88. void RF_PAN3029_IRQ_L(void)
  89. {
  90. SN_GPIO_PIN_write(RF_PAN3029_IRQ, 0);
  91. }
  92. void RF_PAN3029_NRST_H(void)
  93. {
  94. // SN_GPIO_PIN_write(RF_PAN3029_NRST, 1);
  95. }
  96. void RF_PAN3029_NRST_L(void)
  97. {
  98. // SN_GPIO_PIN_write(RF_PAN3029_NRST, 0);
  99. }
  100. void RF_PAN3029_IO3_H(void)
  101. {
  102. // SN_GPIO_PIN_write(RF_PAN3029_IO3, 1);
  103. }
  104. void RF_PAN3029_IO3_L(void)
  105. {
  106. // SN_GPIO_PIN_write(RF_PAN3029_IO3, 0);
  107. }
  108. void RF_EXT_PA_RE_H(void)
  109. {
  110. // SN_GPIO_PIN_write(RF_EXTPA_RE, 1);
  111. }
  112. void RF_EXT_PA_RE_L(void)
  113. {
  114. // SN_GPIO_PIN_write(RF_EXTPA_RE, 0);
  115. }
  116. void RF_EXT_PA_TE_H(void)
  117. {
  118. // SN_GPIO_PIN_write(RF_EXTPA_TE, 1);
  119. }
  120. void RF_EXT_PA_TE_L(void)
  121. {
  122. // SN_GPIO_PIN_write(RF_EXTPA_TE, 0);
  123. }
  124. uint8_t READ_RF_PAN3029_IRQ(void)
  125. {
  126. return SN_GPIO_PIN_get(RF_PAN3029_IRQ);
  127. }
  128. uint8_t READ_RF_PAN3029_IO11(void)
  129. {
  130. return SN_GPIO_PIN_get(RF_PAN3029_IO11);
  131. }
  132. void RF_IRQHandler(void)
  133. {
  134. if (READ_RF_PAN3029_IRQ())
  135. {
  136. gpioCallback(1);
  137. }
  138. }
  139. // BOARD_GPIOB
  140. void myRadio_gpio_irq_init()
  141. {
  142. SN_EXIT_set(RF_PAN3029_IRQ,GPIO_NOPULL,RF_IRQHandler,EXTI_TRIGGER_RISING,NVIC_PRIO_3);
  143. }
  144. void myRadio_gpio_init(RADIO_GPIO_CALLBACK cb)
  145. {
  146. // GPIO_InitTypeDef GPIO_InitStructure;
  147. #if defined(SPI_HARD)
  148. SN_SPI_IO_set(SPI_MOSI_PA0 , SPI_MISO_PA1 , SPI_SCK_PB0, SPI_NSS_NULL );
  149. SN_SPI_MASTER_init(SPI_BAUD_PCLKDIV_8, SPI_MODE_0 , SPI_MSB );
  150. SN_SPI_IO_SOF_cs(SPI_SOF_CS_PB1);
  151. #else
  152. GPIO_InitStructure.GPIO_Pin = BOARD_PIN_SPI_MOSI;
  153. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  154. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  155. GPIO_Init(BOARD_PORT_SPI_MOSI, &GPIO_InitStructure);
  156. #ifndef SPI_SOFT_3LINE
  157. GPIO_InitStructure.GPIO_Pin = BOARD_PIN_SPI_MISO;
  158. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  159. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  160. GPIO_Init(BOARD_PORT_SPI_MISO, &GPIO_InitStructure);
  161. #endif
  162. GPIO_InitStructure.GPIO_Pin = BOARD_PIN_SPI_CLK;
  163. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  164. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  165. GPIO_Init(BOARD_PORT_SPI_CLK, &GPIO_InitStructure);
  166. BOARD_SPI_SCK_L();
  167. #endif
  168. SN_GPIO_PIN_init(BOARD_GPIO_SPI_CSN , GPIO_MODE_OUTPUT ,GPIO_PULLUP ,GPIO_OUTPUT_PUSHPULL);
  169. SN_GPIO_PIN_init(RF_PAN3029_IRQ , GPIO_MODE_INPUT ,GPIO_NOPULL ,GPIO_OUTPUT_PUSHPULL);
  170. // SN_GPIO_PIN_init(RF_PAN3029_NRST , GPIO_MODE_OUTPUT ,GPIO_PULLUP ,GPIO_OUTPUT_PUSHPULL);
  171. // SN_GPIO_PIN_init(RF_PAN3029_IO3 , GPIO_MODE_INPUT ,GPIO_NOPULL ,GPIO_OUTPUT_PUSHPULL);
  172. SN_GPIO_PIN_init(RF_PAN3029_IO11 , GPIO_MODE_OUTPUT ,GPIO_PULLUP ,GPIO_OUTPUT_PUSHPULL);
  173. // SN_GPIO_PIN_init(RF_EXTPA_RE , GPIO_MODE_OUTPUT ,GPIO_PULLUP ,GPIO_OUTPUT_PUSHPULL);
  174. // SN_GPIO_PIN_init(RF_EXTPA_TE , GPIO_MODE_OUTPUT ,GPIO_PULLUP ,GPIO_OUTPUT_PUSHPULL);
  175. BOARD_SPI_NSS_H();
  176. RF_PAN3029_NRST_H();
  177. myRadio_gpio_irq_init();
  178. gpioCallback = cb;
  179. }
  180. uint8_t myRadioSpi_rwByte(uint8_t byteToWrite)
  181. {
  182. uint16_t i = 0;
  183. uint8_t temp;
  184. temp = 0;
  185. #if defined(SPI_HARD)
  186. /* 等待发送数据寄存器为空 */
  187. while(std_spi_get_flag(SPI_FLAG_TXFE) != SPI_FLAG_TXFE);
  188. /* 发送数据 */
  189. std_spi_write_data(byteToWrite);
  190. //SPI1->DR = tx_data;
  191. /* 等待接收数据寄存器非空 */
  192. while(std_spi_get_flag(SPI_FLAG_RXFNE) != SPI_FLAG_RXFNE);
  193. /* 接收数据 */
  194. temp=std_spi_read_data();
  195. #else
  196. BOARD_SPI_SCK_L();
  197. for(i = 0; i < 8; i ++)
  198. {
  199. if(byteToWrite & 0x80)
  200. {
  201. BOARD_SPI_MOSI_H();
  202. }
  203. else
  204. {
  205. BOARD_SPI_MOSI_L();
  206. }
  207. byteToWrite <<= 1;
  208. BOARD_SPI_SCK_H();
  209. temp <<= 1;
  210. if(READ_BOARD_SPI_MISO())
  211. {
  212. temp ++;
  213. }
  214. BOARD_SPI_SCK_L();
  215. }
  216. #endif
  217. return temp;
  218. }
  219. void myRadioSpi_wBuffer(uint8_t* pData, uint8_t len)
  220. {
  221. for (size_t i = 0; i < len; i++)
  222. {
  223. myRadioSpi_rwByte(pData[i]);
  224. }
  225. }
  226. void myRadioSpi_rBuffer(uint8_t* pData, uint8_t len)
  227. {
  228. for (size_t i = 0; i < len; i++)
  229. {
  230. pData[i] = myRadioSpi_rwByte(0xff);
  231. }
  232. }