PAN312x_Hal.c 8.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361
  1. /**
  2. ******************************************************************************
  3. * 文件名 : PAN312x_HAL.c
  4. * 作者 : PAN312x RF Team
  5. * 版本 : V1.0.0
  6. * 时间 :
  7. * 文件描述:
  8. * 该文件为PAN312x模块的硬件层,包含MCU与PAN312x模块的SPI配置,GPIO口初始化,以
  9. *及用于PAN312x寄存器、FIFO读写操作;
  10. * 客户在使用模块时候需要移植该文件,保证各个函数名、函数形参不变的情况下
  11. *根据自己的MCU平台修改函数内容,使各个功能块正常运行。硬件层占用资源如下:
  12. *
  13. *SPI:本例程使用STM32L1的SPI3进行与PAN312x模块通信。
  14. *GPIO口:本例程使用的GPIO口详情如下:
  15. * PB15 ---> M0SI
  16. * PB13 ---> SCK
  17. * PB14 ---> MISO
  18. * PB10 ---> GPIO8(IRQ)
  19. * PB11 ---> GPIO0
  20. * PB12 ---> CSN
  21. * PB5 ---> GPIO1
  22. * PB6 ---> GPIO3(nRST)
  23. * PB7 ---> GPIO2
  24. * PB8 ---> GPIO9
  25. * PB10 ---> GPIO10
  26. *******************************************************************************/
  27. #include "base_types.h"
  28. #include "gpio.h"
  29. #include "board_gpio.h"
  30. #include "board_spi.h"
  31. #include "bsp.h"
  32. //#define PAN312x_SPIx_CSN_GPIO RADIO_NSS_PORT
  33. //#define PAN312x_SPIx_CSN_PIN RADIO_NSS_PIN
  34. #define PAN312x_CSN_0() RADIO_NSS_L()
  35. #define PAN312x_CSN_1() RADIO_NSS_H()
  36. #define PAN312x_DIO8_GPIO RADIO_IRQ_PORT
  37. #define PAN312x_DIO8_PIN RADIO_IRQ_PIN
  38. #define PAN312x_RESET_GPIO RADIO_RST_POT
  39. #define PAN312x_RESET_PIN RADIO_RST_PIN
  40. #define pan312x_hspi RADIO_SPI_CHx
  41. //-----------------------------GPIO-----------------------------//
  42. //该部分函数为系统用到的GPIO的初始化函数,用户根据自己的平台相应修改
  43. //--------------------------------------------------------------//
  44. /**
  45. * @简介:Reset引脚初始化;
  46. * @参数:void;
  47. * @返回值:无
  48. */
  49. void PAN312x_Reset_Init(void)
  50. {
  51. // GPIO_InitTypeDef GPIO_InitStruct;
  52. // PAN312x_RESET_CLK_ENABLE();
  53. // GPIO_InitStruct.Pin = PAN312x_RESET_PIN;
  54. // GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  55. // GPIO_InitStruct.Pull = GPIO_PULLUP;
  56. // GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
  57. // HAL_GPIO_Init(PAN312x_RESET_GPIO, &GPIO_InitStruct);
  58. Gpio_SetIO( PAN312x_RESET_GPIO,PAN312x_RESET_PIN );
  59. }
  60. /**
  61. * @简介:该函数用于MCU对SPI对应IO口初始化;
  62. * @参数:无
  63. * @返回值:无
  64. */
  65. void PAN312x_SPIGPIO_Init()
  66. {
  67. }
  68. /**
  69. * @简介:该函数用于MCU对SPI配置初始化;
  70. * @参数:无
  71. * @返回值:无
  72. */
  73. void PAN312x_SPI_Init()
  74. {
  75. }
  76. /**
  77. * @简介:该函数为GPIO8输入初始化及中断、优先级配置;
  78. * @参数:无
  79. * @返回值:无
  80. */
  81. void PAN312x_DIO8_INPUT()
  82. {
  83. }
  84. /**
  85. * @简介:该函数为GPIO8输入中断开启使能;
  86. * @参数:无
  87. * @返回值:无
  88. */
  89. void PAN312x_DIO8_INTENABLE()
  90. {
  91. /* EXTI interrupt init*/
  92. // HAL_NVIC_SetPriority(EXTI0_IRQn, 0, 0);
  93. // HAL_NVIC_EnableIRQ(EXTI0_IRQn);
  94. EnableNvic(PORTA_IRQn, IrqLevel3, TRUE);
  95. }
  96. /**
  97. * @简介:该函数为DIO8输入中断关闭使能;
  98. * @参数:无
  99. * @返回值:无
  100. */
  101. void PAN312x_DIO8_INTDISABLE()
  102. {
  103. // HAL_NVIC_DisableIRQ(EXTI15_10_IRQn);
  104. //HAL_NVIC_DisableIRQ(EXTI0_IRQn);
  105. EnableNvic(PORTA_IRQn, IrqLevel3, FALSE);
  106. }
  107. /**
  108. * @简介:该函数为DIO8输入状态获取;
  109. * @参数:无
  110. * @返回值:DIO8状态"1"or"0"
  111. */
  112. boolean_t PAN312x_DIO8_GetState()
  113. {
  114. boolean_t State;
  115. State = Gpio_GetInputIO(PAN312x_DIO8_GPIO, PAN312x_DIO8_PIN);
  116. return State;
  117. }
  118. /**
  119. * @简介:该函数为SX1208复位引脚NRST输出控制;
  120. * @参数:PinState为"1"表示输出高电平,"0"输出低电平;
  121. * @返回值:无
  122. */
  123. void PAN312x_Reset_OUTPUT(boolean_t PinState)
  124. {
  125. Gpio_WriteOutputIO(PAN312x_RESET_GPIO, PAN312x_RESET_PIN, PinState);
  126. }
  127. /**
  128. * @简介:将Reset引脚拉高;
  129. * @参数:void;
  130. * @返回值:无
  131. */
  132. void PAN312x_Reset_High(void)
  133. {
  134. Gpio_SetIO(PAN312x_RESET_GPIO, PAN312x_RESET_PIN);
  135. }
  136. /**
  137. * @简介:将Reset引脚拉低;
  138. * @参数:void;
  139. * @返回值:无
  140. */
  141. void PAN312x_Reset_Low(void)
  142. {
  143. Gpio_ClrIO(PAN312x_RESET_GPIO, PAN312x_RESET_PIN);
  144. }
  145. //-----------------------------SPI-----------------------------//
  146. //该部分函数为MCU对PAN312x模块SPI通信部分,包含SPI口及配置初始化
  147. //--------------------------------------------------------------//
  148. /**
  149. * @简介:加锁,让SDK可重入
  150. * @参数:无
  151. * @返回值:无
  152. */
  153. void PAN312x_Lock(void)
  154. {
  155. __disable_irq();
  156. }
  157. /**
  158. * @简介:解锁,让SDK可重入
  159. * @参数:无
  160. * @返回值:无
  161. */
  162. void PAN312x_Unlock(void)
  163. {
  164. __enable_irq();
  165. }
  166. #if PAN312x_INTERFACE == PAN312x_IF_SPI
  167. /**
  168. * @简介:开始PAN312x的数据收发,即SPI接口拉低CS
  169. * @参数:无
  170. * @返回值:无
  171. */
  172. void PAN312x_DataBegin(void)
  173. {
  174. PAN312x_CSN_0();
  175. }
  176. /**
  177. * @简介:结束PAN312x的数据收发,如果接口为SPI则表示拉高CS,如果接口为I2C则表示发送结束信号
  178. * @参数:无
  179. * @返回值:无
  180. */
  181. void PAN312x_DataEnd(void)
  182. {
  183. PAN312x_CSN_1();
  184. }
  185. /**
  186. * @简介:向PAN312x写入一段数据,如果接口为SPI则不包括CS操作部分
  187. * @参数:buf - 数据缓冲区
  188. * len - 数据长度
  189. * @返回值:写入的数据长度,或者错误值(负数)
  190. */
  191. int PAN312x_DataWrite(const void* buf, int len)
  192. {
  193. // HAL_SPI_Transmit(&pan312x_hspi, (void*)buf, len, 1000);
  194. for(int i=0;i<len;i++){
  195. SpiInOut( ((uint8_t*)buf)[i]);
  196. // while(Spi_GetStatus(pan312x_hspi, SpiTxe) == FALSE);//等待发送缓冲器空
  197. // Spi_SendData( pan312x_hspi,((uint8_t*)buf)[i++] );
  198. }
  199. return len;
  200. }
  201. /**
  202. * @简介:通过SPI从PAN312x读取一段数据
  203. * @参数:buf - 数据缓冲区
  204. * len - 数据长度
  205. * @返回值:读取的数据长度
  206. */
  207. int PAN312x_DataRead(void* buf, int len)
  208. {
  209. //HAL_SPI_Receive(&pan312x_hspi, buf, len, 1000);
  210. for( int i=0;i<len;i++ ){
  211. ((uint8_t*)buf)[i] = SpiInOut(0x00);
  212. // while(Spi_GetStatus(RADIO_SPI_CHx, SpiRxne) == FALSE);//等待接收缓冲器非空
  213. // ((uint8_t*)buf)[i++] = Spi_ReceiveData(RADIO_SPI_CHx);
  214. }
  215. return len;
  216. }
  217. #elif PAN312x_INTERFACE == PAN312x_IF_I2C
  218. /**
  219. * @简介:开始PAN312x的数据收发,即I2C表示发送起始信号
  220. * @参数:无
  221. * @返回值:无
  222. */
  223. void PAN312x_DataBegin(void)
  224. {
  225. PAN312x_CSN_0();
  226. }
  227. /**
  228. * @简介:结束PAN312x的数据收发,I2C则表示发送结束信号
  229. * @参数:无
  230. * @返回值:无
  231. */
  232. void PAN312x_DataEnd(void)
  233. {
  234. }
  235. /**
  236. * @简介:向PAN312x写入一段数据,如果接口为SPI则不包括CS操作部分
  237. * @参数:buf - 数据缓冲区
  238. * len - 数据长度
  239. * @返回值:写入的数据长度,或者错误值(负数)
  240. */
  241. int PAN312x_DataWrite(const void* buf, int len)
  242. {
  243. }
  244. /**
  245. * @简介:通过SPI从PAN312x读取一段数据
  246. * @参数:buf - 数据缓冲区
  247. * len - 数据长度
  248. * @返回值:读取的数据长度
  249. */
  250. int PAN312x_DataRead(void* buf, int len)
  251. {
  252. }
  253. #endif //PAN312x_INTERFACE
  254. /**
  255. * @简介:PAN312x 向寄存器地址连续发送数据
  256. * @参数:uint8_t addr,寄存器地址 uint8_t *buffer,发送数组指针 uint8_t size指针长度
  257. * @返回值:无
  258. */
  259. uint8_t PAN312x_ReadWriteByte(uint8_t data)
  260. {
  261. unsigned char RxDat;
  262. //HAL_SPI_TransmitReceive(&pan312x_hspi, &data, &RxDat, 1, 1000);
  263. RxDat = SpiInOut(data);
  264. return RxDat;
  265. }
  266. void PAN312x_Write_Bytes(uint8_t *buffer, uint8_t size)
  267. {
  268. uint8_t i;
  269. //DISABLE_INT();
  270. PAN312x_CSN_0();
  271. for(i = 0; i < size; i++){
  272. PAN312x_ReadWriteByte(buffer[i]);
  273. }
  274. PAN312x_CSN_1();
  275. //ENABLE_INT();
  276. }
  277. /**
  278. * @简介:PAN312x 向寄存器地址连续发送数据
  279. * @参数:uint8_t addr,寄存器地址 uint8_t *buffer,发送数组指针 uint8_t size指针长度
  280. * @返回值:无
  281. */
  282. void PAN312x_Write_Register_Bytes(uint8_t addr, uint8_t *buffer, uint8_t size)
  283. {
  284. uint8_t i;
  285. //DISABLE_INT();
  286. PAN312x_CSN_0();
  287. PAN312x_ReadWriteByte((addr << 0x01) | 0x01);
  288. for(i = 0; i < size; i++){
  289. PAN312x_ReadWriteByte(buffer[i]);
  290. }
  291. PAN312x_CSN_1();
  292. //ENABLE_INT();
  293. }
  294. /**
  295. * @简介:PAN312x 向寄存器地址连续读数据
  296. * @参数:uint8_t addr,寄存器地址 uint8_t *buffer,发送数组指针 uint8_t size指针长度
  297. * @返回值:数据返回到*buffer中
  298. */
  299. void PAN312x_Read_Register_Bytes( uint8_t addr, uint8_t *buffer, uint8_t size)
  300. {
  301. uint8_t i;
  302. //DISABLE_INT();
  303. PAN312x_CSN_0();
  304. PAN312x_ReadWriteByte(addr << 0x01);
  305. for(i = 0; i < size; i++ ){
  306. buffer[i] = PAN312x_ReadWriteByte(0x00);
  307. }
  308. PAN312x_CSN_1();
  309. //ENABLE_INT();
  310. }
  311. /****** Copyright (C) 2025-2050 Shanghai Panchip Microelectronics Co., Ltd. All rights reserved. *******/