cmt2300.c 27 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811
  1. /*
  2. * THE FOLLOWING FIRMWARE IS PROVIDED: (1) "AS IS" WITH NO WARRANTY; AND
  3. * (2)TO ENABLE ACCESS TO CODING INFORMATION TO GUIDE AND FACILITATE CUSTOMER.
  4. * CONSEQUENTLY, CMOSTEK SHALL NOT BE HELD LIABLE FOR ANY DIRECT, INDIRECT OR
  5. * CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING FROM THE CONTENT
  6. * OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE CODING INFORMATION
  7. * CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
  8. *
  9. * Copyright (C) CMOSTEK SZ.
  10. */
  11. /*!
  12. * @file cmt2300.c
  13. * @brief CMT2300 transceiver RF chip driver
  14. *
  15. * @version 1.2
  16. * @date Feb 08 2017
  17. * @author CMOSTEK R@D
  18. */
  19. #include "cmt2300.h"
  20. /*! ********************************************************
  21. * @name Cmt2300_SoftReset
  22. * @desc Soft reset.
  23. * *********************************************************/
  24. void Cmt2300_SoftReset(void)
  25. {
  26. Cmt2300_WriteReg(0x7F, 0xFF);
  27. }
  28. /*! ********************************************************
  29. * @name Cmt2300_GetChipStatus
  30. * @desc Get the chip status.
  31. * @return
  32. * CMT2300_STA_PUP
  33. * CMT2300_STA_SLEEP
  34. * CMT2300_STA_STBY
  35. * CMT2300_STA_RFS
  36. * CMT2300_STA_TFS
  37. * CMT2300_STA_RX
  38. * CMT2300_STA_TX
  39. * CMT2300_STA_EEPROM
  40. * CMT2300_STA_CAL
  41. * *********************************************************/
  42. uint8_t Cmt2300_GetChipStatus(void)
  43. {
  44. return Cmt2300_ReadReg(CMT2300_CUS_MODE_STA) & CMT2300_MASK_CHIP_MODE_STA;
  45. }
  46. /*! ********************************************************
  47. * @name Cmt2300_GetChipStatus
  48. * @desc Wait the chip status, and 50*200 us as timeout.
  49. * @param nStatus: the chip status
  50. * @return true or false
  51. * *********************************************************/
  52. bool Cmt2300_WaitChipStatus(uint8_t nStatus)
  53. {
  54. bool ret;
  55. uint8_t status;
  56. #ifdef ENABLE_WAIT_CHIP_STATUS
  57. uint16_t i;
  58. for(i=0; i<5; i++, Cmt2300_DelayUs(200)) {
  59. status = Cmt2300_GetChipStatus();
  60. if(nStatus==status)
  61. {
  62. ret = true;
  63. break;
  64. }
  65. else
  66. {
  67. ret = false;
  68. }
  69. }
  70. #else
  71. ret = true;
  72. #endif
  73. return ret;
  74. }
  75. /*! ********************************************************
  76. * @name Cmt2300_GoSleep
  77. * @desc Entry SLEEP mode.
  78. * @return true or false
  79. * *********************************************************/
  80. bool Cmt2300_GoSleep(void)
  81. {
  82. Cmt2300_WriteReg(CMT2300_CUS_MODE_CTL, CMT2300_GO_SLEEP);
  83. return Cmt2300_WaitChipStatus(CMT2300_STA_SLEEP);
  84. }
  85. /*! ********************************************************
  86. * @name Cmt2300_GoStby
  87. * @desc Entry Sleep mode.
  88. * @return true or false
  89. * *********************************************************/
  90. bool Cmt2300_GoStby(void)
  91. {
  92. Cmt2300_WriteReg(CMT2300_CUS_MODE_CTL, CMT2300_GO_STBY);
  93. return Cmt2300_WaitChipStatus(CMT2300_STA_STBY);
  94. }
  95. /*! ********************************************************
  96. * @name Cmt2300_GoTFS
  97. * @desc Entry TFS mode.
  98. * @return true or false
  99. * *********************************************************/
  100. bool Cmt2300_GoTFS(void)
  101. {
  102. Cmt2300_WriteReg(CMT2300_CUS_MODE_CTL, CMT2300_GO_TFS);
  103. return Cmt2300_WaitChipStatus(CMT2300_STA_TFS);
  104. }
  105. /*! ********************************************************
  106. * @name Cmt2300_GoRFS
  107. * @desc Entry RFS mode.
  108. * @return true or false
  109. * *********************************************************/
  110. bool Cmt2300_GoRFS(void)
  111. {
  112. Cmt2300_WriteReg(CMT2300_CUS_MODE_CTL, CMT2300_GO_RFS);
  113. return Cmt2300_WaitChipStatus(CMT2300_STA_RFS);
  114. }
  115. /*! ********************************************************
  116. * @name Cmt2300_GoTx
  117. * @desc Entry Tx mode.
  118. * @return true or false
  119. * *********************************************************/
  120. bool Cmt2300_GoTx(void)
  121. {
  122. Cmt2300_WriteReg(CMT2300_CUS_MODE_CTL, CMT2300_GO_TX);
  123. return Cmt2300_WaitChipStatus(CMT2300_STA_TX);
  124. }
  125. /*! ********************************************************
  126. * @name Cmt2300_GoRx
  127. * @desc Entry Rx mode.
  128. * @return true or false
  129. * *********************************************************/
  130. bool Cmt2300_GoRx(void)
  131. {
  132. Cmt2300_WriteReg(CMT2300_CUS_MODE_CTL, CMT2300_GO_RX);
  133. return Cmt2300_WaitChipStatus(CMT2300_STA_RX);
  134. }
  135. /*! ********************************************************
  136. * @name Cmt2300_ConfigGpio
  137. * @desc Config GPIO pins mode.
  138. * @param nGpioSel: GPIO1_SEL | GPIO2_SEL | GPIO3_SEL | GPIO4_SEL
  139. * GPIO1_SEL:
  140. * CMT2300_GPIO1_SEL_DOUT/DIN
  141. * CMT2300_GPIO1_SEL_INT1
  142. * CMT2300_GPIO1_SEL_INT2
  143. * CMT2300_GPIO1_SEL_DCLK
  144. *
  145. * GPIO2_SEL:
  146. * CMT2300_GPIO2_SEL_INT1
  147. * CMT2300_GPIO2_SEL_INT2
  148. * CMT2300_GPIO2_SEL_DOUT/DIN
  149. * CMT2300_GPIO2_SEL_DCLK
  150. *
  151. * GPIO3_SEL:
  152. * CMT2300_GPIO3_SEL_CLKO
  153. * CMT2300_GPIO3_SEL_DOUT/DIN
  154. * CMT2300_GPIO3_SEL_INT2
  155. * CMT2300_GPIO3_SEL_DCLK
  156. *
  157. * GPIO4_SEL:
  158. * CMT2300_GPIO4_SEL_RSTIN
  159. * CMT2300_GPIO4_SEL_INT1
  160. * CMT2300_GPIO4_SEL_DOUT
  161. * CMT2300_GPIO4_SEL_DCLK
  162. * *********************************************************/
  163. void Cmt2300_ConfigGpio(uint8_t nGpioSel)
  164. {
  165. Cmt2300_WriteReg(CMT2300_CUS_IO_SEL, nGpioSel);
  166. }
  167. /*! ********************************************************
  168. * @name Cmt2300_ConfigInterrupt
  169. * @desc Config interrupt on INT1 and INT2.
  170. * @param nInt1Sel, nInt2Sel
  171. * CMT2300_INT_SEL_RX_ACTIVE
  172. * CMT2300_INT_SEL_TX_ACTIVE
  173. * CMT2300_INT_SEL_RSSI_VLD
  174. * CMT2300_INT_SEL_PREAM_OK
  175. * CMT2300_INT_SEL_SYNC_OK
  176. * CMT2300_INT_SEL_NODE_OK
  177. * CMT2300_INT_SEL_CRC_OK
  178. * CMT2300_INT_SEL_PKT_OK
  179. * CMT2300_INT_SEL_SL_TMO
  180. * CMT2300_INT_SEL_RX_TMO
  181. * CMT2300_INT_SEL_TX_DONE
  182. * CMT2300_INT_SEL_RX_FIFO_NMTY
  183. * CMT2300_INT_SEL_RX_FIFO_TH
  184. * CMT2300_INT_SEL_RX_FIFO_FULL
  185. * CMT2300_INT_SEL_RX_FIFO_WBYTE
  186. * CMT2300_INT_SEL_RX_FIFO_OVF
  187. * CMT2300_INT_SEL_TX_FIFO_NMTY
  188. * CMT2300_INT_SEL_TX_FIFO_TH
  189. * CMT2300_INT_SEL_TX_FIFO_FULL
  190. * CMT2300_INT_SEL_STATE_IS_STBY
  191. * CMT2300_INT_SEL_STATE_IS_FS
  192. * CMT2300_INT_SEL_STATE_IS_RX
  193. * CMT2300_INT_SEL_STATE_IS_TX
  194. * CMT2300_INT_SEL_LED
  195. * CMT2300_INT_SEL_TRX_ACTIVE
  196. * CMT2300_INT_SEL_PKT_DONE
  197. * *********************************************************/
  198. void Cmt2300_ConfigInterrupt(uint8_t nInt1Sel, uint8_t nInt2Sel)
  199. {
  200. nInt1Sel &= CMT2300_MASK_INT1_SEL;
  201. nInt1Sel |= (~CMT2300_MASK_INT1_SEL) & Cmt2300_ReadReg(CMT2300_CUS_INT1_CTL);
  202. Cmt2300_WriteReg(CMT2300_CUS_INT1_CTL, nInt1Sel);
  203. nInt2Sel &= CMT2300_MASK_INT2_SEL;
  204. nInt2Sel |= (~CMT2300_MASK_INT2_SEL) & Cmt2300_ReadReg(CMT2300_CUS_INT2_CTL);
  205. Cmt2300_WriteReg(CMT2300_CUS_INT2_CTL, nInt2Sel);
  206. }
  207. /*! ********************************************************
  208. * @name Cmt2300_SetInterruptPolar
  209. * @desc Set the polarity of the interrupt.
  210. * @param bEnable(true): active-high (default)
  211. * bEnable(false): active-low
  212. * *********************************************************/
  213. void Cmt2300_SetInterruptPolar(bool bActiveHigh)
  214. {
  215. uint8_t tmp = Cmt2300_ReadReg(CMT2300_CUS_INT1_CTL);
  216. if(bActiveHigh)
  217. tmp &= ~CMT2300_MASK_INT_POLAR;
  218. else
  219. tmp |= CMT2300_MASK_INT_POLAR;
  220. Cmt2300_WriteReg(CMT2300_CUS_INT1_CTL, tmp);
  221. }
  222. /*! ********************************************************
  223. * @name Cmt2300_SetFifoThreshold
  224. * @desc Set FIFO threshold.
  225. * @param nFifoThreshold
  226. * *********************************************************/
  227. void Cmt2300_SetFifoThreshold(uint8_t nFifoThreshold)
  228. {
  229. uint8_t tmp = Cmt2300_ReadReg(CMT2300_CUS_PKT29);
  230. tmp &= ~CMT2300_MASK_FIFO_TH;
  231. tmp |= nFifoThreshold & CMT2300_MASK_FIFO_TH;
  232. Cmt2300_WriteReg(CMT2300_CUS_PKT29, tmp);
  233. }
  234. /*! ********************************************************
  235. * @name Cmt2300_EnableAntennaSwitch
  236. * @desc Enable antenna switch, output TX_ACTIVE/RX_ACTIVE
  237. * via GPIO1/GPIO2.
  238. * @param nMode
  239. * 0: RF_SWT1_EN=1, RF_SWT2_EN=0
  240. * GPIO1: RX_ACTIVE, GPIO2: TX_ACTIVE
  241. * 1: RF_SWT1_EN=0, RF_SWT2_EN=1
  242. * GPIO1: RX_ACTIVE, GPIO2: ~RX_ACTIVE
  243. * *********************************************************/
  244. void Cmt2300_EnableAntennaSwitch(uint8_t nMode)
  245. {
  246. uint8_t tmp = Cmt2300_ReadReg(CMT2300_CUS_INT1_CTL);
  247. if(0 == nMode) {
  248. tmp |= CMT2300_MASK_RF_SWT1_EN;
  249. tmp &= ~CMT2300_MASK_RF_SWT2_EN;
  250. }
  251. else if(1 == nMode) {
  252. tmp &= ~CMT2300_MASK_RF_SWT1_EN;
  253. tmp |= CMT2300_MASK_RF_SWT2_EN;
  254. }
  255. Cmt2300_WriteReg(CMT2300_CUS_INT1_CTL, tmp);
  256. }
  257. /*! ********************************************************
  258. * @name Cmt2300_EnableInterrupt
  259. * @desc Enable interrupt.
  260. * @param nEnable
  261. * CMT2300_MASK_SL_TMO_EN |
  262. * CMT2300_MASK_RX_TMO_EN |
  263. * CMT2300_MASK_TX_DONE_EN |
  264. * CMT2300_MASK_PREAM_OK_EN |
  265. * CMT2300_MASK_SYNC_OK_EN |
  266. * CMT2300_MASK_NODE_OK_EN |
  267. * CMT2300_MASK_CRC_OK_EN |
  268. * CMT2300_MASK_PKT_DONE_EN
  269. * *********************************************************/
  270. void Cmt2300_EnableInterrupt(uint8_t nEnable)
  271. {
  272. Cmt2300_WriteReg(CMT2300_CUS_INT_EN, nEnable);
  273. }
  274. /*! ********************************************************
  275. * @name Cmt2300_EnableRxFifoAutoClear
  276. * @desc Auto clear Rx FIFO before entry Rx mode.
  277. * @param bEnable(true): Enable it(default)
  278. * bEnable(false): Disable it
  279. * *********************************************************/
  280. void Cmt2300_EnableRxFifoAutoClear(bool bEnable)
  281. {
  282. uint8_t tmp = Cmt2300_ReadReg(CMT2300_CUS_FIFO_CTL);
  283. if(bEnable)
  284. tmp &= ~CMT2300_MASK_FIFO_AUTO_CLR_DIS;
  285. else
  286. tmp |= CMT2300_MASK_FIFO_AUTO_CLR_DIS;
  287. Cmt2300_WriteReg(CMT2300_CUS_FIFO_CTL, tmp);
  288. }
  289. /*! ********************************************************
  290. * @name Cmt2300_EnableFifoMerge
  291. * @desc Enable FIFO merge.
  292. * @param bEnable(true): use a single 64-byte FIFO for either Tx or Rx
  293. * bEnable(false): use a 32-byte FIFO for Tx and another 32-byte FIFO for Rx(default)
  294. * *********************************************************/
  295. void Cmt2300_EnableFifoMerge(bool bEnable)
  296. {
  297. uint8_t tmp = Cmt2300_ReadReg(CMT2300_CUS_FIFO_CTL);
  298. if(bEnable)
  299. tmp |= CMT2300_MASK_FIFO_MERGE_EN;
  300. else
  301. tmp &= ~CMT2300_MASK_FIFO_MERGE_EN;
  302. Cmt2300_WriteReg(CMT2300_CUS_FIFO_CTL, tmp);
  303. }
  304. /*! ********************************************************
  305. * @name Cmt2300_EnableReadFifo
  306. * @desc Enable SPI to read the FIFO.
  307. * *********************************************************/
  308. void Cmt2300_EnableReadFifo(void)
  309. {
  310. uint8_t tmp = Cmt2300_ReadReg(CMT2300_CUS_FIFO_CTL);
  311. tmp &= ~CMT2300_MASK_SPI_FIFO_RD_WR_SEL;
  312. tmp &= ~CMT2300_MASK_FIFO_RX_TX_SEL;
  313. Cmt2300_WriteReg(CMT2300_CUS_FIFO_CTL, tmp);
  314. }
  315. /*! ********************************************************
  316. * @name Cmt2300_EnableWriteFifo
  317. * @desc Enable SPI to write the FIFO.
  318. * *********************************************************/
  319. void Cmt2300_EnableWriteFifo(void)
  320. {
  321. uint8_t tmp = Cmt2300_ReadReg(CMT2300_CUS_FIFO_CTL);
  322. tmp |= CMT2300_MASK_SPI_FIFO_RD_WR_SEL;
  323. tmp |= CMT2300_MASK_FIFO_RX_TX_SEL;
  324. Cmt2300_WriteReg(CMT2300_CUS_FIFO_CTL, tmp);
  325. }
  326. /*! ********************************************************
  327. * @name Cmt2300_RestoreFifo
  328. * @desc Restore the FIFO.
  329. * *********************************************************/
  330. void Cmt2300_RestoreFifo(void)
  331. {
  332. Cmt2300_WriteReg(CMT2300_CUS_FIFO_CLR, CMT2300_MASK_FIFO_RESTORE);
  333. }
  334. /*! ********************************************************
  335. * @name Cmt2300_ClearFifo
  336. * @desc Clear the Tx FIFO and Rx FIFO.
  337. * @return FIFO flags
  338. * CMT2300_MASK_RX_FIFO_FULL_FLG |
  339. * CMT2300_MASK_RX_FIFO_NMTY_FLG |
  340. * CMT2300_MASK_RX_FIFO_TH_FLG |
  341. * CMT2300_MASK_RX_FIFO_OVF_FLG |
  342. * CMT2300_MASK_TX_FIFO_FULL_FLG |
  343. * CMT2300_MASK_TX_FIFO_NMTY_FLG |
  344. * CMT2300_MASK_TX_FIFO_TH_FLG
  345. * *********************************************************/
  346. uint8_t Cmt2300_ClearFifo(void)
  347. {
  348. uint8_t tmp = Cmt2300_ReadReg(CMT2300_CUS_FIFO_FLAG);
  349. Cmt2300_WriteReg(CMT2300_CUS_FIFO_CLR, CMT2300_MASK_FIFO_CLR_RX | CMT2300_MASK_FIFO_CLR_TX);
  350. return tmp;
  351. }
  352. /*! ********************************************************
  353. * @name Cmt2300_ClearInterruptFlags
  354. * @desc Clear all interrupt flags.
  355. * @return Some interrupt flags
  356. * CMT2300_MASK_SL_TMO_EN |
  357. * CMT2300_MASK_RX_TMO_EN |
  358. * CMT2300_MASK_TX_DONE_EN |
  359. * CMT2300_MASK_PREAM_OK_FLG |
  360. * CMT2300_MASK_SYNC_OK_FLG |
  361. * CMT2300_MASK_NODE_OK_FLG |
  362. * CMT2300_MASK_CRC_OK_FLG |
  363. * CMT2300_MASK_PKT_OK_FLG
  364. * *********************************************************/
  365. uint8_t Cmt2300_ClearInterruptFlags(void)
  366. {
  367. uint8_t nFlag1, nFlag2;
  368. uint8_t nClr1 = 0;
  369. uint8_t nClr2 = 0;
  370. uint8_t nRet = 0;
  371. uint8_t nIntPolar;
  372. nIntPolar = Cmt2300_ReadReg(CMT2300_CUS_INT1_CTL);
  373. nIntPolar = (nIntPolar & CMT2300_MASK_INT_POLAR) ?1 :0;
  374. nFlag1 = Cmt2300_ReadReg(CMT2300_CUS_INT_FLAG);
  375. nFlag2 = Cmt2300_ReadReg(CMT2300_CUS_INT_CLR1);
  376. if(nIntPolar) {
  377. /* Interrupt flag active-low */
  378. nFlag1 = ~nFlag1;
  379. nFlag2 = ~nFlag2;
  380. }
  381. if(CMT2300_MASK_LBD_FLG & nFlag1) {
  382. nClr2 |= CMT2300_MASK_LBD_CLR; /* Clear LBD_FLG */
  383. }
  384. if(CMT2300_MASK_COL_ERR_FLG & nFlag1) {
  385. nClr2 |= CMT2300_MASK_PKT_DONE_CLR; /* Clear COL_ERR_FLG by PKT_DONE_CLR */
  386. }
  387. if(CMT2300_MASK_PKT_ERR_FLG & nFlag1) {
  388. nClr2 |= CMT2300_MASK_PKT_DONE_CLR; /* Clear PKT_ERR_FLG by PKT_DONE_CLR */
  389. }
  390. if(CMT2300_MASK_PREAM_OK_FLG & nFlag1) {
  391. nClr2 |= CMT2300_MASK_PREAM_OK_CLR; /* Clear PREAM_OK_FLG */
  392. nRet |= CMT2300_MASK_PREAM_OK_FLG; /* Return PREAM_OK_FLG */
  393. }
  394. if(CMT2300_MASK_SYNC_OK_FLG & nFlag1) {
  395. nClr2 |= CMT2300_MASK_SYNC_OK_CLR; /* Clear SYNC_OK_FLG */
  396. nRet |= CMT2300_MASK_SYNC_OK_FLG; /* Return SYNC_OK_FLG */
  397. }
  398. if(CMT2300_MASK_NODE_OK_FLG & nFlag1) {
  399. nClr2 |= CMT2300_MASK_NODE_OK_CLR; /* Clear NODE_OK_FLG */
  400. nRet |= CMT2300_MASK_NODE_OK_FLG; /* Return NODE_OK_FLG */
  401. }
  402. if(CMT2300_MASK_CRC_OK_FLG & nFlag1) {
  403. nClr2 |= CMT2300_MASK_CRC_OK_CLR; /* Clear CRC_OK_FLG */
  404. nRet |= CMT2300_MASK_CRC_OK_FLG; /* Return CRC_OK_FLG */
  405. }
  406. if(CMT2300_MASK_PKT_OK_FLG & nFlag1) {
  407. nClr2 |= CMT2300_MASK_PKT_DONE_CLR; /* Clear PKT_OK_FLG */
  408. nRet |= CMT2300_MASK_PKT_OK_FLG; /* Return PKT_OK_FLG */
  409. }
  410. if(CMT2300_MASK_SL_TMO_FLG & nFlag2) {
  411. nClr1 |= CMT2300_MASK_SL_TMO_CLR; /* Clear SL_TMO_FLG */
  412. nRet |= CMT2300_MASK_SL_TMO_EN; /* Return SL_TMO_FLG by SL_TMO_EN */
  413. }
  414. if(CMT2300_MASK_RX_TMO_FLG & nFlag2) {
  415. nClr1 |= CMT2300_MASK_RX_TMO_CLR; /* Clear RX_TMO_FLG */
  416. nRet |= CMT2300_MASK_RX_TMO_EN; /* Return RX_TMO_FLG by RX_TMO_EN */
  417. }
  418. if(CMT2300_MASK_TX_DONE_FLG & nFlag2) {
  419. nClr1 |= CMT2300_MASK_TX_DONE_CLR; /* Clear TX_DONE_FLG */
  420. nRet |= CMT2300_MASK_TX_DONE_EN; /* Return TX_DONE_FLG by TX_DONE_EN */
  421. }
  422. Cmt2300_WriteReg(CMT2300_CUS_INT_CLR1, nClr1);
  423. Cmt2300_WriteReg(CMT2300_CUS_INT_CLR2, nClr2);
  424. if(nIntPolar) {
  425. /* Interrupt flag active-low */
  426. nRet = ~nRet;
  427. }
  428. return nRet;
  429. }
  430. /*! ********************************************************
  431. * @name Cmt2300_ConfigTxDin
  432. * @desc Used to select whether to use GPIO1 or GPIO2 or GPIO3
  433. * as DIN in the direct mode. It only takes effect when
  434. * call Cmt2300_EnableTxDin(true) in the direct mode.
  435. * @param nDinSel
  436. * CMT2300_TX_DIN_SEL_GPIO1
  437. * CMT2300_TX_DIN_SEL_GPIO2
  438. * CMT2300_TX_DIN_SEL_GPIO3
  439. * *********************************************************/
  440. void Cmt2300_ConfigTxDin(uint8_t nDinSel)
  441. {
  442. uint8_t tmp = Cmt2300_ReadReg(CMT2300_CUS_FIFO_CTL);
  443. tmp &= ~CMT2300_MASK_TX_DIN_SEL;
  444. tmp |= nDinSel;
  445. Cmt2300_WriteReg(CMT2300_CUS_FIFO_CTL, tmp);
  446. }
  447. /*! ********************************************************
  448. * @name Cmt2300_EnableTxDin
  449. * @desc Used to change GPIO1/GPIO2/GPIO3 between DOUT and DIN.
  450. * @param bEnable(true): used as DIN
  451. * bEnable(false): used as DOUT(default)
  452. * *********************************************************/
  453. void Cmt2300_EnableTxDin(bool bEnable)
  454. {
  455. uint8_t tmp = Cmt2300_ReadReg(CMT2300_CUS_FIFO_CTL);
  456. if(bEnable)
  457. tmp |= CMT2300_MASK_TX_DIN_EN;
  458. else
  459. tmp &= ~CMT2300_MASK_TX_DIN_EN;
  460. Cmt2300_WriteReg(CMT2300_CUS_FIFO_CTL, tmp);
  461. }
  462. /*! ********************************************************
  463. * @name Cmt2300_EnableTxDinInvert
  464. * @desc Used to invert DIN data in direct mode.
  465. * @param bEnable(true): invert DIN
  466. * bEnable(false): not invert DIN(default)
  467. * *********************************************************/
  468. void Cmt2300_EnableTxDinInvert(bool bEnable)
  469. {
  470. uint8_t tmp = Cmt2300_ReadReg(CMT2300_CUS_INT2_CTL);
  471. if(bEnable)
  472. tmp |= CMT2300_MASK_TX_DIN_INV;
  473. else
  474. tmp &= ~CMT2300_MASK_TX_DIN_INV;
  475. Cmt2300_WriteReg(CMT2300_CUS_INT2_CTL, tmp);
  476. }
  477. /*! ********************************************************
  478. * @name Cmt2300_IsExist
  479. * @desc Chip indentify.
  480. * @return true: chip is exist, false: chip not found
  481. * *********************************************************/
  482. bool Cmt2300_IsExist(void)
  483. {
  484. uint8_t back, dat;
  485. back = Cmt2300_ReadReg(CMT2300_CUS_PKT17);
  486. Cmt2300_WriteReg(CMT2300_CUS_PKT17, 0xAA);
  487. dat = Cmt2300_ReadReg(CMT2300_CUS_PKT17);
  488. Cmt2300_WriteReg(CMT2300_CUS_PKT17, back);
  489. if(0xAA==dat)
  490. return true;
  491. else
  492. return false;
  493. }
  494. /*! ********************************************************
  495. * @name Cmt2300_GetRssiCode
  496. * @desc Get RSSI code.
  497. * @return RSSI code
  498. * *********************************************************/
  499. uint8_t Cmt2300_GetRssiCode(void)
  500. {
  501. return Cmt2300_ReadReg(CMT2300_CUS_RSSI_CODE);
  502. }
  503. /*! ********************************************************
  504. * @name Cmt2300_GetRssiDBm
  505. * @desc Get RSSI dBm.
  506. * @return dBm
  507. * *********************************************************/
  508. int Cmt2300_GetRssiDBm(void)
  509. {
  510. return (int)Cmt2300_ReadReg(CMT2300_CUS_RSSI_DBM) - 128;
  511. }
  512. /*! ********************************************************
  513. * @name Cmt2300_SetFrequencyChannel
  514. * @desc This defines up to 255 frequency channel
  515. * for fast frequency hopping operation.
  516. * @param nChann: the frequency channel
  517. * *********************************************************/
  518. void Cmt2300_SetFrequencyChannel(uint8_t nChann)
  519. {
  520. Cmt2300_WriteReg(CMT2300_CUS_FREQ_CHNL, nChann);
  521. }
  522. /*! ********************************************************
  523. * @name Cmt2300_SetFrequencyStep
  524. * @desc This defines the frequency channel step size
  525. * for fast frequency hopping operation.
  526. * One step size is 2.5 kHz.
  527. * @param nOffset: the frequency step
  528. * *********************************************************/
  529. void Cmt2300_SetFrequencyStep(uint8_t nOffset)
  530. {
  531. Cmt2300_WriteReg(CMT2300_CUS_FREQ_OFS, nOffset);
  532. }
  533. /*! ********************************************************
  534. * @name Cmt2300_SetPayloadLength
  535. * @desc Set payload length.
  536. * @param nLength
  537. * *********************************************************/
  538. void Cmt2300_SetPayloadLength(uint16_t nLength)
  539. {
  540. uint8_t tmp = Cmt2300_ReadReg(CMT2300_CUS_PKT14);
  541. tmp &= ~CMT2300_MASK_PAYLOAD_LENG_10_8;
  542. tmp |= (nLength >> 4) & CMT2300_MASK_PAYLOAD_LENG_10_8;
  543. Cmt2300_WriteReg(CMT2300_CUS_PKT14, tmp);
  544. tmp = nLength & CMT2300_MASK_PAYLOAD_LENG_7_0;
  545. Cmt2300_WriteReg(CMT2300_CUS_PKT15, tmp);
  546. }
  547. /*! ********************************************************
  548. * @name Cmt2300_EnableLfosc
  549. * @desc If you need use sleep timer, you should enable LFOSC.
  550. * @param bEnable(true): Enable it(default)
  551. * bEnable(false): Disable it
  552. * *********************************************************/
  553. void Cmt2300_EnableLfosc(bool bEnable)
  554. {
  555. uint8_t tmp = Cmt2300_ReadReg(CMT2300_CUS_SYS2);
  556. if(bEnable) {
  557. tmp |= CMT2300_MASK_LFOSC_RECAL_EN;
  558. tmp |= CMT2300_MASK_LFOSC_CAL1_EN;
  559. tmp |= CMT2300_MASK_LFOSC_CAL2_EN;
  560. }
  561. else {
  562. tmp &= ~CMT2300_MASK_LFOSC_RECAL_EN;
  563. tmp &= ~CMT2300_MASK_LFOSC_CAL1_EN;
  564. tmp &= ~CMT2300_MASK_LFOSC_CAL2_EN;
  565. }
  566. Cmt2300_WriteReg(CMT2300_CUS_SYS2, tmp);
  567. }
  568. /*! ********************************************************
  569. * @name Cmt2300_EnableLfoscOutput
  570. * @desc LFOSC clock is output via GPIO3.
  571. * @param bEnable(true): Enable it
  572. * bEnable(false): Disable it(default)
  573. * *********************************************************/
  574. void Cmt2300_EnableLfoscOutput(bool bEnable)
  575. {
  576. uint8_t tmp = Cmt2300_ReadReg(CMT2300_CUS_INT2_CTL);
  577. if(bEnable)
  578. tmp |= CMT2300_MASK_LFOSC_OUT_EN;
  579. else
  580. tmp &= ~CMT2300_MASK_LFOSC_OUT_EN;
  581. Cmt2300_WriteReg(CMT2300_CUS_INT2_CTL, tmp);
  582. }
  583. /*! ********************************************************
  584. * @name Cmt2300_SetCrcSeed
  585. * *********************************************************/
  586. void Cmt2300_SetCrcSeed(uint16_t seed)
  587. {
  588. Cmt2300_WriteReg(CMT2300_CUS_PKT22, seed);
  589. Cmt2300_WriteReg(CMT2300_CUS_PKT23, seed>>8);
  590. }
  591. /*! ********************************************************
  592. * @name Cmt2300_SetCrcSeed
  593. * @param type(true): VARIABLE PACKET 动态包长
  594. * type(false): FIXED PACKET 固定包长
  595. * *********************************************************/
  596. void Cmt2300_SetPacketType(bool type)
  597. {
  598. cmtCusPkt14_tu cmtCusPkt14;
  599. cmtCusPkt14.value = Cmt2300_ReadReg(CMT2300_CUS_PKT14);
  600. cmtCusPkt14.bits.pkt_type = type;
  601. Cmt2300_WriteReg(CMT2300_CUS_PKT14, cmtCusPkt14.value);
  602. }
  603. /*! ********************************************************
  604. * @name Cmt2300_SetCrcSeed
  605. * @param @rfBandWidth_te
  606. * *********************************************************/
  607. void Cmt2300_SetRssiDetMode(uint8_t mode)
  608. {
  609. cmtCusSys11_tu cmtCusSys11;
  610. cmtCusSys11.value = Cmt2300_ReadReg(CMT2300_CUS_SYS11);
  611. cmtCusSys11.bits.rssi_det_sel = mode;
  612. Cmt2300_WriteReg(CMT2300_CUS_SYS11, cmtCusSys11.value);
  613. }
  614. /*! ********************************************************
  615. * @name Cmt2300_SetCrcSeed
  616. * @param bt: @gfskGsnBt_te
  617. * *********************************************************/
  618. void Cmt2300_SetGfskGsnBt(uint8_t bt)
  619. {
  620. cmtCusTx1_tu cmtCusTx1;
  621. cmtCusTx1.value = Cmt2300_ReadReg(CMT2300_CUS_TX1);
  622. cmtCusTx1.bits.gfskGsnBt = bt;
  623. Cmt2300_WriteReg(CMT2300_CUS_TX1, cmtCusTx1.value);
  624. }
  625. /*! ********************************************************
  626. * @name Cmt2300_SetRfBandWidth
  627. * @param bw: @rfBandWidth_te
  628. * *********************************************************/
  629. void Cmt2300_SetRfBandWidth(uint8_t bw)
  630. {
  631. cmtCusRf11_tu cmtCusRf11;
  632. cmtCusRf11.value = Cmt2300_ReadReg(CMT2300_CUS_RF11);
  633. cmtCusRf11.bits.bandWidth = bw;
  634. Cmt2300_WriteReg(CMT2300_CUS_RF11, cmtCusRf11.value);
  635. }
  636. /*! ********************************************************
  637. * @name Cmt2300_SetRxPreamLengSize
  638. * @param unit: @preamLengUnit_te
  639. size:
  640. * *********************************************************/
  641. void Cmt2300_SetRxPreamLengSize(uint8_t unit, uint8_t size)
  642. {
  643. cmtCusPkt1_tu cmtCusPkt1;
  644. cmtCusPkt1.value = Cmt2300_ReadReg(CMT2300_CUS_PKT1);
  645. cmtCusPkt1.bits.pream_leng_unit = unit;
  646. cmtCusPkt1.bits.rx_pream_size = size;
  647. Cmt2300_WriteReg(CMT2300_CUS_PKT1, cmtCusPkt1.value);
  648. }
  649. /*! ********************************************************
  650. * @name Cmt2300_SetSyncWord
  651. * @param
  652. * *********************************************************/
  653. void Cmt2300_SetSyncWord(uint8_t *value, uint8_t len)
  654. {
  655. cmtCusPkt5_tu cmtCusPkt5;
  656. if (len > 8)
  657. {
  658. len = 8;
  659. }
  660. cmtCusPkt5.value = Cmt2300_ReadReg(CMT2300_CUS_PKT5);
  661. cmtCusPkt5.bits.sync_size = len;
  662. Cmt2300_WriteReg(CMT2300_CUS_PKT5, cmtCusPkt5.value);
  663. for (int i = 0; i < len; i++)
  664. {
  665. Cmt2300_WriteReg(CMT2300_CUS_PKT13 - i, *(value + i));
  666. }
  667. }
  668. /*! ********************************************************
  669. * @name Cmt2300_GetPacketLen
  670. pkt_type must is variable
  671. * *********************************************************/
  672. uint16_t Cmt2300_GetPacketLen(void)
  673. {
  674. uint16_t tmp;
  675. cmtCusPkt14_tu cmtCusPkt14;
  676. cmtCusPkt14.value = Cmt2300_ReadReg(CMT2300_CUS_PKT14);
  677. tmp = Cmt2300_ReadReg(CMT2300_CUS_PKT15) | (cmtCusPkt14.bits.payload_leng << 8);
  678. return tmp;
  679. }
  680. /*! ********************************************************
  681. * @name Cmt2300_SetCrc
  682. * *********************************************************/
  683. void Cmt2300_SetCrc(void)
  684. {
  685. cus_pkt21_tu cus_pkt21;
  686. cus_pkt21.value = Cmt2300_ReadReg(CMT2300_CUS_PKT21);
  687. cus_pkt21.bits.crc_en = 1;
  688. cus_pkt21.bits.crc_type = 0;
  689. cus_pkt21.bits.crc_range = 0;
  690. cus_pkt21.bits.crc_bit_inv = 0;
  691. cus_pkt21.bits.crc_byte_swap= 0;
  692. Cmt2300_WriteReg(CMT2300_CUS_PKT21, cus_pkt21.value);
  693. Cmt2300_SetCrcSeed(0x0055);
  694. }
  695. /*! ********************************************************
  696. * @name Cmt2300_Init
  697. * @desc Initialize chip status.
  698. * *********************************************************/
  699. void Cmt2300_Init(void)
  700. {
  701. uint8_t tmp;
  702. Cmt2300_SoftReset();
  703. Cmt2300_DelayMs(20);
  704. Cmt2300_GoStby();
  705. tmp = Cmt2300_ReadReg(CMT2300_CUS_MODE_STA);
  706. tmp |= CMT2300_MASK_CFG_RETAIN; /* Enable CFG_RETAIN */
  707. tmp &= ~CMT2300_MASK_RSTN_IN_EN; /* Disable RSTN_IN */
  708. Cmt2300_WriteReg(CMT2300_CUS_MODE_STA, tmp);
  709. Cmt2300_EnableLfosc(false); /* Diable LFOSC */
  710. Cmt2300_ClearInterruptFlags();
  711. }
  712. /*! ********************************************************
  713. * @name Cmt2300_ConfigRegBank
  714. * @desc Config one register bank.
  715. * *********************************************************/
  716. bool Cmt2300_ConfigRegBank(uint8_t base_addr, const uint8_t bank[], uint8_t len)
  717. {
  718. uint8_t i;
  719. for(i=0; i<len; i++)
  720. Cmt2300_WriteReg(i+base_addr, bank[i]);
  721. return true;
  722. }