lt_fdc2214.c 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672
  1. /**
  2. ******************************************************************************
  3. * @file lt_fdc2214.c
  4. ******************************************************************************
  5. * @attention
  6. * FDC2214的SD引脚,拉高关机,拉低开机。
  7. *
  8. ******************************************************************************
  9. */
  10. #include "lt_fdc2214.h"
  11. #include "stdlib.h"
  12. #include "math.h"
  13. #include "main.h"
  14. #include "queue.h"
  15. uint8_t CHx_FIN_SEL[4];
  16. double fREFx[4];
  17. double FRE[4];
  18. uint32_t ch0,ch1,ch2,ch3;
  19. /*!
  20. * @brief IIC写FDC2214
  21. * @param Slve_Addr 器件地址
  22. * @param reg 寄存器
  23. * @param data 数据
  24. * @since v1.0
  25. * Sample usage: FDC2214_Write16(FDC2214_Addr, FDC2214_CONFIG, 0xFFFF);
  26. */
  27. void FDC2214_Write16(SoftI2C_HandleTypeDef *iic, uint8_t Slve_Addr, uint8_t reg, uint16_t data)
  28. {
  29. uint8_t dat;
  30. FDC2214_IIC_Start(iic);
  31. FDC2214_IIC_Send_Byte(iic, Slve_Addr << 1);
  32. FDC2214_IIC_Wait_Ack(iic);
  33. FDC2214_IIC_Send_Byte(iic, reg);
  34. FDC2214_IIC_Wait_Ack(iic);
  35. dat=(data >> 8);
  36. FDC2214_IIC_Send_Byte(iic, dat);
  37. FDC2214_IIC_Wait_Ack(iic);
  38. dat=data & 0xFF;
  39. FDC2214_IIC_Send_Byte(iic, dat);
  40. FDC2214_IIC_Wait_Ack(iic);
  41. FDC2214_IIC_Stop(iic);
  42. }
  43. /*!
  44. * @brief IIC读FDC2214
  45. * @param Slve_Addr 器件地址
  46. * @param reg 寄存器
  47. * @return 寄存器值
  48. * @since v1.0
  49. * Sample usage: FDC2214_Read16(FDC2214_Addr, FDC2214_CONFIG);
  50. */
  51. uint16_t FDC2214_Read16(SoftI2C_HandleTypeDef *iic, uint8_t Slve_Addr, uint8_t reg)
  52. {
  53. uint16_t temp;
  54. FDC2214_IIC_Start(iic);
  55. FDC2214_IIC_Send_Byte(iic, Slve_Addr << 1);
  56. FDC2214_IIC_Wait_Ack(iic);
  57. FDC2214_IIC_Send_Byte(iic, reg);
  58. FDC2214_IIC_Wait_Ack(iic);
  59. FDC2214_IIC_Start(iic);
  60. FDC2214_IIC_Send_Byte(iic,((Slve_Addr << 1) | 0x01));
  61. FDC2214_IIC_Wait_Ack(iic);
  62. temp = (uint16_t)(FDC2214_IIC_Read_Byte(iic,1) << 8);
  63. temp |= FDC2214_IIC_Read_Byte(iic,0);
  64. FDC2214_IIC_Stop(iic);
  65. return temp;
  66. }
  67. /*!
  68. * @brief 读取FDC2214一个通道的转换值
  69. * @param channel 通道
  70. * @param *data 读取的数据
  71. * @return 0:失败;1:成功
  72. * @since v1.0
  73. * Sample usage: FDC2214_GetChannelData(FDC2214_Channel_0, &CH0_DATA);
  74. */
  75. uint8_t FDC2214_GetChannelData(SoftI2C_HandleTypeDef *iic, FDC2214_channel_t channel, uint32_t *data)
  76. {
  77. int16_t timeout = 100;
  78. uint8_t dateReg_H;
  79. uint8_t dateReg_L;
  80. uint8_t bitUnreadConv;
  81. uint16_t status;
  82. uint32_t dataRead;
  83. switch(channel)
  84. {
  85. case FDC2214_Channel_0:
  86. dateReg_H = FDC2214_DATA_CH0;
  87. dateReg_L = FDC2214_DATA_LSB_CH0;
  88. bitUnreadConv = 0x0008;
  89. break;
  90. case FDC2214_Channel_1:
  91. dateReg_H = FDC2214_DATA_CH1;
  92. dateReg_L = FDC2214_DATA_LSB_CH1;
  93. bitUnreadConv = 0x0004;
  94. break;
  95. case FDC2214_Channel_2:
  96. dateReg_H = FDC2214_DATA_CH2;
  97. dateReg_L = FDC2214_DATA_LSB_CH2;
  98. bitUnreadConv = 0x0002;
  99. break;
  100. case FDC2214_Channel_3:
  101. dateReg_H = FDC2214_DATA_CH3;
  102. dateReg_L = FDC2214_DATA_LSB_CH3;
  103. bitUnreadConv = 0x0001;
  104. break;
  105. }
  106. status = FDC2214_Read16(iic, FDC2214_Addr, FDC2214_STATUS);//读取状态寄存器的值
  107. while(timeout && !(status & bitUnreadConv))//检查是否有未读数据
  108. {
  109. status = FDC2214_Read16(iic, FDC2214_Addr, FDC2214_STATUS);
  110. timeout--;
  111. }
  112. if(timeout)
  113. {
  114. dataRead = (uint32_t)(FDC2214_Read16(iic, FDC2214_Addr, dateReg_H) << 16);
  115. dataRead |= FDC2214_Read16(iic, FDC2214_Addr, dateReg_L);
  116. *data = dataRead;
  117. return 1;
  118. }
  119. else
  120. {
  121. //超时
  122. return 0;
  123. }
  124. }
  125. /*!
  126. * @brief 设置FDC2214一个通道的转换时间,转换时间(tCx)=(CHx_RCOUNT?16) / fREFx。
  127. * @param channel 通道
  128. * @param rcount CHx_RCOUNT
  129. * @since v1.0
  130. * Sample usage: FDC2214_SetRcount(FDC2214_Channel_0, 0x0FFF);
  131. */
  132. void FDC2214_SetRcount(SoftI2C_HandleTypeDef *iic, FDC2214_channel_t channel, uint16_t rcount)
  133. {
  134. if(rcount <= 0x00FF) return;
  135. switch(channel)
  136. {
  137. case FDC2214_Channel_0:
  138. FDC2214_Write16(iic, FDC2214_Addr, FDC2214_RCOUNT_CH0, rcount);
  139. break;
  140. case FDC2214_Channel_1:
  141. FDC2214_Write16(iic, FDC2214_Addr, FDC2214_RCOUNT_CH1, rcount);
  142. break;
  143. case FDC2214_Channel_2:
  144. FDC2214_Write16(iic, FDC2214_Addr, FDC2214_RCOUNT_CH2, rcount);
  145. break;
  146. case FDC2214_Channel_3:
  147. FDC2214_Write16(iic, FDC2214_Addr, FDC2214_RCOUNT_CH3, rcount);
  148. break;
  149. }
  150. }
  151. /*!
  152. * @brief 设置FDC2214一个通道的建立时间,使LC传感器可以在通道x开始转换之前稳定下来,建立时间(tSx) = (CHx_SETTLECOUNT?16) ÷ fREFx。
  153. CHx_SETTLECOUNT = 0x00, 0x01时(tSx) = 32 ÷ fREFx。
  154. * @param channel 通道
  155. * @param count CHx_SETTLECOUNT
  156. * @since v1.0
  157. * @note CHx_SETTLECOUNT > Vpk × fREFx × C × π^2 / (32 × IDRIVEX)
  158. * Sample usage: FDC2214_SetSettleCount(FDC2214_Channel_0, 0x00FF);
  159. */
  160. void FDC2214_SetSettleCount(SoftI2C_HandleTypeDef *iic, FDC2214_channel_t channel, uint16_t count)
  161. {
  162. switch(channel)
  163. {
  164. case FDC2214_Channel_0:
  165. FDC2214_Write16(iic, FDC2214_Addr, FDC2214_SETTLECOUNT_CH0, count);
  166. break;
  167. case FDC2214_Channel_1:
  168. FDC2214_Write16(iic, FDC2214_Addr, FDC2214_SETTLECOUNT_CH1, count);
  169. break;
  170. case FDC2214_Channel_2:
  171. FDC2214_Write16(iic, FDC2214_Addr, FDC2214_SETTLECOUNT_CH2, count);
  172. break;
  173. case FDC2214_Channel_3:
  174. FDC2214_Write16(iic, FDC2214_Addr, FDC2214_SETTLECOUNT_CH3, count);
  175. break;
  176. }
  177. }
  178. /*!
  179. * @brief 设置FDC2214一个通道的的时钟频率,
  180. 差分传感器配置:
  181. 0x01 -- 传感器频率0.01MHz和8.75MHz
  182. 0x02 -- 传感器频率5MHz和10MHz
  183. 单端传感器配置:
  184. 0x01 -- 传感器频率0.01MHz和10MHz
  185. * @param channel 通道
  186. * @param frequency_select 时钟选择
  187. * @param divider 分频器,fREFx = fCLK / CHx_FREF_DIVIDER,
  188. * @note fREFx is > 4 × fSENSOR(外部LC振荡器频率)
  189. * @since v1.0
  190. * Sample usage: FDC2214_SetChannelClock(FDC2214_Channel_0, 0x01, 0xFF);
  191. */
  192. void FDC2214_SetChannelClock(SoftI2C_HandleTypeDef *iic, FDC2214_channel_t channel, uint8_t frequency_select, uint16_t divider)
  193. {
  194. uint16_t temp = 0;
  195. temp = (uint16_t)(frequency_select << 12) | (divider & 0x03FF);
  196. CHx_FIN_SEL[channel] = frequency_select;//记录时钟选择
  197. FDC_PRINTF("Frequency_select : %d \r\n",frequency_select);
  198. fREFx[channel] = (double)ClockFrequency / divider;//记录时钟频率
  199. switch(channel)
  200. {
  201. case FDC2214_Channel_0:
  202. // printf("CHx_FIN_SEL[0] %d \r\n",CHx_FIN_SEL[0]);
  203. // printf("FREFx[0] : [%f] \r\n",fREFx[0]);
  204. FDC2214_Write16(iic, FDC2214_Addr, FDC2214_CLOCK_DIVIDERS_CH0, temp);
  205. break;
  206. case FDC2214_Channel_1:
  207. FDC2214_Write16(iic, FDC2214_Addr, FDC2214_CLOCK_DIVIDERS_CH1, temp);
  208. break;
  209. case FDC2214_Channel_2:
  210. FDC2214_Write16(iic, FDC2214_Addr, FDC2214_CLOCK_DIVIDERS_CH2, temp);
  211. break;
  212. case FDC2214_Channel_3:
  213. FDC2214_Write16(iic, FDC2214_Addr, FDC2214_CLOCK_DIVIDERS_CH3, temp);
  214. break;
  215. }
  216. }
  217. /*!
  218. * @brief 配置INTB引脚中断功能
  219. * @param mode 1:开中断;0:关中断
  220. * @since v1.0
  221. * Sample usage: FDC2214_SetDriveCurrent(FDC2214_Channel_0, FDC2214_Drive_Current_0_025);
  222. */
  223. void FDC2214_SetINTB(SoftI2C_HandleTypeDef *iic, uint8_t mode)
  224. {
  225. uint16_t temp = 0;
  226. temp = FDC2214_Read16(iic, FDC2214_Addr, FDC2214_CONFIG);
  227. temp &= 0xFF7F;
  228. if(mode)
  229. temp |= 0x0080;
  230. FDC2214_Write16(iic, FDC2214_Addr, FDC2214_CONFIG, temp);
  231. temp = FDC2214_Read16(iic, FDC2214_Addr, FDC2214_ERROR_CONFIG);
  232. temp &= 0xFFFE;
  233. if(mode)
  234. temp |= 0x0001;
  235. FDC2214_Write16(iic, FDC2214_Addr, FDC2214_ERROR_CONFIG, temp);
  236. }
  237. /*!
  238. * @brief 激活FDC2214的一个通道,单通道模式
  239. * @param channel 通道
  240. * @since v1.0
  241. * Sample usage: FDC2214_SetActiveChannel(FDC2214_Channel_0);
  242. */
  243. void FDC2214_SetActiveChannel(SoftI2C_HandleTypeDef *iic, FDC2214_channel_t channel)
  244. {
  245. uint16_t temp = 0;
  246. temp = FDC2214_Read16(iic, FDC2214_Addr, FDC2214_CONFIG);
  247. temp &= 0x3FFF;
  248. temp |= (uint16_t)(channel << 14);
  249. FDC2214_Write16(iic, FDC2214_Addr, FDC2214_CONFIG, temp);
  250. }
  251. /*!
  252. * @brief 设置FDC2214的工作模式:正常、睡眠。
  253. * @param mode 0:正常工作;1:睡激活模式选择。眠
  254. * @since v1.0
  255. * Sample usage: FDC2214_SetSleepMode(0);
  256. */
  257. void FDC2214_SetSleepMode(SoftI2C_HandleTypeDef *iic, uint8_t mode)
  258. {
  259. uint16_t temp = 0;
  260. temp = FDC2214_Read16(iic, FDC2214_Addr, FDC2214_CONFIG);
  261. temp &= 0xDFFF;
  262. if(mode)temp |= 0x2000;
  263. FDC2214_Write16(iic, FDC2214_Addr, FDC2214_CONFIG, temp);
  264. }
  265. /*!
  266. * @brief FDC2214激活模式选择。
  267. * @param mode 0:全电流激活模式;1:低功率激活模式
  268. * @since v1.0
  269. * Sample usage: FDC2214_SetCurrentMode(1);
  270. */
  271. void FDC2214_SetCurrentMode(SoftI2C_HandleTypeDef *iic, uint8_t mode)
  272. {
  273. uint16_t temp = 0;
  274. temp = FDC2214_Read16(iic, FDC2214_Addr, FDC2214_CONFIG);
  275. temp &= 0xF7FF;
  276. if(mode)
  277. temp |= 0x800;
  278. FDC2214_Write16(iic, FDC2214_Addr, FDC2214_CONFIG, temp);
  279. }
  280. /*!
  281. * @brief 设置FDC2214时钟源
  282. * @param src 0:内部时钟源;1:外部时钟源
  283. * @since v1.0
  284. * Sample usage: FDC2214_SetClockSource(1);
  285. */
  286. void FDC2214_SetClockSource(SoftI2C_HandleTypeDef *iic, uint8_t src)
  287. {
  288. uint16_t temp = 0;
  289. temp = FDC2214_Read16(iic, FDC2214_Addr, FDC2214_CONFIG);
  290. temp &= 0xFDFF;
  291. if(src)
  292. temp |= 0x200;
  293. FDC2214_Write16(iic, FDC2214_Addr, FDC2214_CONFIG, temp);
  294. }
  295. /*!
  296. * @brief 高电流传感器驱动,只适用于单通道模式。
  297. * @param mode 0:正常(最大1.5mA);1:高电流传感器驱动(>1.5mA)
  298. * @since v1.0
  299. * Sample usage: FDC2214_SetHighCurrentMode(0);
  300. */
  301. void FDC2214_SetHighCurrentMode(SoftI2C_HandleTypeDef *iic, uint8_t mode)
  302. {
  303. uint16_t temp = 0;
  304. temp = FDC2214_Read16(iic, FDC2214_Addr, FDC2214_CONFIG);
  305. temp &= 0xFFBF;
  306. if(mode)
  307. temp |= 0x40;
  308. FDC2214_Write16(iic, FDC2214_Addr, FDC2214_CONFIG, temp);
  309. }
  310. /*!
  311. * @brief 设置FDC2214的MUX CONFIG寄存器
  312. * @param autoscan 自动扫描模式 0:关闭,1:打开
  313. * @param channels 自动扫描通道
  314. * @param bandwidth 数字滤波器带宽,大于外部LC振荡器频率
  315. * @since v1.0
  316. * Sample usage: FDC2214_SetMUX_CONFIG(1, FDC2214_Channel_Sequence_0_1_2, FDC2214_Bandwidth_10M);
  317. */
  318. void FDC2214_SetMUX_CONFIG(SoftI2C_HandleTypeDef *iic, uint8_t autoscan, FDC2214_channel_sequence_t channels, FDC2214_filter_bandwidth_t bandwidth)
  319. {
  320. uint16_t temp = 0;
  321. if(autoscan)
  322. {
  323. temp = (uint16_t)(autoscan << 15) | (channels << 13) | 0x0208 | bandwidth;
  324. }
  325. else
  326. {
  327. temp = 0x0208 | bandwidth;
  328. }
  329. FDC2214_Write16(iic, FDC2214_Addr, FDC2214_MUX_CONFIG, temp);
  330. }
  331. /*!
  332. * @brief 传感器复位
  333. * @since v1.0
  334. * Sample usage: FDC2214_Reset();
  335. */
  336. void FDC2214_Reset(SoftI2C_HandleTypeDef *iic)
  337. {
  338. FDC2214_Write16(iic, FDC2214_Addr, FDC2214_RESET_DEV, 0x8000);
  339. }
  340. /*!
  341. * @brief 设置FDC2214的一个通道传感器驱动电流,确保振荡幅度在1.2V和1.8V之间。
  342. * @param channel 通道
  343. * @param current 电流大小
  344. * @since v1.0
  345. * Sample usage: FDC2214_SetDriveCurrent(FDC2214_Channel_0, FDC2214_Drive_Current_0_025);
  346. */
  347. void FDC2214_SetDriveCurrent(SoftI2C_HandleTypeDef *iic, FDC2214_channel_t channel, FDC2214_drive_current_t current)
  348. {
  349. uint16_t temp = 0;
  350. temp = (uint16_t)(current << 11);
  351. switch(channel)
  352. {
  353. case FDC2214_Channel_0:
  354. FDC2214_Write16(iic, FDC2214_Addr, FDC2214_DRIVE_CURRENT_CH0, temp);
  355. break;
  356. case FDC2214_Channel_1:
  357. FDC2214_Write16(iic, FDC2214_Addr, FDC2214_DRIVE_CURRENT_CH1, temp);
  358. break;
  359. case FDC2214_Channel_2:
  360. FDC2214_Write16(iic, FDC2214_Addr, FDC2214_DRIVE_CURRENT_CH2, temp);
  361. break;
  362. case FDC2214_Channel_3:
  363. FDC2214_Write16(iic, FDC2214_Addr, FDC2214_DRIVE_CURRENT_CH3, temp);
  364. break;
  365. }
  366. }
  367. /*!
  368. * @brief 计算传感器频率
  369. * @param channel 通道
  370. * @param datax 读取的转换值
  371. * @return 频率,单位Hz
  372. * @since v1.0
  373. * Sample usage: FDC2214_CalculateFrequency(FDC2214_Channel_0, 0xFF);
  374. */
  375. double FDC2214_CalculateFrequency(FDC2214_channel_t channel, uint32_t datax)
  376. {
  377. double frequency = 0.0;
  378. frequency = (double)(CHx_FIN_SEL[channel] * fREFx[channel] * datax) / 268435456.0;//2^28 0.298*data
  379. // printf("CHx_FIN_SEL[0] %d \r\n",CHx_FIN_SEL[0]);
  380. return frequency;
  381. }
  382. /*!
  383. * @brief 计算外部电容大小
  384. * @param frequency 频率大小,单位Hz
  385. * @param inductance 板载电感大小,单位uH
  386. * @param capacitance 板载电容大小,单位pF
  387. * @return 外部电容大小,单位pF
  388. * @since v1.0
  389. * Sample usage: FDC2214_CalculateCapacitance(FDC2214_Channel_0, 6000000, 18, 33);
  390. */
  391. double FDC2214_CalculateCapacitance(double frequency, float inductance, float capacitance)
  392. {
  393. double cap = 0.0;
  394. cap = (double)(1000000000000000000/ (inductance * (2 * PI * frequency) * (2 * PI * frequency)))-capacitance; //
  395. return cap;
  396. }
  397. /*!
  398. * @brief FDC2214初始化函数
  399. * @return 1:成功;0:失败
  400. * @since v1.0
  401. * Sample usage: FDC2214_Init();
  402. * RCOUNT:值越大,分辨率越高,但速度越慢。5000 合理,建议范围 2000 ~ 10000
  403. * SETTLECOUNT:不能太小。建议 settleCount = fSensor / fRef * 10,可先设为 500 或 1000 测试。实际电路中电容越大、阻抗越高需要越大的 settleCount。
  404. * FDC2214_Drive_Current_0_081:电容值小/感应距离短时,低电流更稳定。电容大或探测距离远时,可尝试 0.146mA、0.206mA 等更大电流
  405. */
  406. uint8_t FDC2214_Init(SoftI2C_HandleTypeDef *iic )
  407. {
  408. delay_us(10);
  409. FDC2214_IIC_Stop(iic);
  410. delay_us(10);
  411. FDC2214_IIC_Start(iic);
  412. delay_us(10);
  413. FDC_PRINTF("\r\n=== FDC2214_deviceID ===\r\n");
  414. uint16_t deviceID = 0;
  415. deviceID = FDC2214_Read16(iic, FDC2214_Addr, FDC2214_DEVICE_ID);//读器件ID
  416. FDC_PRINTF("FDC2214_deviceID : 0x%02x \r\n" ,deviceID );
  417. uint16_t RCOUNT = 20000; // 5000对应2000us 转换周期
  418. uint16_t SETTLECOUNT = 4000; // 200对应200 cycles 等待时间
  419. if(deviceID == FDC2214_ID)
  420. {
  421. FDC2214_Reset(iic);
  422. // 通道0
  423. FDC2214_SetRcount(iic, FDC2214_Channel_0, RCOUNT);// 转换周期
  424. FDC2214_SetSettleCount(iic, FDC2214_Channel_0, SETTLECOUNT);// cycles 等待时间
  425. FDC2214_SetChannelClock(iic, FDC2214_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. FDC2214_SetINTB(iic, 0);//关闭INTB中断
  439. FDC2214_SetCurrentMode(iic, 1);//全电流激活模式
  440. FDC2214_SetClockSource(iic, 1);//1外部时钟源 0内部晶振
  441. FDC2214_SetHighCurrentMode(iic, 0);//0:正常(最大1.5mA);1:高电流传感器驱动(>1.5mA)
  442. FDC2214_SetMUX_CONFIG(iic, 1, FDC2214_Channel_Sequence_0_1, FDC2214_Bandwidth_3_3M); // 0关闭自动扫描,设置带宽, 带宽调小,抗干扰性更强
  443. FDC2214_SetActiveChannel(iic, FDC2214_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. FDC2214_SetDriveCurrent(iic, FDC2214_Channel_0, FDC2214_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. FDC2214_SetSleepMode(iic, 0);//退出睡眠状态,开始工作
  451. FDC_PRINTF("FDC2214 Init OK!\r\n");
  452. FDC_PRINTF("============================\r\n");
  453. osDelay(100);
  454. return 0;
  455. }
  456. else
  457. {
  458. FDC_PRINTF("FDC2214 Init Failed!! \r\n");
  459. FDC_PRINTF("============================\r\n");
  460. return 1;
  461. }
  462. }
  463. long filterread(SoftI2C_HandleTypeDef *iic, FDC2214_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 (FDC2214_GetChannelData(iic, channel, data) == 1)
  472. {
  473. Data[i++] = *data;
  474. }
  475. delay_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 getcap(SoftI2C_HandleTypeDef *iic, uint8_t channel,double dg,double dr)
  494. {
  495. double Cap=0.0;
  496. switch(channel)
  497. {
  498. case 0:
  499. ch0=filterread(iic, FDC2214_Channel_0,&ch0);
  500. FRE[0]=FDC2214_CalculateFrequency(FDC2214_Channel_0,ch0);
  501. DEBUG_PRINTF("\r\nCH0 RAW: [%u], Frequency: [%lf] MHz", ch0, FRE[0]/1000000);
  502. Cap=FDC2214_CalculateCapacitance(FRE[0], dg, dr);
  503. break;
  504. case 1:
  505. ch1=filterread(iic, FDC2214_Channel_1,&ch1);
  506. FRE[1]=FDC2214_CalculateFrequency(FDC2214_Channel_1,ch1);
  507. DEBUG_PRINTF("CH1 RAW = %u, Frequency = %lf KHz\r\n", ch1, FRE[1]/1000);
  508. Cap=FDC2214_CalculateCapacitance(FRE[1], dg, dr);
  509. break;
  510. case 2:
  511. ch2=filterread(iic, FDC2214_Channel_2,&ch2);
  512. FRE[2]=FDC2214_CalculateFrequency(FDC2214_Channel_2,ch2);
  513. DEBUG_PRINTF("CH2 RAW = %u, Frequency = %lf KHz\r\n", ch2, FRE[2]/1000);
  514. Cap=FDC2214_CalculateCapacitance(FRE[2], dg, dr);
  515. break;
  516. case 3:
  517. ch3=filterread(iic, FDC2214_Channel_3,&ch3);
  518. FRE[3]=FDC2214_CalculateFrequency(FDC2214_Channel_3,ch3);
  519. DEBUG_PRINTF("CH3 RAW = %u, Frequency = %lf KHz\r\n", ch3, FRE[3]/1000);
  520. Cap=FDC2214_CalculateCapacitance(FRE[3], dg, dr);
  521. break;
  522. }
  523. return Cap;
  524. }
  525. void ProcessFDC2214(SoftI2C_HandleTypeDef* iic, osMessageQueueId_t queue, uint8_t* ready_flag, uint8_t* valid_flag, uint8_t channel, uint8_t inductor, uint8_t par_capacitor, float zeroValue, uint8_t device_index)
  526. {
  527. // delay_us(10);
  528. FDC2214_IIC_Stop(iic);
  529. delay_us(10);
  530. FDC2214_IIC_Start(iic);
  531. delay_us(10);
  532. FDC2214_Reset(iic);
  533. if (!(*ready_flag)) {
  534. *ready_flag = (FDC2214_Init(iic) == 0) ? 1 : 0;
  535. if (!(*ready_flag)) {
  536. FDC_PRINTF("\r\nRetrying %d FDC2214 init in 2s ...", device_index);
  537. osDelay(2000);
  538. return;
  539. } else {
  540. *valid_flag = 1;
  541. }
  542. }
  543. if (*valid_flag) {
  544. float cap = 0.0f ;
  545. cap = getcap(iic, channel, inductor, par_capacitor) - zeroValue; // 采集数据 通道0,电感,电容 /* 并联 18uh - 13pf : 测量47pf , -30.6 , 并联 18uh - 33pf : 测量47pf , -43.1 */
  546. if(device_index == 1)
  547. {
  548. Filter_msg1 msg1;
  549. msg1.data = cap;
  550. if (xQueueSend(queue, &msg1, pdMS_TO_TICKS(1)) != pdPASS) {
  551. FDC_PRINTF("\r\nQueue full, cap=%.3f not sent", cap);
  552. }
  553. return;
  554. }
  555. if(device_index == 2)
  556. {
  557. Filter_msg2 msg2;
  558. msg2.data = cap;
  559. if (xQueueSend(queue, &msg2, pdMS_TO_TICKS(1)) != pdPASS) {
  560. FDC_PRINTF("\r\nQueue full, cap=%.3f not sent", cap);
  561. }
  562. return;
  563. }
  564. FDC2214_IIC_Stop(iic);
  565. delay_us(10);
  566. }
  567. }
  568. void CheckFDC2214_ID(SoftI2C_HandleTypeDef* iic, uint8_t device_index, uint8_t* deviceValid)
  569. {
  570. FDC2214_IIC_Stop(iic);
  571. osDelay(1);
  572. FDC2214_IIC_Start(iic);
  573. osDelay(1);
  574. FDC2214_Reset(iic);
  575. uint16_t id = 0;
  576. id = FDC2214_Read16(iic, FDC2214_Addr, 0x7F);
  577. if (id == FDC2214_ID) {
  578. FDC_PRINTF("[FDC2214-%d] ok: ID=0x%04X\r\n", device_index, id);
  579. *deviceValid = 1;
  580. } else {
  581. *deviceValid = 0;
  582. FDC_PRINTF("[FDC2214-%d] error: ID=0x%04X\r\n", device_index, id);
  583. }
  584. FDC2214_IIC_Stop(iic);
  585. osDelay(1);
  586. FDC2214_IIC_Start(iic);
  587. osDelay(1);
  588. }