myRadio_gpio.c 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226
  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_CC1101_SPI_CSN, BOARD_PIN_H);
  11. }
  12. void BOARD_SPI_NSS_L(void)
  13. {
  14. GPIO_WriteBit(RF_CC1101_SPI_CSN, BOARD_PIN_L);
  15. }
  16. void BOARD_SPI_SCK_H(void)
  17. {
  18. GPIO_WriteBit(RF_CC1101_SPI_CLK, BOARD_PIN_H);
  19. }
  20. void BOARD_SPI_SCK_L(void)
  21. {
  22. GPIO_WriteBit(RF_CC1101_SPI_CLK, BOARD_PIN_L);
  23. }
  24. void BOARD_SPI_MISO_H(void)
  25. {
  26. GPIO_WriteBit(RF_CC1101_SPI_MISO, BOARD_PIN_H);
  27. }
  28. void BOARD_SPI_MISO_L(void)
  29. {
  30. GPIO_WriteBit(RF_CC1101_SPI_MISO, BOARD_PIN_L);
  31. }
  32. void BOARD_SPI_MOSI_H(void)
  33. {
  34. GPIO_WriteBit(RF_CC1101_SPI_MOSI, BOARD_PIN_H);
  35. }
  36. void BOARD_SPI_MOSI_L(void)
  37. {
  38. GPIO_WriteBit(RF_CC1101_SPI_MOSI, BOARD_PIN_L);
  39. }
  40. uint8_t READ_BOARD_SPI_MISO(void)
  41. {
  42. return GPIO_ReadInputDataBit(RF_CC1101_SPI_MISO);
  43. }
  44. //---------------------------射频驱动IO部分---------------------
  45. void RF_CC1101_IO0_H(void)
  46. {
  47. GPIO_WriteBit(RF_CC1101_IO0, BOARD_PIN_H);
  48. }
  49. void RF_CC1101_IO0_L(void)
  50. {
  51. GPIO_WriteBit(RF_CC1101_IO0, BOARD_PIN_L);
  52. }
  53. uint8_t READ_RF_CC1101_IO0(void)
  54. {
  55. return GPIO_ReadInputDataBit(RF_CC1101_IO0);
  56. }
  57. void rfIrq_callback(uint8_t status, uint32_t param)
  58. {
  59. if (gpioCallback)
  60. {
  61. gpioCallback(1);
  62. }
  63. }
  64. // BOARD_GPIOB
  65. void myRadio_gpio_irq_init()
  66. {
  67. NVIC_InitTypeDef NVIC_InitStructure;
  68. EXTI_InitTypeDef EXTI_InitStructure;
  69. GPIO_InitTypeDef GPIO_InitStructure;
  70. GPIO_InitStructure.GPIO_Pin = RF_CC1101_IO0_PIN;
  71. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  72. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
  73. GPIO_Init(RF_CC1101_IO0_PORT, &GPIO_InitStructure);
  74. EXTI_ClearITPendingBit(EXTI_Line1);
  75. EXTI_InitStructure.EXTI_Line = EXTI_Line1;
  76. EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
  77. EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;
  78. EXTI_InitStructure.EXTI_LineCmd = ENABLE;
  79. EXTI_Init(&EXTI_InitStructure);
  80. GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource1);
  81. /* Enable and set EXTI1 Interrupt */
  82. NVIC_InitStructure.NVIC_IRQChannel = EXTI1_IRQn;
  83. NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x01;
  84. NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x00;
  85. NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  86. NVIC_Init(&NVIC_InitStructure);
  87. myIrqCallback_rfIrq.thisCb = rfIrq_callback;
  88. EXTILINE1_callbackRegiste(&myIrqCallback_rfIrq);
  89. }
  90. void myRadio_gpio_init(RADIO_GPIO_CALLBACK cb)
  91. {
  92. GPIO_InitTypeDef GPIO_InitStructure;
  93. SPI_InitTypeDef SPI_InitStructure;
  94. #if defined(SPI_HARD)
  95. //----------SPI1时钟使能
  96. RCC_APB2PeriphClockCmd( RCC_APB2Periph_SPI1, ENABLE );
  97. GPIO_InitStructure.GPIO_Pin = RF_CC1101_SPI_CLK_PIN | RF_CC1101_SPI_MISO_PIN | RF_CC1101_SPI_MOSI_PIN;
  98. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出
  99. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  100. GPIO_Init(RF_CC1101_SPI_CLK_PORT, &GPIO_InitStructure);
  101. // GPIO_SetBits(BOARD_GPIO_SPI_CLK | RF_CC1101_SPI_MISO_PIN | RF_CC1101_SPI_MOSI_PIN);
  102. /*!< SPI configuration */
  103. SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
  104. SPI_InitStructure.SPI_Mode = SPI_Mode_Master;
  105. SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;
  106. SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;
  107. SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge;
  108. SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;
  109. SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_16;
  110. SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;
  111. SPI_InitStructure.SPI_CRCPolynomial = 7;
  112. SPI_Init(SPI1, &SPI_InitStructure);
  113. /*!< Enable the SPI1 */
  114. SPI_Cmd(SPI1, ENABLE);
  115. #else
  116. GPIO_InitStructure.GPIO_Pin = RF_CC1101_SPI_MOSI_PIN;
  117. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  118. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  119. GPIO_Init(BOARD_PORT_SPI_MOSI, &GPIO_InitStructure);
  120. GPIO_InitStructure.GPIO_Pin = RF_CC1101_SPI_MISO_PIN;
  121. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  122. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  123. GPIO_Init(BOARD_PORT_SPI_MISO, &GPIO_InitStructure);
  124. GPIO_InitStructure.GPIO_Pin = RF_CC1101_SPI_CLK_PIN;
  125. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  126. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  127. GPIO_Init(BOARD_PORT_SPI_CLK, &GPIO_InitStructure);
  128. #endif
  129. GPIO_InitStructure.GPIO_Pin = RF_CC1101_SPI_CSN_PIN;
  130. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  131. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  132. GPIO_Init(RF_CC1101_SPI_CSN_PORT, &GPIO_InitStructure);
  133. GPIO_InitStructure.GPIO_Pin = RF_CC1101_IO0_PIN;
  134. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
  135. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  136. GPIO_Init(RF_CC1101_IO0_PORT, &GPIO_InitStructure);
  137. BOARD_SPI_NSS_H();
  138. myRadio_gpio_irq_init();
  139. gpioCallback = cb;
  140. }
  141. uint8_t myRadioSpi_rwByte(uint8_t byteToWrite)
  142. {
  143. uint8_t i, temp;
  144. temp = 0;
  145. #if defined(SPI_HARD)
  146. while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET) //检查指定的SPI标志位设置与否:发送缓存空标志位
  147. {
  148. i++;
  149. if(i > 200)return 0;
  150. }
  151. SPI_I2S_SendData(SPI1, byteToWrite); //通过外设SPIx发送一个数据
  152. i=0;
  153. while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) == RESET)//检查指定的SPI标志位设置与否:接受缓存非空标志位
  154. {
  155. i++;
  156. if(i > 200)return 0;
  157. }
  158. /*!< Return the byte read from the SPI bus */
  159. temp = SPI_I2S_ReceiveData(SPI1);
  160. #else
  161. BOARD_SPI_SCK_L();
  162. for(i = 0; i < 8; i ++)
  163. {
  164. if(byteToWrite & 0x80)
  165. {
  166. //SpiSetMosiHigh();
  167. BOARD_SPI_MOSI_H();
  168. }
  169. else
  170. {
  171. //SpiSetMosiLow();
  172. BOARD_SPI_MOSI_L();
  173. }
  174. byteToWrite <<= 1;
  175. //SpiSetSckHigh();
  176. BOARD_SPI_SCK_H();
  177. temp <<= 1;
  178. if(READ_BOARD_SPI_MISO())
  179. {
  180. temp ++;
  181. }
  182. //SpiSetSckLow();
  183. BOARD_SPI_SCK_L();
  184. }
  185. #endif
  186. return temp;
  187. }
  188. void myRadioSpi_wBuffer(uint8_t* pData, uint8_t len)
  189. {
  190. uint8_t i;
  191. for(i = 0; i < len; i++)
  192. {
  193. myRadioSpi_rwByte(*pData);
  194. pData ++;
  195. }
  196. }
  197. void myRadioSpi_rBuffer(uint8_t* pData, uint8_t len)
  198. {
  199. uint8_t i;
  200. for(i = 0; i < len; i++)
  201. {
  202. *pData = myRadioSpi_rwByte(0xFF);
  203. pData ++;
  204. }
  205. }