CC1101.c 8.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342
  1. #include "CC1101.h"
  2. #include "myRadio_gpio.h"
  3. #define WRITE_BURST 0x40
  4. #define READ_SINGLE 0x80
  5. #define READ_BURST 0xC0
  6. typedef struct
  7. {
  8. uint8_t addr;
  9. uint8_t data;
  10. } registerSetting_t;
  11. #if 0
  12. // Address Config = No address check
  13. // Base Frequency = 432.999817
  14. // CRC Autoflush = false
  15. // CRC Enable = true
  16. // Carrier Frequency = 432.999817
  17. // Channel Number = 0
  18. // Channel Spacing = 199.951172
  19. // Data Format = Normal mode
  20. // Data Rate = 1.19948
  21. // Deviation = 5.157471
  22. // Device Address = 0
  23. // Manchester Enable = false
  24. // Modulated = true
  25. // Modulation Format = 2-FSK
  26. // PA Ramping = false
  27. // Packet Length = 255
  28. // Packet Length Mode = Variable packet length mode. Packet length configured by the first byte after sync word
  29. // Preamble Count = 4
  30. // RX Filter BW = 58.035714
  31. // Sync Word Qualifier Mode = 30/32 sync word bits detected
  32. // TX Power = 10
  33. // Whitening = false
  34. static const registerSetting_t preferredSettings[] =
  35. {
  36. {CCxx0x_IOCFG0, 0x06},
  37. {CCxx0x_FIFOTHR, 0x47},
  38. {CCxx0x_PKTCTRL0, 0x05},
  39. {CCxx0x_FSCTRL1, 0x06},
  40. {CCxx0x_FREQ2, 0x10},
  41. {CCxx0x_FREQ1, 0xA7},
  42. {CCxx0x_FREQ0, 0x62},
  43. {CCxx0x_MDMCFG4, 0xF6},
  44. {CCxx0x_MDMCFG3, 0x83},
  45. {CCxx0x_MDMCFG2, 0x03},
  46. {CCxx0x_DEVIATN, 0x15},
  47. {CCxx0x_MCSM0, 0x18},
  48. {CCxx0x_FOCCFG, 0x16},
  49. {CCxx0x_WORCTRL, 0xFB},
  50. {CCxx0x_FSCAL3, 0xE9},
  51. {CCxx0x_FSCAL2, 0x2A},
  52. {CCxx0x_FSCAL1, 0x00},
  53. {CCxx0x_FSCAL0, 0x1F},
  54. {CCxx0x_TEST2, 0x81},
  55. {CCxx0x_TEST1, 0x35},
  56. {CCxx0x_TEST0, 0x09},
  57. };
  58. #define PA_TABLE \
  59. { \
  60. 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 \
  61. } // 10dBm
  62. #endif
  63. #if 1
  64. // Address Config = No address check
  65. // Base Frequency = 432.999817
  66. // CRC Autoflush = false
  67. // CRC Enable = true
  68. // Carrier Frequency = 432.999817
  69. // Channel Number = 0
  70. // Channel Spacing = 199.951172
  71. // Data Format = Normal mode
  72. // Data Rate = 4.79794
  73. // Deviation = 25.390625
  74. // Device Address = 0
  75. // Manchester Enable = false
  76. // Modulated = true
  77. // Modulation Format = GFSK
  78. // PA Ramping = false
  79. // Packet Length = 255
  80. // Packet Length Mode = Variable packet length mode. Packet length configured by the first byte after sync word
  81. // Preamble Count = 4
  82. // RX Filter BW = 101.562500
  83. // Sync Word Qualifier Mode = 30/32 sync word bits detected
  84. // TX Power = 10
  85. // Whitening = false
  86. static const registerSetting_t preferredSettings[]=
  87. {
  88. {CCxx0x_IOCFG0, 0x06},
  89. {CCxx0x_FIFOTHR, 0x47},
  90. {CCxx0x_PKTCTRL0, 0x05},
  91. {CCxx0x_FSCTRL1, 0x06},
  92. {CCxx0x_FREQ2, 0x10},
  93. {CCxx0x_FREQ1, 0xA7},
  94. {CCxx0x_FREQ0, 0x62},
  95. {CCxx0x_MDMCFG4, 0xC7},
  96. {CCxx0x_MDMCFG3, 0x83},
  97. {CCxx0x_MDMCFG2, 0x13},
  98. {CCxx0x_DEVIATN, 0x40},
  99. {CCxx0x_MCSM0, 0x18},
  100. {CCxx0x_FOCCFG, 0x16},
  101. {CCxx0x_AGCCTRL2, 0x43},
  102. {CCxx0x_WORCTRL, 0xFB},
  103. {CCxx0x_FSCAL3, 0xE9},
  104. {CCxx0x_FSCAL2, 0x2A},
  105. {CCxx0x_FSCAL1, 0x00},
  106. {CCxx0x_FSCAL0, 0x1F},
  107. {CCxx0x_TEST2, 0x81},
  108. {CCxx0x_TEST1, 0x35},
  109. {CCxx0x_TEST0, 0x09},
  110. };
  111. #define PA_TABLE \
  112. { \
  113. 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 \
  114. } // 10dBm
  115. #endif
  116. #if 0
  117. // Address Config = No address check
  118. // Base Frequency = 915.000000
  119. // CRC Autoflush = false
  120. // CRC Enable = true
  121. // Carrier Frequency = 915.000000
  122. // Channel Number = 0
  123. // Channel Spacing = 199.951172
  124. // Data Format = Normal mode
  125. // Data Rate = 4.79794
  126. // Deviation = 25.390625
  127. // Device Address = 0
  128. // Manchester Enable = false
  129. // Modulated = true
  130. // Modulation Format = GFSK
  131. // PA Ramping = false
  132. // Packet Length = 255
  133. // Packet Length Mode = Variable packet length mode. Packet length configured by the first byte after sync word
  134. // Preamble Count = 4
  135. // RX Filter BW = 101.562500
  136. // Sync Word Qualifier Mode = 30/32 sync word bits detected
  137. // TX Power = 10
  138. // Whitening = false
  139. // PA table
  140. #define PA_TABLE {0xc3,0x00,0x00,0x00,0x00,0x00,0x00,0x00}
  141. static const registerSetting_t preferredSettings[]=
  142. {
  143. {CCxx0x_IOCFG0, 0x06},
  144. {CCxx0x_FIFOTHR, 0x47},
  145. {CCxx0x_PKTCTRL0, 0x05},
  146. {CCxx0x_FSCTRL1, 0x06},
  147. {CCxx0x_FREQ2, 0x23},
  148. {CCxx0x_FREQ1, 0x31},
  149. {CCxx0x_FREQ0, 0x3B},
  150. {CCxx0x_MDMCFG4, 0xC7},
  151. {CCxx0x_MDMCFG3, 0x83},
  152. {CCxx0x_MDMCFG2, 0x13},
  153. {CCxx0x_DEVIATN, 0x40},
  154. {CCxx0x_MCSM0, 0x18},
  155. {CCxx0x_FOCCFG, 0x16},
  156. {CCxx0x_AGCCTRL2, 0x43},
  157. {CCxx0x_WORCTRL, 0xFB},
  158. {CCxx0x_FSCAL3, 0xE9},
  159. {CCxx0x_FSCAL2, 0x2A},
  160. {CCxx0x_FSCAL1, 0x00},
  161. {CCxx0x_FSCAL0, 0x1F},
  162. {CCxx0x_TEST2, 0x81},
  163. {CCxx0x_TEST1, 0x35},
  164. {CCxx0x_TEST0, 0x09},
  165. };
  166. #endif
  167. uint8_t paTable_CCxx0x[8] = PA_TABLE;
  168. unsigned char ReadReg(unsigned char addr)
  169. {
  170. unsigned char value;
  171. unsigned char i;
  172. BOARD_SPI_NSS_L();
  173. for (i = 0; i < 100; i++)
  174. ;
  175. addr |= READ_SINGLE;
  176. myRadioSpi_rwByte(addr);
  177. value = myRadioSpi_rwByte(0xff);
  178. BOARD_SPI_NSS_H();
  179. return value;
  180. }
  181. void WriteReg(unsigned char addr, unsigned char value)
  182. {
  183. unsigned char i;
  184. BOARD_SPI_NSS_L();
  185. for (i = 0; i < 100; i++)
  186. ;
  187. addr &= ~READ_SINGLE;
  188. myRadioSpi_rwByte(addr);
  189. myRadioSpi_rwByte(value);
  190. BOARD_SPI_NSS_H();
  191. }
  192. unsigned char ReadStatus(unsigned char addr)
  193. {
  194. unsigned char value;
  195. unsigned char i;
  196. BOARD_SPI_NSS_L();
  197. for (i = 0; i < 100; i++)
  198. ;
  199. addr |= READ_BURST;
  200. myRadioSpi_rwByte(addr);
  201. value = myRadioSpi_rwByte(0xff);
  202. BOARD_SPI_NSS_H();
  203. return value;
  204. }
  205. void ReadBurstReg(unsigned char addr, unsigned char *buffer, unsigned char count)
  206. {
  207. unsigned char i;
  208. BOARD_SPI_NSS_L();
  209. for (i = 0; i < 100; i++)
  210. ;
  211. addr |= READ_BURST;
  212. myRadioSpi_rwByte(addr);
  213. for (i = 0; i < count; i++)
  214. {
  215. buffer[i] = myRadioSpi_rwByte(0xff);
  216. }
  217. BOARD_SPI_NSS_H();
  218. }
  219. void WriteBurstReg(unsigned char addr, unsigned char *buffer, unsigned char count)
  220. {
  221. unsigned char i;
  222. BOARD_SPI_NSS_L();
  223. for (i = 0; i < 100; i++)
  224. ;
  225. addr &= ~READ_SINGLE;
  226. addr |= WRITE_BURST;
  227. myRadioSpi_rwByte(addr);
  228. for (i = 0; i < count; i++)
  229. {
  230. myRadioSpi_rwByte(buffer[i]);
  231. }
  232. BOARD_SPI_NSS_H();
  233. }
  234. void Strobe(unsigned char strobe)
  235. {
  236. unsigned char i;
  237. BOARD_SPI_NSS_L();
  238. for (i = 0; i < 100; i++)
  239. ;
  240. myRadioSpi_rwByte(strobe);
  241. BOARD_SPI_NSS_H();
  242. }
  243. void halRfWriteRfSettings(void)
  244. {
  245. for (uint16_t i = 0; i < sizeof(preferredSettings) / sizeof(registerSetting_t); i++)
  246. {
  247. WriteReg(preferredSettings[i].addr, preferredSettings[i].data);
  248. }
  249. }
  250. void POWER_UP_RESET_CCxx00(void)
  251. {
  252. unsigned int i;
  253. BOARD_SPI_NSS_H();
  254. for (i = 0; i < 10; i++)
  255. ;
  256. BOARD_SPI_NSS_L();
  257. for (i = 0; i < 10; i++)
  258. ;
  259. BOARD_SPI_NSS_H();
  260. for (i = 0; i < 200; i++)
  261. ;
  262. Strobe(CCxx0x_SRES);
  263. for (i = 0; i < 2000; i++)
  264. ;
  265. }
  266. uint8_t value;
  267. void RfSetup(void)
  268. {
  269. POWER_UP_RESET_CCxx00();
  270. halRfWriteRfSettings();
  271. Strobe(CCxx0x_SIDLE);
  272. Strobe(CCxx0x_SFRX);
  273. Strobe(CCxx0x_SFTX);
  274. Strobe(CCxx0x_SCAL);
  275. WriteBurstReg(CCxx0x_PATABLE, paTable_CCxx0x, sizeof(paTable_CCxx0x)); // Write PATABLE
  276. if (ReadReg(preferredSettings[0].addr) != preferredSettings[0].data)
  277. while (1)
  278. ; //¼ì²éSPIÊÇ·ñÕý³£Í¨ÐÅ
  279. }
  280. unsigned char SendPacket(unsigned char *txBuffer, unsigned char length)
  281. {
  282. Strobe(CCxx0x_SIDLE);
  283. Strobe(CCxx0x_SFTX);
  284. WriteBurstReg(CCxx0x_TXFIFO, txBuffer, length);
  285. Strobe(CCxx0x_STX);
  286. return 1;
  287. }
  288. unsigned char RSSI_dec;
  289. unsigned char ReceivePacket(unsigned char *rxBuffer, unsigned char max_length)
  290. {
  291. unsigned char packetLength;
  292. unsigned char status[2];
  293. Strobe(CCxx0x_SIDLE);
  294. packetLength = ReadStatus(CCxx0x_RXBYTES);
  295. if (packetLength & BYTES_IN_RXFIFO)
  296. {
  297. packetLength = ReadReg(CCxx0x_RXFIFO);
  298. if (packetLength < max_length)
  299. {
  300. rxBuffer[0] = packetLength;
  301. ReadBurstReg(CCxx0x_RXFIFO, rxBuffer + 1, packetLength);
  302. ReadBurstReg(CCxx0x_RXFIFO, status, 2);
  303. RSSI_dec = status[RSSI];
  304. Strobe(CCxx0x_SFRX);
  305. return !!(status[LQI] & CRC_OK);
  306. }
  307. else
  308. {
  309. Strobe(CCxx0x_SFRX);
  310. return 0;
  311. }
  312. }
  313. else
  314. {
  315. Strobe(CCxx0x_SFRX);
  316. return 0;
  317. }
  318. }