rf_driver.c 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594
  1. #include "stdint.h"
  2. #include "xinc_reg.h"
  3. #include "math.h"
  4. #include "stdlib.h"
  5. #include "string.h"
  6. #define RF_BASE 0X4002F000
  7. //#define QFN32
  8. #define SSOP16
  9. extern void SER_WRITE(unsigned int regAddr,unsigned int regValue);
  10. extern unsigned int SER_READ(unsigned int regAddr,unsigned int *regValue);
  11. void ble_rccali(void);
  12. // set bit
  13. #define setbit(x,y) ((x) |= (1<<(y)))
  14. #define clrbit(x,y) ((x) &= ~(1<<(y)))
  15. #define SPI_CTL setbit(*(uint32_t volatile*)(0x40000000+0x130),0)
  16. #define AHB_CTL clrbit(*(uint32_t volatile*)(0x40000000+0x130),0)
  17. void wbit(uint16_t reg_addr,int start,int end,char* bit_str);
  18. void set_ch(int ch);
  19. uint16_t fpga_spi_read(uint32_t reg_addr)
  20. {
  21. uint32_t spi_addr = reg_addr/4; // read: MSB is 1
  22. uint32_t value;
  23. //在这里添加spi读接口
  24. SER_READ(spi_addr, &value);
  25. return value;
  26. }
  27. int fpga_spi_write(uint32_t reg_addr, uint32_t reg_val)
  28. {
  29. uint32_t spi_addr = reg_addr/4; //write:MSB is 0
  30. //在这个添加spi写接口
  31. SER_WRITE(spi_addr, reg_val);
  32. return 0;
  33. }
  34. #define reversebit(x,y) (x)^=(1<<(y))
  35. void Dcoc_Calib(uint16_t i,uint16_t q)
  36. {
  37. uint16_t dac_i;
  38. uint16_t dac_q;
  39. uint16_t calib_val;
  40. //求原码,高位取反
  41. reversebit(i,9);
  42. reversebit(q,9);
  43. float I = abs(i - 512);
  44. float Q = abs(q - 512);
  45. float adc_i = I*733/1024;
  46. float adc_q = Q*733/1024;
  47. dac_i = (uint16_t)(adc_i/13.6+0.5);
  48. dac_q = (uint16_t)(adc_q/13.6+0.5);
  49. if(i > 512)
  50. {
  51. dac_i = dac_i | 0x80; //最高位符号1
  52. }
  53. if(q < 512)
  54. {
  55. dac_q = dac_q<<8 | 0x8000; //最高位符号1,Q高16位
  56. }
  57. calib_val = dac_i | dac_q;
  58. fpga_spi_write(0x0098,calib_val);
  59. }
  60. void le_rf_init(void)
  61. {
  62. //b400lite initialization,fvco=2437M,bbpll en
  63. wbit(0x0030,15,8,"11111111");//debug sx 26m en and sx trx ldo en
  64. wbit(0x0010,15,15,"1");// debug_LDO_DEBUG, ADDA_BBVCO cap-ldo enable
  65. wbit(0x0034,15,8,"11111111");//reg sx 26m en and sx trx ldo en
  66. wbit(0x0014,15,15,"1");// reg_LDO_DEBUG, ADDA_BBVCO cap-ldo enable
  67. //wbit(0x0060,15,9,"1111111");//debug sx trx ldo fc
  68. //wbit(0x0064,15,9,"1111111");//reg sx trx ldo fc
  69. wbit(0x0018,15,8,"11011010");//adda bbpll ldo vout default 11101110
  70. wbit(0x016C,15,8,"00001000");//pllvcohllo ldo vout,default 01011001
  71. //wbit(0x0174,13,8,"100100");//sx fb dsm vddres,default 000000
  72. //wbit(0x017C,11,6,"100000");//sx pfd cp vddres,default 000000
  73. wbit(0x0254,12,2,"01101000110");//lobq2lnabias lnaldovout,def01101101101
  74. //wbit(0x0254,3,2,"10");//lna ldovout,default 01
  75. wbit(0x0244,15,12,"1010");//rx and tx ldovout,default 0101
  76. //wbit(0x0254,12,10,"010");//rx lo bias,default 011
  77. wbit(0x024C,15,2,"01011101010100");//bqvcmiobpfabbcc,def101010
  78. //wbit(0x024C,15,10,"010111");//rx bq vcmio and cz,default 101010
  79. wbit(0x02F4,15,6,"0100011010");//tiabq1bias tiavcmoi def0110111010
  80. //wbit(0x02F4,9,6,"1010");//rxtia vcmoi default1010
  81. wbit(0x0008,7,2,"010001");//ismsx and bbpll clkbuf,default 100100
  82. //wbit(0x024C,6,2,"10110");//abbcc default=01000,10001 to 11000
  83. wbit(0x040C,15,5,"10001110000");//sx
  84. //wbit(0x040C,15,15,"1");// SET 0x040C[15]=1,0x040C[9]=1); manual mode
  85. //wbit(0x040C,14,10,"00000");//manual mode, state control
  86. //wbit(0x040C,9,9,"1");// wifi/bt select maual control enable
  87. //wbit(0x040C,8,8,"0");// manual control wifi/bt selection, manual mode,1WF0BT
  88. //wbit(0x040C,7,7,"0");// wifi/bt selection polar for ISM DCOC function
  89. //wbit(0x040C,6,6,"0");// wifi/bt selection polar for ISM GAIN function
  90. //wbit(0x040C,5,5,"0");// wifi/bt selection polar for wifi/bt DAC data function
  91. //wbit(0x040C,14,10,"00011");// set state to WF_SX_CAL
  92. wbit(0x0068,15,13,"011");// debug_afcen,ISM_SX_AFC dsm_RESETN
  93. //wbit(0x0068,14,14,"1");// debug_DA_ISM_SX_AFC_RESETN
  94. wbit(0x006C,15,13,"011");// reg_afcen,ISM_SX_AFC dsm_RESETN
  95. //wbit(0x006C,14,14,"1");// reg_DA_ISM_SX_AFC_RESETN
  96. //wbit(0x0068,13,13,"1");// debug_DA_ISM_SX_dsm_RESETN
  97. //wbit(0x006C,13,13,"1");// reg_DA_ISM_SX_dsm_RESETN
  98. //wbit(0x01A4,6,5,"11");// BT_RG_ISM_SX_AFC_DELAY_CHARGING,default10
  99. wbit(0x01A4,15,5,"00000010011");// BT_RG_ISM_SX_AFC_DELAY_CHARGING,default10
  100. // wbit(0x01A4,10,5,"010011");// BT_RG_ISM_SX_AFC_DELAY_CHARGING,default10
  101. wbit(0x01B4,15,15,"0");// BT_RG_ISM_SX_ATC_EN
  102. wbit(0x0194,7,5,"111");// kvco def010
  103. wbit(0x018C,13,11,"000");// vcobiasctat def001
  104. //wbit(0x01A4,15,11,"00000");// icp
  105. wbit(0x017C,5,1,"00101");// icpoff
  106. wbit(0x0184,15,3,"0101000111011");// sxlpf r2c1c2c3
  107. //wbit(0x015C,15,7,"100110000");// BT_RG_ISM_CAL_SX_DIVN,2437M
  108. //wbit(0x015C,6,3,"1010");//BT_RG_ISM_CAL_SX_DIVFRACH
  109. //wbit(0x0164,15,0,"0000000000000000");// BT_RG_ISM_CAL_SX_DIVFRACL
  110. wbit(0x0304,11,10,"00"); //BT_RG_WB_SX_VCO_LDO1P5_IBC default 10,min00
  111. wbit(0x01AC,11,3,"111000101");// pkdet dealy aacautoen pbrefbias,def001
  112. //wbit(0x01AC,11,10,"11");// pkdet dealy,11max,default00
  113. //wbit(0x01AC,8,6,"000");// pkdet pdbias
  114. //wbit(0x01AC,5,3,"011");// pkdet refbias
  115. //wbit(0x015C,15,7,"100101100"); //2402
  116. //wbit(0x015C,6,3,"0100");
  117. //wbit(0x0068,15,15,"1");// debug_DA_ISM_SX_AFC_STARTL2H
  118. //wbit(0x006C,15,15,"0");// reg_DA_ISM_SX_AFC_STARTL2H
  119. //wbit(0x006C,15,15,"1");// reg_DA_ISM_SX_AFC_STARTL2H,from 0to1 start AFC
  120. wbit(0x001C,15,8,"11101011");// debug BBPLL
  121. //wbit(0x001C,15,15,"1");// debug BBPLL reset ,low reset
  122. //wbit(0x001C,14,14,"1");// Enable for BBPLL1,high enable,also control ref clock
  123. //wbit(0x001C,13,13,"1");// debug_DA_BBPLL1_EN
  124. //wbit(0x001C,11,11,"1");// Enable for 64M clk output to digital module
  125. //wbit(0x001C,9,9,"1");// Enable for 24M clk output to digital module
  126. //wbit(0x001C,8,8,"1");// Enable for 104M clk output to digital module
  127. //wbit(0x0020,15,8,"11101011");// reg BBPLL
  128. //wbit(0x0020,15,15,"1");// reg BBPLL reset ,low reset
  129. //wbit(0x0020,14,14,"1");// Enable for BBPLL1,high enable,also control ref clock
  130. //wbit(0x0020,13,13,"1");// debug_DA_BBPLL1_EN
  131. //wbit(0x0020,11,11,"1");// Enable for 64M clk output to digital module
  132. //wbit(0x0020,9,9,"1");// Enable for 24M clk output to digital module
  133. //wbit(0x0020,8,8,"1");// Enable for 104M clk output to digital module
  134. wbit(0x0024,9,4,"000110"); //default 001100, div12,32m 000110,div6
  135. wbit(0x002C,15,13,"000"); //default 001,bbpll vddres
  136. //wbit(0x03E4,7,7,"0");// En bbpll test
  137. wbit(0x03D4,13,3,"01101011111");// reserved0
  138. //wbit(0x03D4,13,11,"011");// vdd64m res
  139. //wbit(0x03D4,10,9,"01");// bbpll dacclk buf driver
  140. //wbit(0x07D4,15,15,"1");// debug_DA_ISM_RX_GLNA
  141. //wbit(0x07D4,14,14,"1");//debug_DA_ISM_RX_ABB_GC_BQ
  142. //LILIN
  143. #if 1
  144. wbit(0x06D0,15,13,"100");// lna gain map0
  145. wbit(0x06D4,15,13,"100");// lna gain map1
  146. wbit(0x06D8,15,13,"100");// lna gain map2
  147. wbit(0x06DC,15,13,"100");// lna gain map3
  148. wbit(0x06E0,15,13,"100");// lna gain map4
  149. wbit(0x06E4,15,13,"101");// lna gain map5
  150. wbit(0x06E8,15,13,"110");// lna gain map6
  151. wbit(0x06EC,15,13,"111");// lna gain map7
  152. wbit(0x06F0,15,10,"001100");// rxabb gain map0
  153. wbit(0x06F4,15,10,"001100");// rxabb gain map1
  154. wbit(0x06F8,15,10,"001100");// rxabb gain map2
  155. wbit(0x06FC,15,10,"001100");// rxabb gain map3
  156. wbit(0x0700,15,10,"001100");// rxabb gain map4
  157. wbit(0x0704,15,10,"001100");// rxabb gain map5
  158. wbit(0x0708,15,10,"001100");// rxabb gain map6
  159. wbit(0x070C,15,10,"010000");// rxabb gain map7
  160. wbit(0x0710,15,10,"010100");// rxabb gain map8
  161. wbit(0x0714,15,10,"011000");// rxabb gain map9
  162. wbit(0x0718,15,10,"011100");// rxabb gain map10
  163. wbit(0x071C,15,10,"100000");// rxabb gain map11
  164. wbit(0x0720,15,10,"100100");// rxabb gain map12
  165. wbit(0x0724,15,10,"101000");// rxabb gain map13
  166. wbit(0x0728,15,10,"101100");// rxabb gain map14
  167. wbit(0x072C,15,10,"110000");// rxabb gain map15
  168. // wbit(0x06D0,15,13,"100");// lna gain map0
  169. // wbit(0x06D4,15,13,"100");// lna gain map1
  170. // wbit(0x06D8,15,13,"100");// lna gain map2
  171. // wbit(0x06DC,15,13,"100");// lna gain map3
  172. // wbit(0x06E0,15,13,"100");// lna gain map4
  173. // wbit(0x06E4,15,13,"101");// lna gain map5
  174. // wbit(0x06E8,15,13,"110");// lna gain map6
  175. // wbit(0x06EC,15,13,"111");// lna gain map7
  176. // wbit(0x06F0,15,10,"000100");// rxabb gain map0
  177. // wbit(0x06F4,15,10,"000100");// rxabb gain map1
  178. // wbit(0x06F8,15,10,"000100");// rxabb gain map2
  179. // wbit(0x06FC,15,10,"000100");// rxabb gain map3
  180. // wbit(0x0700,15,10,"000100");// rxabb gain map4
  181. // wbit(0x0704,15,10,"001000");// rxabb gain map5
  182. // wbit(0x0708,15,10,"001100");// rxabb gain map6
  183. // wbit(0x070C,15,10,"010000");// rxabb gain map7
  184. // wbit(0x0710,15,10,"010100");// rxabb gain map8
  185. // wbit(0x0714,15,10,"011000");// rxabb gain map9
  186. // wbit(0x0718,15,10,"011100");// rxabb gain map10
  187. // wbit(0x071C,15,10,"100000");// rxabb gain map11
  188. // wbit(0x0720,15,10,"100100");// rxabb gain map12
  189. // wbit(0x0724,15,10,"101000");// rxabb gain map13
  190. // wbit(0x0728,15,10,"101100");// rxabb gain map14
  191. // wbit(0x072C,15,10,"110000");// rxabb gain map15
  192. #endif
  193. ///
  194. wbit(0x07D0,15,13,"111");// debug_DA_ISM_TX_GC
  195. //wbit(0x07D0,15,15,"1");// debug_DA_ISM_TXDAC_GC
  196. //wbit(0x07D0,14,14,"1");// debug_DA_ISM_TXGM_GC
  197. //wbit(0x07D0,13,13,"1");// debug_DA_ISM_TXMOD_GC
  198. //wbit(0x0038,14,10,"11111");// debug En rx
  199. //wbit(0x0038,9,7,"111");// debug En tx
  200. wbit(0x005C,15,13,"111");// lna gc
  201. wbit(0x005C,12,9,"1100");// rxabb gc
  202. #ifdef QFN32
  203. wbit(0x0054,12,7,"010100");// txgm gc qfn32
  204. #elif defined SSOP16
  205. wbit(0x0054,12,7,"010100");// txgm gc ssop16
  206. #endif
  207. //wbit(0x0054,15,4,"100010000000");// txdac3gm6 gc pacap lowbit3
  208. wbit(0x0214,15,15,"0");// txpacap highbit,default0
  209. wbit(0x0054,6,4,"111");// txpacap lowbit,default111
  210. wbit(0x0294,15,15,"1");// debug ISM ADC enable signal, high enable, Default 0
  211. //wbit(0x0294,14,14,"1");// Enable for WF/BT ADC clk
  212. wbit(0x0298,15,15,"1");// reg ISM ADC enable signal, high enable, Default 0
  213. wbit(0x060C,14,14,"1");// ad adc clk inv,1 inv,default 0
  214. //wbit(0x0298,14,14,"1");// Enable for WF/BT ADC clk
  215. //wbit(0x02B4,11,11,"0");// adc sel ckih,0 work,1 pd
  216. //wbit(0x03D4,8,7,"01");//adcbuf sel,reserved0<8:7>
  217. //wbit(0x03D4,6,5,"11");//rccalbuf sel,reserved0<6:5>
  218. //wbit(0x03D4,4,3,"00");//tia highres,reserved0<4:3>
  219. //wbit(0x0254,6,4,"001");//lna bias,default 011
  220. wbit(0x03DC,15,3,"0011100100100");//lna,reserved2
  221. //wbit(0x03DC,15,12,"1100");//lna input match cap
  222. //wbit(0x02F4,15,13,"010");// rxtia bias default011,min001
  223. //wbit(0x02F4,12,10,"001");// rxabb bq1 bias default011,min001
  224. //wbit(0x0254,9,7,"010");// rxabb bq2 bias default011,min001
  225. //wbit(0x024C,9,9,"0");// default=0, 1 2mif,0 1mif
  226. //wbit(0x024C,8,8,"1");// default=1, 1 1mif,0 -1mif
  227. //wbit(0x024C,7,7,"0");// default=1, 1 lpf,0 complex filter
  228. //wbit(0x03DC,11,9,"011");//lna pcas
  229. //wbit(0x03DC,8,6,"011");//lna ncas
  230. //wbit(0x03DC,5,3,"011");//lna cmcode
  231. //wbit(0x025C,15,15,"1");// debug Powerdown DAC, 1,enable
  232. //wbit(0x025C,14,14,"1");// TX bias enable ,including DAC bias,0:pd 1en
  233. //wbit(0x025C,13,13,"1");// Enable for WF/BT DAC clk
  234. wbit(0x025C,11,11,"1");// A signal resets DAC digital part,0:(def) reset, 1
  235. //wbit(0x0260,15,15,"1");// reg Powerdown DAC, 1,enable
  236. //wbit(0x0260,14,14,"1");// TX bias enable ,including DAC bias,0:pd 1en
  237. //wbit(0x0260,13,13,"1");// Enable for WF/BT DAC clk
  238. wbit(0x0260,11,11,"1");// A signal resets DAC digital part,0:(def) reset, 1
  239. wbit(0x0284,14,14,"1");//dac clk inv,default 0,1 clk inv
  240. //wbit(0x03D8,15,15,"1");//bbpll ldo en,reserved1<15>
  241. //soc mode add it
  242. //wbit(0x03D8,13,13,"1");//adcdac clk div2 en,default 16M
  243. wbit(0x03D8,15,0,"0010000011100000");//reserved1
  244. wbit(0x0054,15,13,"011");// txdac gc
  245. wbit(0x020C,15,12,"0010");// txgm rc1 default 0110,111 maxres,000 minres,b12 nouse
  246. wbit(0x021C,15,10,"011000");// txgm gmop ibc
  247. //wbit(0x021C,15,13,"000");// txgm ibc,wf 100 40u,bt 011 35u
  248. //wbit(0x021C,12,10,"000");// txgmop ibc,wf 100 20u,bt 000 10u
  249. wbit(0x0224,15,4,"100111111111");// txgm mc4 cc1 2 rc2 3 cc2 3
  250. //wbit(0x0224,15,12,"1001");// txgm mc,1111 max
  251. //wbit(0x0224,9,7,"111");// tx gm rc2,16m 111,64m 011
  252. //wbit(0x0224,6,4,"111");// tx gm cc2,16m 111,64m 011
  253. //wbit(0x022C,10,5,"111000");// txlocm txcascm def010 010
  254. //wbit(0x07D8,14,13,"11");//debug dcoc en
  255. //en 48M
  256. //wbit(0x0020,15,8,"11101011");// reg BBPLL
  257. //wbit(0x03D8,15,15,"1");//bbpll ldo en,reserved1<15>
  258. //pd 48M
  259. //wbit(0x0020,15,8,"00000000");// reg BBPLL,default 000000000
  260. //wbit(0x03D8,15,15,"0");//bbpll ldo en,reserved1<15>,default 0
  261. ble_rccali(); // rc calibration
  262. // wbit(0x0098,15,8,"00011100");//i dcoc dac 新板子
  263. //wbit(0x0098,7,0, "10011101");//q dcoc dac
  264. //Dcoc_Calib_Dcoc_I();
  265. //Dcoc_Calib_Dcoc_Q();
  266. #if 0
  267. wbit(0x03E4,6,3,"1111");// En testipinqpqn test
  268. wbit(0x03E4,15,15,"0");// En ismadc test
  269. wbit(0x03E4,14,14,"1");// En rxabb test
  270. wbit(0x03E4,13,13,"0");// En rssiadc test
  271. wbit(0x03E4,12,12,"0");// En rxtia test
  272. wbit(0x03E4,11,11,"0");// En dac test
  273. wbit(0x03E4,10,10,"0");// En txabb test
  274. #endif
  275. #if 0
  276. //dcoc start
  277. wbit(0x03D8,2,0,"111");//rxtxsx auto en,reserved1
  278. wbit(0x0030,7,0,"11111111");//debug sx 26m en and sx trx ldo en
  279. wbit(0x0034,7,0,"11111111");//reg sx 26m en and sx trx ldo en
  280. wbit(0x015C,15,7,"010010101"); //2395
  281. wbit(0x015C,6,3,"1011");
  282. wbit(0x0038,14,11,"1111");// debug En rx
  283. wbit(0x003C,14,11,"1111");//reg En rx
  284. wbit(0x07D4,15,14,"11");// debug_DA_ISM_RX_GLNA_abb
  285. wbit(0x005C,15,13,"111");// lna gc
  286. wbit(0x005C,12,9,"1100");// rxabb gc
  287. //Calib_Delay();
  288. //ble_rccali(); // rc calibration
  289. //Dcoc_Calib_Dcoc_I();
  290. //Dcoc_Calib_Dcoc_Q();
  291. //fpga_spi_write(0x0098,0xa9c);
  292. // wbit(0x0098,15,8,"00011100");//i dcoc dac 新板子
  293. //wbit(0x0098,7,0, "10011101");//q dcoc dac
  294. Dcoc_Simple_Calib();
  295. wbit(0x03D8,2,0,"000");//rxtxsx auto en,reserved1
  296. wbit(0x0030,7,0,"00000000");//debug sx 26m en and sx trx ldo en
  297. wbit(0x0034,7,0,"00000000");//reg sx 26m en and sx trx ldo en
  298. wbit(0x0038,14,11,"0000");// debug En rx
  299. wbit(0x003C,14,11,"0000");//reg En rx
  300. wbit(0x07D4,15,14,"00");// debug_DA_ISM_RX_GLNA_abb
  301. #endif
  302. }
  303. // The format of the string is binary
  304. void le_set_rf_tx_power(char* bit_str)
  305. {
  306. wbit(0x0054,12,7,bit_str);
  307. }
  308. void wbit(uint16_t reg_addr,int end,int start,char* bit_str)
  309. {
  310. uint16_t reg_val = 0;
  311. char ch = 0;
  312. int i = 0;
  313. if(strlen(bit_str) != (end-start+1))
  314. {
  315. while(1); //error
  316. }
  317. #ifdef APB_REG
  318. reg_val = _reg_read16(RF_BASE+reg_addr);
  319. #else
  320. reg_val = fpga_spi_read(reg_addr);
  321. #endif
  322. for(i=start;i<=end;i++)
  323. {
  324. int bit_idx = i-start; //index of bit string
  325. ch = bit_str[(end-start)-bit_idx] - '0';
  326. if(ch==1)
  327. {
  328. setbit(reg_val,i);
  329. }
  330. else if(ch==0)
  331. {
  332. clrbit(reg_val,i);
  333. }
  334. }
  335. #ifdef APB_REG
  336. _reg_write16(RF_BASE+reg_addr,reg_val);
  337. #else
  338. fpga_spi_write(reg_addr,reg_val);
  339. #endif
  340. }
  341. void w_regbit(uint32_t reg_addr,int end,int start,char* bit_str)
  342. {
  343. uint16_t reg_val = 0;
  344. char ch = 0;
  345. int i = 0;
  346. if(strlen(bit_str) != (end-start+1))
  347. {
  348. while(1); //error
  349. }
  350. reg_val = reg_read16(RF_BASE+reg_addr);
  351. for(i=start;i<=end;i++)
  352. {
  353. int bit_idx = i-start; //index of bit string
  354. ch = bit_str[(end-start)-bit_idx] - '0';
  355. if(ch==1)
  356. {
  357. setbit(reg_val,i);
  358. }
  359. else if(ch==0)
  360. {
  361. clrbit(reg_val,i);
  362. }
  363. }
  364. reg_write16(RF_BASE+reg_addr,reg_val);
  365. }
  366. //void xc_rf_ldo_on(void)
  367. //{
  368. // AHB_CTL;
  369. // w_regbit(0x0034,15,8,"11111111");
  370. // SPI_CTL;
  371. //}
  372. //void xc_rf_ldo_off(void)
  373. //{
  374. // AHB_CTL;
  375. // w_regbit(0x0034,15,8,"00000000");
  376. // SPI_CTL;
  377. //}
  378. void ldo_on_rx(void)
  379. {
  380. AHB_CTL;
  381. //ldoandsx en
  382. w_regbit(0x0034,15,0,"1111111111111111");//reg sx 26m en and sx trx ldo en
  383. w_regbit(0x0064,15,9,"1111111");//reg sx trx ldo fc
  384. //en trx
  385. // wbit(0x003C,14,10,"11110");// reg En rx
  386. // wbit(0x003C,9,7,"111");// reg En tx
  387. w_regbit(0x003C,14,7,"11110000");// reg En rx
  388. //en adc
  389. // wbit(0x0298,15,15,"1");// reg ISM ADC enable signal, high enable, Default 0
  390. // wbit(0x0298,14,14,"1");// Enable for WF/BT ADC clk
  391. w_regbit(0x0298,15,14,"11");// reg ISM ADC enable signal, high enable, Default 0
  392. //en dac
  393. // wbit(0x0260,15,15,"1");// reg Powerdown DAC, 1,enable
  394. // wbit(0x0260,14,14,"1");// TX bias enable ,including DAC bias,0:pd 1en
  395. // wbit(0x0260,13,13,"1");// Enable for WF/BT DAC clk
  396. w_regbit(0x0260,15,13,"111");
  397. w_regbit(0x0260,11,11,"1");// A signal resets DAC digital part,0:(def) reset, 1
  398. SPI_CTL;
  399. }
  400. void ldo_on_tx(void)
  401. {
  402. AHB_CTL;
  403. //ldoandsx en
  404. w_regbit(0x0034,15,0,"1111111111111111");//reg sx 26m en and sx trx ldo en
  405. w_regbit(0x0064,15,9,"1111111");//reg sx trx ldo fc
  406. //en trx
  407. // wbit(0x003C,14,10,"11110");// reg En rx
  408. // wbit(0x003C,9,7,"111");// reg En tx
  409. w_regbit(0x003C,14,7,"00000111");// reg En rx
  410. //en adc
  411. // wbit(0x0298,15,15,"1");// reg ISM ADC enable signal, high enable, Default 0
  412. // wbit(0x0298,14,14,"1");// Enable for WF/BT ADC clk
  413. w_regbit(0x0298,15,14,"11");// reg ISM ADC enable signal, high enable, Default 0
  414. //en dac
  415. // wbit(0x0260,15,15,"1");// reg Powerdown DAC, 1,enable
  416. // wbit(0x0260,14,14,"1");// TX bias enable ,including DAC bias,0:pd 1en
  417. // wbit(0x0260,13,13,"1");// Enable for WF/BT DAC clk
  418. w_regbit(0x0260,15,13,"111");
  419. w_regbit(0x0260,11,11,"1");// A signal resets DAC digital part,0:(def) reset, 1
  420. SPI_CTL;
  421. }
  422. void ldo_on(void)
  423. {
  424. AHB_CTL;
  425. //ldoandsx en
  426. w_regbit(0x0034,15,0,"1111111111111111");//reg sx 26m en and sx trx ldo en
  427. w_regbit(0x0064,15,9,"1111111");//reg sx trx ldo fc
  428. //en trx
  429. // wbit(0x003C,14,10,"11110");// reg En rx
  430. // wbit(0x003C,9,7,"111");// reg En tx
  431. w_regbit(0x003C,14,7,"11110111");// reg En rx
  432. //en adc
  433. // wbit(0x0298,15,15,"1");// reg ISM ADC enable signal, high enable, Default 0
  434. // wbit(0x0298,14,14,"1");// Enable for WF/BT ADC clk
  435. w_regbit(0x0298,15,14,"11");// reg ISM ADC enable signal, high enable, Default 0
  436. //en dac
  437. // wbit(0x0260,15,15,"1");// reg Powerdown DAC, 1,enable
  438. // wbit(0x0260,14,14,"1");// TX bias enable ,including DAC bias,0:pd 1en
  439. // wbit(0x0260,13,13,"1");// Enable for WF/BT DAC clk
  440. w_regbit(0x0260,15,13,"111");
  441. w_regbit(0x0260,11,11,"1");// A signal resets DAC digital part,0:(def) reset, 1
  442. SPI_CTL;
  443. }
  444. void ldo_on_debug(void)
  445. {
  446. AHB_CTL;
  447. w_regbit(0x0034,15,8,"11111111");//reg sx 26m en and sx trx ldo en wbit(0x0014,15,15,"1");// reg_LDO_DEBUG, ADDA_BBVCO cap-ldo enable
  448. w_regbit(0x0014,15,15,"1");// reg_LDO_DEBUG, ADDA_BBVCO cap-ldo enable
  449. //w_regbit(0x0298,15,15,"1");// reg ISM ADC enable signal, high enable, Default 0
  450. SPI_CTL;
  451. }
  452. void ldo_off_debug(void)
  453. {
  454. AHB_CTL;
  455. w_regbit(0x0034,15,8,"00000000");//reg sx 26m en and sx trx ldo en
  456. w_regbit(0x0014,15,15,"0");// reg_LDO_DEBUG, ADDA_BBVCO cap-ldo enable
  457. //w_regbit(0x0298,15,15,"0");// reg ISM ADC enable signal, high enable, Default 0
  458. SPI_CTL;
  459. }
  460. void ldo_off(void)
  461. {
  462. AHB_CTL;
  463. //ldoandsx off
  464. w_regbit(0x0034,15,0,"0000000000000000");//reg sx 26m en and sx trx ldo en
  465. w_regbit(0x0064,15,9,"0000000");//reg sx trx ldo fc
  466. //en trx
  467. // wbit(0x003C,14,10,"11110");// reg En rx
  468. // wbit(0x003C,9,7,"111");// reg En tx
  469. w_regbit(0x003C,14,7,"00000000");// reg En rx
  470. //en adc
  471. // wbit(0x0298,15,15,"1");// reg ISM ADC enable signal, high enable, Default 0
  472. // wbit(0x0298,14,14,"1");// Enable for WF/BT ADC clk
  473. w_regbit(0x0298,15,14,"00");// reg ISM ADC enable signal, high enable, Default 0
  474. //en dac
  475. // wbit(0x0260,15,15,"1");// reg Powerdown DAC, 1,enable
  476. // wbit(0x0260,14,14,"1");// TX bias enable ,including DAC bias,0:pd 1en
  477. // wbit(0x0260,13,13,"1");// Enable for WF/BT DAC clk
  478. w_regbit(0x0260,15,13,"000");
  479. w_regbit(0x0260,11,11,"0");// A signal resets DAC digital part,0:(def) reset, 1
  480. SPI_CTL;
  481. }
  482. uint16_t rbit(uint16_t reg_addr)
  483. {
  484. uint16_t reg_val = 0;
  485. #ifdef APB_REG
  486. reg_val = _reg_read16(RF_BASE+reg_addr);
  487. #else
  488. reg_val = fpga_spi_read(reg_addr);
  489. #endif
  490. return reg_val;
  491. }
  492. void ble_rccali(void)
  493. {
  494. uint16_t val=0;
  495. //wbit(0x0840,10,8,"101");//RG_RCCAL_CTRL(Rccal 输出码值控制) "101"
  496. wbit(0x0840,10,8,"111");//RG_RCCAL_CTRL(Rccal 输出码值控制) "101"
  497. wbit(0x0840,5,5,"1");//RG_RCCAL_RESETN=1
  498. wbit(0x0840,3,3,"0");//RG_RCCAL_SEL =0
  499. wbit(0x0840,2,2,"1");//RG_RCCAL_EN=1
  500. wbit(0x0840,4,4,"1");//RG_RCCAL_START=1
  501. while(!(rbit(0x0848)&0x8000));//等待AD_RCCAL_FINISH拉高 得出校准值 AD_RCCAL_CTRIM
  502. val=rbit(0x0848);
  503. val=(val&0x7FFF)>>10;// 将校准值AD_RCCAL_CTRIM保存
  504. wbit(0x0840,3,3,"1");//RG_RCCAL_SEL =1
  505. wbit(0x0840,2,2,"0");//RG_RCCAL_EN=0
  506. wbit(0x0840,4,4,"0");//RG_RCCAL_START=0
  507. //将保存的校准值转换成字符串
  508. char temp_buf[5]="";
  509. temp_buf[4]=((val&0x01) ? '1':'0');
  510. temp_buf[3]=((val&0x02) ? '1':'0');
  511. temp_buf[2]=((val&0x04) ? '1':'0');
  512. temp_buf[1]=((val&0x08) ? '1':'0');
  513. temp_buf[0]=((val&0x10) ? '1':'0');
  514. wbit(0x0840,15,11,temp_buf);
  515. }