Tlt_fdc2214.c 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597
  1. #include "Tlt_fdc2214_iic.h"
  2. #include "Tlt_fdc2214.h"
  3. #include "stdlib.h"
  4. #include "math.h"
  5. #include "main.h"
  6. #include "cmsis_os.h"
  7. #include "queue.h"
  8. #include "uType.h"
  9. extern osMessageQueueId_t filterqueue1Handle;
  10. extern osMessageQueueId_t filterqueue2Handle;
  11. /**
  12. ******************************************************************************
  13. * @file Tlt_fdc2214.c
  14. ******************************************************************************
  15. * @attention
  16. * FDC2214的SD引脚,拉高关机,拉低开机。
  17. *
  18. ******************************************************************************
  19. */
  20. uint8_t TCHx_FIN_SEL[4];
  21. double TfREFx[4];
  22. double TFRE[4];
  23. uint32_t Tch0,Tch1,Tch2,Tch3;
  24. /*!
  25. * @brief IIC写FDC2214
  26. * @param Slve_Addr 器件地址
  27. * @param reg 寄存器
  28. * @param data 数据
  29. * @since v1.0
  30. * Sample usage: FDC2214_Write16(FDC2214_Addr, FDC2214_CONFIG, 0xFFFF);
  31. */
  32. void TFDC2214_Write16(uint8_t Slve_Addr, uint8_t reg, uint16_t data)
  33. {
  34. uint8_t dat;
  35. TFDC2214_IIC_Start();
  36. TFDC2214_IIC_Send_Byte(Slve_Addr << 1);
  37. TFDC2214_IIC_Wait_Ack();
  38. TFDC2214_IIC_Send_Byte(reg);
  39. TFDC2214_IIC_Wait_Ack();
  40. dat=(data >> 8);
  41. TFDC2214_IIC_Send_Byte(dat);
  42. TFDC2214_IIC_Wait_Ack();
  43. dat=data & 0xFF;
  44. TFDC2214_IIC_Send_Byte(dat);
  45. TFDC2214_IIC_Wait_Ack();
  46. TFDC2214_IIC_Stop();
  47. }
  48. /*!
  49. * @brief IIC读FDC2214
  50. * @param Slve_Addr 器件地址
  51. * @param reg 寄存器
  52. * @return 寄存器值
  53. * @since v1.0
  54. * Sample usage: FDC2214_Read16(FDC2214_Addr, FDC2214_CONFIG);
  55. */
  56. uint16_t TFDC2214_Read16(uint8_t Slve_Addr, uint8_t reg)
  57. {
  58. uint16_t temp;
  59. TFDC2214_IIC_Start();
  60. TFDC2214_IIC_Send_Byte(Slve_Addr << 1);
  61. TFDC2214_IIC_Wait_Ack();
  62. TFDC2214_IIC_Send_Byte(reg);
  63. TFDC2214_IIC_Wait_Ack();
  64. TFDC2214_IIC_Start();
  65. TFDC2214_IIC_Send_Byte((Slve_Addr << 1) | 0x01);
  66. TFDC2214_IIC_Wait_Ack();
  67. temp = (uint16_t)(TFDC2214_IIC_Read_Byte(1) << 8);
  68. temp |= TFDC2214_IIC_Read_Byte(0);
  69. TFDC2214_IIC_Stop();
  70. return temp;
  71. }
  72. /*!
  73. * @brief 读取FDC2214一个通道的转换值
  74. * @param channel 通道
  75. * @param *data 读取的数据
  76. * @return 0:失败;1:成功
  77. * @since v1.0
  78. * Sample usage: FDC2214_GetChannelData(FDC2214_Channel_0, &CH0_DATA);
  79. */
  80. uint8_t TFDC2214_GetChannelData(TFDC2214_channel_t channel, uint32_t *data)
  81. {
  82. int16_t timeout = 100;
  83. uint8_t dateReg_H;
  84. uint8_t dateReg_L;
  85. uint8_t bitUnreadConv;
  86. uint16_t status;
  87. uint32_t dataRead;
  88. switch(channel)
  89. {
  90. case FDC2214_Channel_0:
  91. dateReg_H = FDC2214_DATA_CH0;
  92. dateReg_L = FDC2214_DATA_LSB_CH0;
  93. bitUnreadConv = 0x0008;
  94. break;
  95. case FDC2214_Channel_1:
  96. dateReg_H = FDC2214_DATA_CH1;
  97. dateReg_L = FDC2214_DATA_LSB_CH1;
  98. bitUnreadConv = 0x0004;
  99. break;
  100. case FDC2214_Channel_2:
  101. dateReg_H = FDC2214_DATA_CH2;
  102. dateReg_L = FDC2214_DATA_LSB_CH2;
  103. bitUnreadConv = 0x0002;
  104. break;
  105. case FDC2214_Channel_3:
  106. dateReg_H = FDC2214_DATA_CH3;
  107. dateReg_L = FDC2214_DATA_LSB_CH3;
  108. bitUnreadConv = 0x0001;
  109. break;
  110. }
  111. status = TFDC2214_Read16(TFDC2214_Addr, FDC2214_STATUS);//读取状态寄存器的值
  112. while(timeout && !(status & bitUnreadConv))//检查是否有未读数据
  113. {
  114. status = TFDC2214_Read16(FDC2214_Addr, FDC2214_STATUS);
  115. timeout--;
  116. }
  117. if(timeout)
  118. {
  119. dataRead = (uint32_t)(TFDC2214_Read16(FDC2214_Addr, dateReg_H) << 16);
  120. dataRead |= TFDC2214_Read16(FDC2214_Addr, dateReg_L);
  121. *data = dataRead;
  122. return 1;
  123. }
  124. else
  125. {
  126. //超时
  127. return 0;
  128. }
  129. }
  130. /*!
  131. * @brief 设置FDC2214一个通道的转换时间,转换时间(tCx)=(CHx_RCOUNT?16) / fREFx。
  132. * @param channel 通道
  133. * @param rcount CHx_RCOUNT
  134. * @since v1.0
  135. * Sample usage: FDC2214_SetRcount(FDC2214_Channel_0, 0x0FFF);
  136. */
  137. void TFDC2214_SetRcount(TFDC2214_channel_t channel, uint16_t rcount)
  138. {
  139. if(rcount <= 0x00FF) return;
  140. switch(channel)
  141. {
  142. case FDC2214_Channel_0:
  143. TFDC2214_Write16(FDC2214_Addr, FDC2214_RCOUNT_CH0, rcount);
  144. break;
  145. case FDC2214_Channel_1:
  146. TFDC2214_Write16(FDC2214_Addr, FDC2214_RCOUNT_CH1, rcount);
  147. break;
  148. case FDC2214_Channel_2:
  149. TFDC2214_Write16(FDC2214_Addr, FDC2214_RCOUNT_CH2, rcount);
  150. break;
  151. case FDC2214_Channel_3:
  152. TFDC2214_Write16(FDC2214_Addr, FDC2214_RCOUNT_CH3, rcount);
  153. break;
  154. }
  155. }
  156. /*!
  157. * @brief 设置FDC2214一个通道的建立时间,使LC传感器可以在通道x开始转换之前稳定下来,建立时间(tSx) = (CHx_SETTLECOUNT?16) ÷ fREFx。
  158. CHx_SETTLECOUNT = 0x00, 0x01时(tSx) = 32 ÷ fREFx。
  159. * @param channel 通道
  160. * @param count CHx_SETTLECOUNT
  161. * @since v1.0
  162. * @note CHx_SETTLECOUNT > Vpk × fREFx × C × π^2 / (32 × IDRIVEX)
  163. * Sample usage: FDC2214_SetSettleCount(FDC2214_Channel_0, 0x00FF);
  164. */
  165. void TFDC2214_SetSettleCount(TFDC2214_channel_t channel, uint16_t count)
  166. {
  167. switch(channel)
  168. {
  169. case FDC2214_Channel_0:
  170. TFDC2214_Write16(FDC2214_Addr, FDC2214_SETTLECOUNT_CH0, count);
  171. break;
  172. case FDC2214_Channel_1:
  173. TFDC2214_Write16(FDC2214_Addr, FDC2214_SETTLECOUNT_CH1, count);
  174. break;
  175. case FDC2214_Channel_2:
  176. TFDC2214_Write16(FDC2214_Addr, FDC2214_SETTLECOUNT_CH2, count);
  177. break;
  178. case FDC2214_Channel_3:
  179. TFDC2214_Write16(FDC2214_Addr, FDC2214_SETTLECOUNT_CH3, count);
  180. break;
  181. }
  182. }
  183. /*!
  184. * @brief 设置FDC2214一个通道的的时钟频率,
  185. 差分传感器配置:
  186. 0x01 -- 传感器频率0.01MHz和8.75MHz
  187. 0x02 -- 传感器频率5MHz和10MHz
  188. 单端传感器配置:
  189. 0x01 -- 传感器频率0.01MHz和10MHz
  190. * @param channel 通道
  191. * @param frequency_select 时钟选择
  192. * @param divider 分频器,fREFx = fCLK / CHx_FREF_DIVIDER,
  193. * @note fREFx is > 4 × fSENSOR(外部LC振荡器频率)
  194. * @since v1.0
  195. * Sample usage: FDC2214_SetChannelClock(FDC2214_Channel_0, 0x01, 0xFF);
  196. */
  197. void TFDC2214_SetChannelClock(TFDC2214_channel_t channel, uint8_t frequency_select, uint16_t divider)
  198. {
  199. uint16_t temp = 0;
  200. temp = (uint16_t)(frequency_select << 12) | (divider & 0x03FF);
  201. TCHx_FIN_SEL[channel] = frequency_select;//记录时钟选择
  202. FDC_PRINTF("Frequency_select : %d \r\n",frequency_select);
  203. TfREFx[channel] = (double)ClockFrequency / divider;//记录时钟频率
  204. switch(channel)
  205. {
  206. case FDC2214_Channel_0:
  207. // DEBUG_PRINTF("CHx_FIN_SEL[0] %d \r\n",CHx_FIN_SEL[0]);
  208. // DEBUG_PRINTF("FREFx[0] : [%f] \r\n",fREFx[0]);
  209. TFDC2214_Write16(FDC2214_Addr, FDC2214_CLOCK_DIVIDERS_CH0, temp);
  210. break;
  211. case FDC2214_Channel_1:
  212. TFDC2214_Write16(FDC2214_Addr, FDC2214_CLOCK_DIVIDERS_CH1, temp);
  213. break;
  214. case FDC2214_Channel_2:
  215. TFDC2214_Write16(FDC2214_Addr, FDC2214_CLOCK_DIVIDERS_CH2, temp);
  216. break;
  217. case FDC2214_Channel_3:
  218. TFDC2214_Write16(FDC2214_Addr, FDC2214_CLOCK_DIVIDERS_CH3, temp);
  219. break;
  220. }
  221. }
  222. /*!
  223. * @brief 配置INTB引脚中断功能
  224. * @param mode 1:开中断;0:关中断
  225. * @since v1.0
  226. * Sample usage: FDC2214_SetDriveCurrent(FDC2214_Channel_0, FDC2214_Drive_Current_0_025);
  227. */
  228. void TFDC2214_SetINTB(uint8_t mode)
  229. {
  230. uint16_t temp = 0;
  231. temp = TFDC2214_Read16(TFDC2214_Addr, TFDC2214_CONFIG);
  232. temp &= 0xFF7F;
  233. if(mode)
  234. temp |= 0x0080;
  235. TFDC2214_Write16(TFDC2214_Addr, TFDC2214_CONFIG, temp);
  236. temp = TFDC2214_Read16(TFDC2214_Addr, TFDC2214_ERROR_CONFIG);
  237. temp &= 0xFFFE;
  238. if(mode)
  239. temp |= 0x0001;
  240. TFDC2214_Write16(TFDC2214_Addr, TFDC2214_ERROR_CONFIG, temp);
  241. }
  242. /*!
  243. * @brief 激活FDC2214的一个通道,单通道模式
  244. * @param channel 通道
  245. * @since v1.0
  246. * Sample usage: FDC2214_SetActiveChannel(FDC2214_Channel_0);
  247. */
  248. void TFDC2214_SetActiveChannel(TFDC2214_channel_t channel)
  249. {
  250. uint16_t temp = 0;
  251. temp = TFDC2214_Read16(TFDC2214_Addr, TFDC2214_CONFIG);
  252. temp &= 0x3FFF;
  253. temp |= (uint16_t)(channel << 14);
  254. TFDC2214_Write16(TFDC2214_Addr, TFDC2214_CONFIG, temp);
  255. }
  256. /*!
  257. * @brief 设置FDC2214的工作模式:正常、睡眠。
  258. * @param mode 0:正常工作;1:睡激活模式选择。眠
  259. * @since v1.0
  260. * Sample usage: FDC2214_SetSleepMode(0);
  261. */
  262. void TFDC2214_SetSleepMode(uint8_t mode)
  263. {
  264. uint16_t temp = 0;
  265. temp = TFDC2214_Read16(TFDC2214_Addr, TFDC2214_CONFIG);
  266. temp &= 0xDFFF;
  267. if(mode)temp |= 0x2000;
  268. TFDC2214_Write16(TFDC2214_Addr, TFDC2214_CONFIG, temp);
  269. }
  270. /*!
  271. * @brief FDC2214激活模式选择。
  272. * @param mode 0:全电流激活模式;1:低功率激活模式
  273. * @since v1.0
  274. * Sample usage: FDC2214_SetCurrentMode(1);
  275. */
  276. void TFDC2214_SetCurrentMode(uint8_t mode)
  277. {
  278. uint16_t temp = 0;
  279. temp = TFDC2214_Read16(TFDC2214_Addr, TFDC2214_CONFIG);
  280. temp &= 0xF7FF;
  281. if(mode)
  282. temp |= 0x800;
  283. TFDC2214_Write16(TFDC2214_Addr, TFDC2214_CONFIG, temp);
  284. }
  285. /*!
  286. * @brief 设置FDC2214时钟源
  287. * @param src 0:内部时钟源;1:外部时钟源
  288. * @since v1.0
  289. * Sample usage: FDC2214_SetClockSource(1);
  290. */
  291. void TFDC2214_SetClockSource(uint8_t src)
  292. {
  293. uint16_t temp = 0;
  294. temp = TFDC2214_Read16(TFDC2214_Addr, TFDC2214_CONFIG);
  295. temp &= 0xFDFF;
  296. if(src)
  297. temp |= 0x200;
  298. TFDC2214_Write16(TFDC2214_Addr, TFDC2214_CONFIG, temp);
  299. }
  300. /*!
  301. * @brief 高电流传感器驱动,只适用于单通道模式。
  302. * @param mode 0:正常(最大1.5mA);1:高电流传感器驱动(>1.5mA)
  303. * @since v1.0
  304. * Sample usage: FDC2214_SetHighCurrentMode(0);
  305. */
  306. void TFDC2214_SetHighCurrentMode(uint8_t mode)
  307. {
  308. uint16_t temp = 0;
  309. temp = TFDC2214_Read16(TFDC2214_Addr, TFDC2214_CONFIG);
  310. temp &= 0xFFBF;
  311. if(mode)
  312. temp |= 0x40;
  313. TFDC2214_Write16(TFDC2214_Addr, TFDC2214_CONFIG, temp);
  314. }
  315. /*!
  316. * @brief 设置FDC2214的MUX CONFIG寄存器
  317. * @param autoscan 自动扫描模式 0:关闭,1:打开
  318. * @param channels 自动扫描通道
  319. * @param bandwidth 数字滤波器带宽,大于外部LC振荡器频率
  320. * @since v1.0
  321. * Sample usage: FDC2214_SetMUX_CONFIG(1, FDC2214_Channel_Sequence_0_1_2, FDC2214_Bandwidth_10M);
  322. */
  323. void TFDC2214_SetMUX_CONFIG(uint8_t autoscan, TFDC2214_channel_sequence_t channels, TFDC2214_filter_bandwidth_t bandwidth)
  324. {
  325. uint16_t temp = 0;
  326. if(autoscan)
  327. {
  328. temp = (uint16_t)(autoscan << 15) | (channels << 13) | 0x0208 | bandwidth;
  329. }
  330. else
  331. {
  332. temp = 0x0208 | bandwidth;
  333. }
  334. TFDC2214_Write16(TFDC2214_Addr, TFDC2214_MUX_CONFIG, temp);
  335. }
  336. /*!
  337. * @brief 传感器复位
  338. * @since v1.0
  339. * Sample usage: FDC2214_Reset();
  340. */
  341. void TFDC2214_Reset(void)
  342. {
  343. TFDC2214_Write16(TFDC2214_Addr, TFDC2214_RESET_DEV, 0x8000);
  344. }
  345. /*!
  346. * @brief 设置FDC2214的一个通道传感器驱动电流,确保振荡幅度在1.2V和1.8V之间。
  347. * @param channel 通道
  348. * @param current 电流大小
  349. * @since v1.0
  350. * Sample usage: FDC2214_SetDriveCurrent(FDC2214_Channel_0, FDC2214_Drive_Current_0_025);
  351. */
  352. void TFDC2214_SetDriveCurrent(TFDC2214_channel_t channel, TFDC2214_drive_current_t current)
  353. {
  354. uint16_t temp = 0;
  355. temp = (uint16_t)(current << 11);
  356. switch(channel)
  357. {
  358. case FDC2214_Channel_0:
  359. TFDC2214_Write16(TFDC2214_Addr, TFDC2214_DRIVE_CURRENT_CH0, temp);
  360. break;
  361. case FDC2214_Channel_1:
  362. TFDC2214_Write16(TFDC2214_Addr, TFDC2214_DRIVE_CURRENT_CH1, temp);
  363. break;
  364. case FDC2214_Channel_2:
  365. TFDC2214_Write16(TFDC2214_Addr, TFDC2214_DRIVE_CURRENT_CH2, temp);
  366. break;
  367. case FDC2214_Channel_3:
  368. TFDC2214_Write16(TFDC2214_Addr, TFDC2214_DRIVE_CURRENT_CH3, temp);
  369. break;
  370. }
  371. }
  372. /*!
  373. * @brief 计算传感器频率
  374. * @param channel 通道
  375. * @param datax 读取的转换值
  376. * @return 频率,单位Hz
  377. * @since v1.0
  378. * Sample usage: FDC2214_CalculateFrequency(FDC2214_Channel_0, 0xFF);
  379. */
  380. double TFDC2214_CalculateFrequency(TFDC2214_channel_t channel, uint32_t datax)
  381. {
  382. double frequency = 0.0;
  383. frequency = (double)(TCHx_FIN_SEL[channel] * TfREFx[channel] * datax) / 268435456.0;//2^28 0.298*data
  384. // DEBUG_PRINTF("CHx_FIN_SEL[0] %d \r\n",CHx_FIN_SEL[0]);
  385. return frequency;
  386. }
  387. /*!
  388. * @brief 计算外部电容大小
  389. * @param frequency 频率大小,单位Hz
  390. * @param inductance 板载电感大小,单位uH
  391. * @param capacitance 板载电容大小,单位pF
  392. * @return 外部电容大小,单位pF
  393. * @since v1.0
  394. * Sample usage: FDC2214_CalculateCapacitance(FDC2214_Channel_0, 6000000, 18, 33);
  395. */
  396. double TFDC2214_CalculateCapacitance(double frequency, float inductance, float capacitance)
  397. {
  398. double cap = 0.0;
  399. cap = (double)(1000000000000000000/ (inductance * (2 * TPIT * frequency) * (2 * TPIT * frequency)))-capacitance; //
  400. return cap;
  401. }
  402. /*!
  403. * @brief FDC2214初始化函数
  404. * @return 1:成功;0:失败
  405. * @since v1.0
  406. * Sample usage: FDC2214_Init();
  407. * RCOUNT:值越大,分辨率越高,但速度越慢。5000 合理,建议范围 2000 ~ 10000
  408. * SETTLECOUNT:不能太小。建议 settleCount = fSensor / fRef * 10,可先设为 500 或 1000 测试。实际电路中电容越大、阻抗越高需要越大的 settleCount。
  409. * FDC2214_Drive_Current_0_081:电容值小/感应距离短时,低电流更稳定。电容大或探测距离远时,可尝试 0.146mA、0.206mA 等更大电流
  410. */
  411. uint8_t TFDC2214_Init(void)
  412. {
  413. FDC_PRINTF("\r\n=== TFDC2214_deviceID ===\r\n");
  414. uint16_t deviceID = 0;
  415. deviceID = TFDC2214_Read16(TFDC2214_Addr, TFDC2214_DEVICE_ID);//读器件ID
  416. FDC_PRINTF("TFDC2214_deviceID : 0x%02x \r\n" ,deviceID );
  417. uint16_t RCOUNT = 20000; // 5000对应2000us 转换周期
  418. uint16_t SETTLECOUNT = 4000; // 200对应200 cycles 等待时间
  419. if(deviceID == TFDC2214_ID)
  420. {
  421. TFDC2214_Reset();
  422. // 通道0
  423. TFDC2214_SetRcount(TFDC2214_Channel_0, RCOUNT);// 转换周期
  424. TFDC2214_SetSettleCount(TFDC2214_Channel_0, SETTLECOUNT);// cycles 等待时间
  425. TFDC2214_SetChannelClock(TFDC2214_Channel_0, 0x02, 1);//设置时钟分频,1分频,40MHz
  426. // // 通道1
  427. // FDC2214_SetRcount(FDC2214_Channel_1, RCOUNT);//2000us 转换周期
  428. // FDC2214_SetSettleCount(FDC2214_Channel_1, SETTLECOUNT);//200 cycles 等待时间
  429. // FDC2214_SetChannelClock(FDC2214_Channel_1, 1, 1);//设置时钟分频,1分频,40MHz
  430. // // 通道2
  431. // FDC2214_SetRcount(FDC2214_Channel_2, RCOUNT);//2000us 转换周期
  432. // FDC2214_SetSettleCount(FDC2214_Channel_2, SETTLECOUNT);//200 cycles 等待时间
  433. // FDC2214_SetChannelClock(FDC2214_Channel_2, 1, 1);//设置时钟分频,1分频,40MHz
  434. // // 通道3
  435. // FDC2214_SetRcount(FDC2214_Channel_3, RCOUNT);//2000us 转换周期
  436. // FDC2214_SetSettleCount(FDC2214_Channel_3, SETTLECOUNT);//200 cycles 等待时间
  437. // FDC2214_SetChannelClock(FDC2214_Channel_3, 1, 1);//设置时钟分频,1分频,40MHz
  438. TFDC2214_SetINTB(0);//关闭INTB中断
  439. TFDC2214_SetCurrentMode(1);//全电流激活模式
  440. TFDC2214_SetClockSource(1);//1外部时钟源 0内部晶振
  441. TFDC2214_SetHighCurrentMode(0);//0:正常(最大1.5mA);1:高电流传感器驱动(>1.5mA)
  442. TFDC2214_SetMUX_CONFIG(1, TFDC2214_Channel_Sequence_0_1, TFDC2214_Bandwidth_3_3M); // 0关闭自动扫描,设置带宽, 带宽调小,抗干扰性更强
  443. TFDC2214_SetActiveChannel(TFDC2214_Channel_0);//激活通道0
  444. // FDC2214_SetMUX_CONFIG(1, FDC2214_Channel_Sequence_0_1, FDC2214_Bandwidth_10M);//开启01通道采集,打开自动扫描,10MHz带宽
  445. // FDC2214_SetMUX_CONFIG(1, FDC2214_Channel_Sequence_0_1_2_3, FDC2214_Bandwidth_3_3M);//开启0123通道采集,打开自动扫描,10MHz带宽
  446. TFDC2214_SetDriveCurrent(TFDC2214_Channel_0, TFDC2214_Drive_Current_0_356);//通道0驱动电流
  447. // FDC2214_SetDriveCurrent(FDC2214_Channel_1, FDC2214_Drive_Current_1_006);//通道1驱动电流
  448. // FDC2214_SetDriveCurrent(FDC2214_Channel_2, FDC2214_Drive_Current_1_006);//通道2驱动电流
  449. // FDC2214_SetDriveCurrent(FDC2214_Channel_3, FDC2214_Drive_Current_1_006);//通道3驱动电流
  450. TFDC2214_SetSleepMode(0);//退出睡眠状态,开始工作
  451. FDC_PRINTF("TFDC2214 Init OK!\r\n");
  452. FDC_PRINTF("============================\r\n");
  453. osDelay(100);
  454. return 0;
  455. }
  456. else
  457. {
  458. FDC_PRINTF("TFDC2214 Init Failed!! \r\n");
  459. FDC_PRINTF("============================\r\n");
  460. return 1;
  461. }
  462. }
  463. long Tfilterread(TFDC2214_channel_t channel, uint32_t *data)
  464. {
  465. uint16_t i = 0, try_count = 0;
  466. long result = 0;
  467. long Data[20], Sum = 0, max = 0, min = 0;
  468. while (i < 20 && try_count < 100)
  469. {
  470. try_count++;
  471. if (TFDC2214_GetChannelData(channel, data) == 1)
  472. {
  473. Data[i++] = *data;
  474. }
  475. Tdelay_us(100);
  476. }
  477. if (i < 20) {
  478. DEBUG_PRINTF("FDC2214 data read timeout! Only %d samples.\r\n", i);
  479. return -1; // 读取失败
  480. }
  481. Sum = Data[0];
  482. max = Data[0];
  483. min = Data[0];
  484. for (i = 1; i < 20; i++)
  485. {
  486. if (max < Data[i]) max = Data[i];
  487. if (min > Data[i]) min = Data[i];
  488. Sum += Data[i];
  489. }
  490. result = (Sum - max - min) / 18;
  491. return result;
  492. }
  493. double Tgetcap(uint8_t channel,double dg,double dr)
  494. {
  495. double Cap=0.0;
  496. switch(channel)
  497. {
  498. case 0:
  499. Tch0=Tfilterread(TFDC2214_Channel_0,&Tch0);
  500. TFRE[0]=TFDC2214_CalculateFrequency(TFDC2214_Channel_0,Tch0);
  501. // DEBUG_PRINTF("\r\nTCH0 RAW: [%u], Frequency: [%lf] MHz", Tch0, TFRE[0]/1000000);
  502. Cap=TFDC2214_CalculateCapacitance(TFRE[0], dg, dr);
  503. break;
  504. case 1:
  505. Tch1=Tfilterread(TFDC2214_Channel_1,&Tch1);
  506. TFRE[1]=TFDC2214_CalculateFrequency(TFDC2214_Channel_1,Tch1);
  507. // DEBUG_PRINTF("TCH1 RAW = %u, Frequency = %lf KHz\r\n", Tch1, TFRE[1]/1000);
  508. Cap=TFDC2214_CalculateCapacitance(TFRE[1], dg, dr);
  509. break;
  510. case 2:
  511. Tch2=Tfilterread(TFDC2214_Channel_2,&Tch2);
  512. TFRE[2]=TFDC2214_CalculateFrequency(TFDC2214_Channel_2,Tch2);
  513. // DEBUG_PRINTF("TCH2 RAW = %u, Frequency = %lf KHz\r\n", Tch2, TFRE[2]/1000);
  514. Cap=TFDC2214_CalculateCapacitance(TFRE[2], dg, dr);
  515. break;
  516. case 3:
  517. Tch3=Tfilterread(TFDC2214_Channel_3,&Tch3);
  518. TFRE[3]=TFDC2214_CalculateFrequency(TFDC2214_Channel_3,Tch3);
  519. // DEBUG_PRINTF("TCH3 RAW = %u, Frequency = %lf KHz\r\n", Tch3, TFRE[3]/1000);
  520. Cap=TFDC2214_CalculateCapacitance(TFRE[3], dg, dr);
  521. break;
  522. }
  523. return Cap;
  524. }