AD7124_ATY.c 28 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665
  1. /**
  2. * @file AD7124_ATY.c
  3. *
  4. * @param Project DEVICE_DRIVER_ATY_LIB
  5. *
  6. * @author ATY
  7. *
  8. * @copyright
  9. * - Copyright 2017 - 2026 MZ-ATY
  10. * - This code follows:
  11. * - MZ-ATY Various Contents Joint Statement -
  12. * <a href="https://mengze.top/MZ-ATY_VCJS">
  13. * https://mengze.top/MZ-ATY_VCJS</a>
  14. * - CC 4.0 BY-NC-SA -
  15. * <a href="https://creativecommons.org/licenses/by-nc-sa/4.0/">
  16. * https://creativecommons.org/licenses/by-nc-sa/4.0/</a>
  17. * - Your use will be deemed to have accepted the terms of this statement.
  18. *
  19. * @brief functions of AD7124 for C platform
  20. *
  21. * @note SPI_POLARITY_LOW + SPI_PHASE_1EDGE = CPOL=0, CPHA=0 = SPI Mode 1
  22. *
  23. * @version
  24. * - 1_01_230828 > ATY
  25. * -# Preliminary version, first Release
  26. * - 1_02_231229 > ATY
  27. * -# add multy addr and dev->channel
  28. * - 1_03_240111 > ATY
  29. * -# add lock
  30. * - 1_04_251124 > ATY
  31. * -# change log and test basely
  32. * - 1_05_251225 > ATY
  33. * -# change dev position and add initFlag to auto init
  34. ********************************************************************************
  35. */
  36. #ifndef __AD7124_ATY_C
  37. #define __AD7124_ATY_C
  38. #include "AD7124_ATY.h"
  39. #define AD7124_ATY_TAG "\r\n[AD7124_ATY] "
  40. /******************************* For user *************************************/
  41. /******************************************************************************/
  42. /**
  43. * @brief
  44. *
  45. * @param data
  46. * @param len
  47. * @param dev
  48. * @return uint8_t
  49. */
  50. uint8_t AD7124_WriteRead(struct AD7124_ATY_Dev* dev, uint8_t* data, uint8_t len){
  51. uint8_t errCode = 0;
  52. __ATY_LOCK(dev);
  53. dev->nssSet(__ATY_HL_L);
  54. printf_ATY_D("%sRW_W: ", AD7124_ATY_TAG);
  55. for(int i = 0; i < len; i++) printf_ATY_D("%02X ", data[i]);
  56. errCode = dev->spiProcess(data, len);
  57. printf_ATY_D("%sRW_R: ", AD7124_ATY_TAG);
  58. for(int i = 0; i < len; i++) printf_ATY_D("%02X ", data[i]);
  59. dev->nssSet(__ATY_HL_H);
  60. __ATY_UNLOCK(dev);
  61. return errCode;
  62. }
  63. /**
  64. * @brief
  65. *
  66. * @param dev
  67. * @return uint8_t
  68. */
  69. uint8_t AD7124_Reset(struct AD7124_ATY_Dev* dev){
  70. uint8_t errCode = 0, resetBuf[9] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF};
  71. printf_ATY_D("%s--Reset", AD7124_ATY_TAG);
  72. __ATY_LOCK(dev);
  73. dev->syncSet(__ATY_HL_H);
  74. // dev->delay(10);
  75. dev->nssSet(__ATY_HL_H);
  76. dev->delay(10);
  77. __ATY_UNLOCK(dev);
  78. // write more than 64 bits to reset AD7124
  79. errCode = AD7124_WriteRead(dev, resetBuf, 9);
  80. return errCode;
  81. }
  82. /**
  83. * @brief
  84. *
  85. * @param id
  86. * @param dev
  87. * @return uint8_t
  88. */
  89. uint8_t AD7124_ReadId(struct AD7124_ATY_Dev* dev, uint8_t* id){
  90. uint8_t errCode = 0, groupTrans[2] = {0};
  91. printf_ATY_D("%s--ReadId", AD7124_ATY_TAG);
  92. groupTrans[0] = 0x45;
  93. groupTrans[1] = 0;
  94. errCode = AD7124_WriteRead(dev, groupTrans, 2);
  95. dev->id = groupTrans[1];
  96. *id = dev->id;
  97. printf_ATY_D("%sAD7124_ID: %02X\r\n", AD7124_ATY_TAG, dev->id);
  98. return errCode;
  99. }
  100. /**
  101. * @brief
  102. *
  103. * @param regAddr
  104. * @param data
  105. * @param len
  106. * @param dev
  107. * @return uint8_t
  108. * @note AD7124_ERR_REG_SPI_IGNORE_ERR only for crc trans
  109. */
  110. uint8_t AD7124_WriteReg(struct AD7124_ATY_Dev* dev, uint8_t regAddr, uint32_t data, uint8_t len){
  111. uint8_t errCode = 0, i = 0, groupTrans[4] = {0};
  112. printf_ATY_D("%s--WriteReg", AD7124_ATY_TAG);
  113. groupTrans[0] = AD7124_COMM_REG_WA(regAddr);
  114. for(i = 0; i < len; i++){
  115. groupTrans[len - i] = data & 0xFF;
  116. data = data >> 8;
  117. }
  118. printf_ATY_D("%sWriteReg: ", AD7124_ATY_TAG);
  119. for(i = 0; i < len + 1; i++)
  120. printf_ATY_D("%02X ", groupTrans[i]);
  121. errCode = AD7124_WriteRead(dev, groupTrans, len + 1);
  122. return errCode;
  123. }
  124. /**
  125. * @brief
  126. *
  127. * @param regAddr
  128. * @param data
  129. * @param len
  130. * @param dev
  131. * @return uint8_t
  132. */
  133. uint8_t AD7124_ReadReg(struct AD7124_ATY_Dev* dev, uint8_t regAddr, uint32_t* data, uint8_t len){
  134. uint8_t errCode = 0, i = 0, groupTrans[4] = {0};
  135. printf_ATY_D("%s--ReadReg", AD7124_ATY_TAG);
  136. groupTrans[0] = AD7124_COMM_REG_RA(regAddr);
  137. errCode = AD7124_WriteRead(dev, groupTrans, len + 1);
  138. if(len == 1)
  139. *data = groupTrans[1];
  140. else if(len == 2)
  141. *data = (groupTrans[1] + (groupTrans[2] << 8));
  142. else if(len == 3)
  143. *data = (groupTrans[1] + (groupTrans[2] << 8) + (groupTrans[3] << 16));
  144. printf_ATY_D("%sReadReg: ", AD7124_ATY_TAG);
  145. for(i = 0; i < len + 1; i++)
  146. printf_ATY_D("%X ", data);
  147. return errCode;
  148. }
  149. /**
  150. * @brief
  151. *
  152. * @param data
  153. * @param dev
  154. * @return uint8_t
  155. */
  156. uint8_t AD7124_ReadData(struct AD7124_ATY_Dev* dev, uint8_t* data){
  157. AD7124_Init(dev, dev->cfg);
  158. printf_ATY_D("%s--ReadData", AD7124_ATY_TAG);
  159. uint8_t errCode = 0, i = 0;
  160. data[0] = AD7124_COMM_REG_RA(AD7124_DATA_REG);
  161. errCode = AD7124_WriteRead(dev, data, 5);
  162. printf_ATY_D("%sReadData: 0x ", AD7124_ATY_TAG);
  163. for(i = 0; i < 5; i++)
  164. printf_ATY_D("%02X ", data[i]);
  165. return errCode;
  166. }
  167. /**
  168. * @brief
  169. *
  170. * @param status
  171. * @param dev
  172. * @return uint8_t
  173. */
  174. uint8_t AD7124_ReadStatus(struct AD7124_ATY_Dev* dev, uint8_t* status){
  175. printf_ATY_D("%s--ReadStatus", AD7124_ATY_TAG);
  176. if(AD7124_ReadReg(dev, AD7124_STATUS_REG, (uint32_t*)status, 1)){
  177. printf_ATY_D("%sAD7124_ERR: STATE %02X %02X\r\n",
  178. AD7124_ATY_TAG, status[0], status[1]);
  179. return 1;
  180. }
  181. dev->delay(10);
  182. return 0;
  183. }
  184. /**
  185. * @brief
  186. *
  187. * @param data
  188. * @param resolution
  189. * @param refRes
  190. * @param gain
  191. * @return float
  192. */
  193. float AD7124_DataToRes(uint32_t data, uint8_t resolution, float refRes, uint8_t gain){
  194. uint32_t tempNum = 1;
  195. uint8_t i = 0;
  196. for(i = 0; i < resolution - 1; i++)
  197. tempNum *= 2;
  198. return (float)((((float)data - (float)tempNum) * refRes) / ((float)gain * (float)tempNum));
  199. }
  200. /**
  201. * @brief
  202. *
  203. * @param data
  204. * @return float
  205. */
  206. float AD7124_DataToResDefault(uint32_t data){
  207. return (float)((((float)data - 8388608.0) * 5110.0) / (16.0 * 8388608.0));
  208. }
  209. /**
  210. * @brief
  211. *
  212. * @param cfg
  213. * @param dev
  214. * @return uint8_t
  215. */
  216. uint8_t AD7124_Init(struct AD7124_ATY_Dev* dev, struct AD7124_ATY_Cfg* cfg){
  217. if(dev->initFlag == 0){
  218. uint8_t id = 0, status[2] = {0};
  219. printf_ATY_D("%sAD7124_Init", AD7124_ATY_TAG);
  220. dev->enSet(__ATY_HL_H);
  221. if(AD7124_Reset(dev)){
  222. printf_ATY_D("%sAD7124_ERR: RST", AD7124_ATY_TAG);
  223. return 1;
  224. }
  225. if(AD7124_ReadId(dev, &id)){
  226. printf_ATY_D("%sAD7124_ERR: ID", AD7124_ATY_TAG);
  227. return 2;
  228. }
  229. if(AD7124_ReadStatus(dev, status)){
  230. printf_ATY_D("%sAD7124_ERR: Status", AD7124_ATY_TAG);
  231. return 3;
  232. }
  233. if(AD7124_Config(dev, cfg)){
  234. printf_ATY_D("%sAD7124_ERR: CFG", AD7124_ATY_TAG);
  235. return 4;
  236. }
  237. dev->initFlag = 1;
  238. return 0;
  239. }
  240. return 0;
  241. }
  242. /**
  243. * @brief
  244. *
  245. * @param cfg
  246. * @param dev
  247. * @return uint8_t
  248. */
  249. uint8_t AD7124_Config(struct AD7124_ATY_Dev* dev, struct AD7124_ATY_Cfg* cfg){
  250. printf_ATY_D("%s--Config", AD7124_ATY_TAG);
  251. if(cfg->AD7124_ADC_CTRL_REG_t) AD7124_WriteReg(dev, AD7124_ADC_CTRL_REG, cfg->AD7124_ADC_CTRL_REG_t, 2);
  252. if(cfg->AD7124_IO_CTRL1_REG_t) AD7124_WriteReg(dev, AD7124_IO_CTRL1_REG, cfg->AD7124_IO_CTRL1_REG_t, 3);
  253. if(cfg->AD7124_IO_CTRL2_REG_t) AD7124_WriteReg(dev, AD7124_IO_CTRL2_REG, cfg->AD7124_IO_CTRL2_REG_t, 2);
  254. if(cfg->AD7124_ERREN_REG_t) AD7124_WriteReg(dev, AD7124_ERREN_REG, cfg->AD7124_ERREN_REG_t, 3);
  255. if(cfg->AD7124_CH0_MAP_REG_t) AD7124_WriteReg(dev, AD7124_CH0_MAP_REG, cfg->AD7124_CH0_MAP_REG_t, 2);
  256. if(cfg->AD7124_CH1_MAP_REG_t) AD7124_WriteReg(dev, AD7124_CH1_MAP_REG, cfg->AD7124_CH1_MAP_REG_t, 2);
  257. if(cfg->AD7124_CH2_MAP_REG_t) AD7124_WriteReg(dev, AD7124_CH2_MAP_REG, cfg->AD7124_CH2_MAP_REG_t, 2);
  258. if(cfg->AD7124_CH3_MAP_REG_t) AD7124_WriteReg(dev, AD7124_CH3_MAP_REG, cfg->AD7124_CH3_MAP_REG_t, 2);
  259. if(cfg->AD7124_CH4_MAP_REG_t) AD7124_WriteReg(dev, AD7124_CH4_MAP_REG, cfg->AD7124_CH4_MAP_REG_t, 2);
  260. if(cfg->AD7124_CH5_MAP_REG_t) AD7124_WriteReg(dev, AD7124_CH5_MAP_REG, cfg->AD7124_CH5_MAP_REG_t, 2);
  261. if(cfg->AD7124_CH6_MAP_REG_t) AD7124_WriteReg(dev, AD7124_CH6_MAP_REG, cfg->AD7124_CH6_MAP_REG_t, 2);
  262. if(cfg->AD7124_CH7_MAP_REG_t) AD7124_WriteReg(dev, AD7124_CH7_MAP_REG, cfg->AD7124_CH7_MAP_REG_t, 2);
  263. if(cfg->AD7124_CH8_MAP_REG_t) AD7124_WriteReg(dev, AD7124_CH8_MAP_REG, cfg->AD7124_CH8_MAP_REG_t, 2);
  264. if(cfg->AD7124_CH9_MAP_REG_t) AD7124_WriteReg(dev, AD7124_CH9_MAP_REG, cfg->AD7124_CH9_MAP_REG_t, 2);
  265. if(cfg->AD7124_CH10_MAP_REG_t) AD7124_WriteReg(dev, AD7124_CH10_MAP_REG, cfg->AD7124_CH10_MAP_REG_t, 2);
  266. if(cfg->AD7124_CH11_MAP_REG_t) AD7124_WriteReg(dev, AD7124_CH11_MAP_REG, cfg->AD7124_CH11_MAP_REG_t, 2);
  267. if(cfg->AD7124_CH12_MAP_REG_t) AD7124_WriteReg(dev, AD7124_CH12_MAP_REG, cfg->AD7124_CH12_MAP_REG_t, 2);
  268. if(cfg->AD7124_CH13_MAP_REG_t) AD7124_WriteReg(dev, AD7124_CH13_MAP_REG, cfg->AD7124_CH13_MAP_REG_t, 2);
  269. if(cfg->AD7124_CH14_MAP_REG_t) AD7124_WriteReg(dev, AD7124_CH14_MAP_REG, cfg->AD7124_CH14_MAP_REG_t, 2);
  270. if(cfg->AD7124_CH15_MAP_REG_t) AD7124_WriteReg(dev, AD7124_CH15_MAP_REG, cfg->AD7124_CH15_MAP_REG_t, 2);
  271. if(cfg->AD7124_CFG0_REG_t) AD7124_WriteReg(dev, AD7124_CFG0_REG, cfg->AD7124_CFG0_REG_t, 2);
  272. if(cfg->AD7124_CFG1_REG_t) AD7124_WriteReg(dev, AD7124_CFG1_REG, cfg->AD7124_CFG1_REG_t, 2);
  273. if(cfg->AD7124_CFG2_REG_t) AD7124_WriteReg(dev, AD7124_CFG2_REG, cfg->AD7124_CFG2_REG_t, 2);
  274. if(cfg->AD7124_CFG3_REG_t) AD7124_WriteReg(dev, AD7124_CFG3_REG, cfg->AD7124_CFG3_REG_t, 2);
  275. if(cfg->AD7124_CFG4_REG_t) AD7124_WriteReg(dev, AD7124_CFG4_REG, cfg->AD7124_CFG4_REG_t, 2);
  276. if(cfg->AD7124_CFG5_REG_t) AD7124_WriteReg(dev, AD7124_CFG5_REG, cfg->AD7124_CFG5_REG_t, 2);
  277. if(cfg->AD7124_CFG6_REG_t) AD7124_WriteReg(dev, AD7124_CFG6_REG, cfg->AD7124_CFG6_REG_t, 2);
  278. if(cfg->AD7124_CFG7_REG_t) AD7124_WriteReg(dev, AD7124_CFG7_REG, cfg->AD7124_CFG7_REG_t, 2);
  279. if(cfg->AD7124_FILT0_REG_t) AD7124_WriteReg(dev, AD7124_FILT0_REG, cfg->AD7124_FILT0_REG_t, 3);
  280. if(cfg->AD7124_FILT1_REG_t) AD7124_WriteReg(dev, AD7124_FILT1_REG, cfg->AD7124_FILT1_REG_t, 3);
  281. if(cfg->AD7124_FILT2_REG_t) AD7124_WriteReg(dev, AD7124_FILT2_REG, cfg->AD7124_FILT2_REG_t, 3);
  282. if(cfg->AD7124_FILT3_REG_t) AD7124_WriteReg(dev, AD7124_FILT3_REG, cfg->AD7124_FILT3_REG_t, 3);
  283. if(cfg->AD7124_FILT4_REG_t) AD7124_WriteReg(dev, AD7124_FILT4_REG, cfg->AD7124_FILT4_REG_t, 3);
  284. if(cfg->AD7124_FILT5_REG_t) AD7124_WriteReg(dev, AD7124_FILT5_REG, cfg->AD7124_FILT5_REG_t, 3);
  285. if(cfg->AD7124_FILT6_REG_t) AD7124_WriteReg(dev, AD7124_FILT6_REG, cfg->AD7124_FILT6_REG_t, 3);
  286. if(cfg->AD7124_FILT7_REG_t) AD7124_WriteReg(dev, AD7124_FILT7_REG, cfg->AD7124_FILT7_REG_t, 3);
  287. if(cfg->AD7124_OFFS0_REG_t) AD7124_WriteReg(dev, AD7124_OFFS0_REG, cfg->AD7124_OFFS0_REG_t, 3);
  288. if(cfg->AD7124_OFFS1_REG_t) AD7124_WriteReg(dev, AD7124_OFFS1_REG, cfg->AD7124_OFFS1_REG_t, 3);
  289. if(cfg->AD7124_OFFS2_REG_t) AD7124_WriteReg(dev, AD7124_OFFS2_REG, cfg->AD7124_OFFS2_REG_t, 3);
  290. if(cfg->AD7124_OFFS3_REG_t) AD7124_WriteReg(dev, AD7124_OFFS3_REG, cfg->AD7124_OFFS3_REG_t, 3);
  291. if(cfg->AD7124_OFFS4_REG_t) AD7124_WriteReg(dev, AD7124_OFFS4_REG, cfg->AD7124_OFFS4_REG_t, 3);
  292. if(cfg->AD7124_OFFS5_REG_t) AD7124_WriteReg(dev, AD7124_OFFS5_REG, cfg->AD7124_OFFS5_REG_t, 3);
  293. if(cfg->AD7124_OFFS6_REG_t) AD7124_WriteReg(dev, AD7124_OFFS6_REG, cfg->AD7124_OFFS6_REG_t, 3);
  294. if(cfg->AD7124_OFFS7_REG_t) AD7124_WriteReg(dev, AD7124_OFFS7_REG, cfg->AD7124_OFFS7_REG_t, 3);
  295. if(cfg->AD7124_GAIN0_REG_t) AD7124_WriteReg(dev, AD7124_GAIN0_REG, cfg->AD7124_GAIN0_REG_t, 3);
  296. if(cfg->AD7124_GAIN1_REG_t) AD7124_WriteReg(dev, AD7124_GAIN1_REG, cfg->AD7124_GAIN1_REG_t, 3);
  297. if(cfg->AD7124_GAIN2_REG_t) AD7124_WriteReg(dev, AD7124_GAIN2_REG, cfg->AD7124_GAIN2_REG_t, 3);
  298. if(cfg->AD7124_GAIN3_REG_t) AD7124_WriteReg(dev, AD7124_GAIN3_REG, cfg->AD7124_GAIN3_REG_t, 3);
  299. if(cfg->AD7124_GAIN4_REG_t) AD7124_WriteReg(dev, AD7124_GAIN4_REG, cfg->AD7124_GAIN4_REG_t, 3);
  300. if(cfg->AD7124_GAIN5_REG_t) AD7124_WriteReg(dev, AD7124_GAIN5_REG, cfg->AD7124_GAIN5_REG_t, 3);
  301. if(cfg->AD7124_GAIN6_REG_t) AD7124_WriteReg(dev, AD7124_GAIN6_REG, cfg->AD7124_GAIN6_REG_t, 3);
  302. if(cfg->AD7124_GAIN7_REG_t) AD7124_WriteReg(dev, AD7124_GAIN7_REG, cfg->AD7124_GAIN7_REG_t, 3);
  303. printf_ATY_D("\r\n");
  304. return 0;
  305. }
  306. /**
  307. * @brief
  308. *
  309. * @param calibrateType b1111
  310. * @param cfg
  311. * @param dev
  312. * @return uint8_t
  313. * @note 0001 int full cal at mid power
  314. 0010 int zero cal at full power
  315. 0100 sys full cal
  316. 1000 sys zero cal
  317. */
  318. uint8_t AD7124_Calibrate(struct AD7124_ATY_Dev* dev, struct AD7124_ATY_Cfg* cfg, uint8_t calibrateType){
  319. uint32_t regTrans = 0;
  320. AD7124_Init(dev, dev->cfg);
  321. printf_ATY_D("%s--Calibrate: %02X", AD7124_ATY_TAG, calibrateType);
  322. AD7124_WriteReg(dev, AD7124_OFFS0_REG, 0x800000, 3);
  323. AD7124_WriteReg(dev, AD7124_OFFS1_REG, 0x800000, 3);
  324. AD7124_WriteReg(dev, AD7124_OFFS2_REG, 0x800000, 3);
  325. AD7124_WriteReg(dev, AD7124_OFFS3_REG, 0x800000, 3);
  326. AD7124_WriteReg(dev, AD7124_OFFS4_REG, 0x800000, 3);
  327. AD7124_WriteReg(dev, AD7124_OFFS5_REG, 0x800000, 3);
  328. AD7124_WriteReg(dev, AD7124_OFFS6_REG, 0x800000, 3);
  329. AD7124_WriteReg(dev, AD7124_OFFS7_REG, 0x800000, 3);
  330. if(calibrateType & AD7124_CALIBRATE_INT_FULL){
  331. AD7124_WriteReg(dev, AD7124_ADC_CTRL_REG, 0x0058, 2); // int full cal at mid power
  332. AD7124_ReadReg(dev, AD7124_ADC_CTRL_REG, &regTrans, 2);
  333. dev->delay(1500); // 1300ms min
  334. AD7124_ReadReg(dev, AD7124_ADC_CTRL_REG, &regTrans, 2);
  335. }
  336. if(calibrateType & AD7124_CALIBRATE_INT_ZERO){
  337. AD7124_WriteReg(dev, AD7124_ADC_CTRL_REG, 0x0094, 2); // int zero cal at full power
  338. AD7124_ReadReg(dev, AD7124_ADC_CTRL_REG, &regTrans, 2);
  339. dev->delay(100); // 80ms min
  340. AD7124_ReadReg(dev, AD7124_ADC_CTRL_REG, &regTrans, 2);
  341. }
  342. if(calibrateType & AD7124_CALIBRATE_SYS_FULL){
  343. AD7124_WriteReg(dev, AD7124_ADC_CTRL_REG, 0x00A0, 2); // sys full cal
  344. AD7124_ReadReg(dev, AD7124_ADC_CTRL_REG, &regTrans, 2);
  345. dev->delay(100); // 80ms min
  346. AD7124_ReadReg(dev, AD7124_ADC_CTRL_REG, &regTrans, 2);
  347. }
  348. if(calibrateType & AD7124_CALIBRATE_SYS_ZERO){
  349. AD7124_WriteReg(dev, AD7124_ADC_CTRL_REG, 0x009C, 2); // sys zero cal
  350. AD7124_ReadReg(dev, AD7124_ADC_CTRL_REG, &regTrans, 2);
  351. dev->delay(100); // 80ms min
  352. AD7124_ReadReg(dev, AD7124_ADC_CTRL_REG, &regTrans, 2);
  353. }
  354. AD7124_WriteReg(dev, AD7124_ADC_CTRL_REG, cfg->AD7124_ADC_CTRL_REG_t, 2); // detect mode
  355. printf_ATY_D("\r\n");
  356. dev->delay(1);
  357. return 0;
  358. }
  359. /**
  360. * @brief
  361. *
  362. * @param dev
  363. * @return uint8_t
  364. */
  365. uint8_t AD7124_ReadAllReg(struct AD7124_ATY_Dev* dev, struct AD7124_ATY_Cfg* cfg){
  366. uint8_t i = 0;
  367. uint32_t* p = (uint32_t*)cfg;
  368. printf_ATY_D("%s--AllRegs %d", AD7124_ATY_TAG, (sizeof(struct AD7124_ATY_Cfg) / sizeof(uint32_t)));
  369. for(i = 0; i < (sizeof(struct AD7124_ATY_Cfg) / sizeof(uint32_t)); i++){ // 0x00~0x38
  370. printf_ATY_D("\r\nReg 0x%02X: ", i);
  371. AD7124_ReadReg(dev, i, (p + i), 3);
  372. }
  373. // AD7124_ReadReg(AD7124_ADC_CTRL_REG, groupTrans, 2, dev);
  374. printf_ATY_D("\r\n");
  375. return 0;
  376. }
  377. #endif /* __AD7124_ATY_C */
  378. /************************************ etc *************************************/
  379. /* init
  380. // AD7124 ----------------------------------------------------------------------
  381. #include "AD7124_ATY.h"
  382. uint8_t group_AD7124_Data[5] = {0};
  383. void AD7124_1_NSS_SET(uint8_t level){
  384. if(level == __ATY_HL_L)
  385. HAL_GPIO_WritePin(SPI2_NSS_GPIO_Port, SPI2_NSS_Pin, GPIO_PIN_RESET);
  386. else if(level == __ATY_HL_H)
  387. HAL_GPIO_WritePin(SPI2_NSS_GPIO_Port, SPI2_NSS_Pin, GPIO_PIN_SET);
  388. }
  389. void AD7124_1_EN_SET(uint8_t level){}
  390. void AD7124_1_SYNC_SET(uint8_t level){}
  391. uint8_t AD7124_1_SPI(uint8_t* data_t, uint16_t len){
  392. return HAL_SPI_TransmitReceive(&hspi2, (uint8_t*)data_t, (uint8_t*)data_t, len, 1000);
  393. }
  394. // config template
  395. struct AD7124_ATY_Cfg AD7124_ATY_Cfg_CHIP_T = {
  396. .AD7124_ADC_CTRL_REG_t = 0x0580,
  397. .AD7124_CFG0_REG_t = 0x09F0,
  398. .AD7124_CH0_MAP_REG_t = 0x8211, // IC Temp, int vref
  399. };
  400. struct AD7124_ATY_Cfg AD7124_ATY_Cfg_NTC10_O1 = {
  401. .AD7124_ADC_CTRL_REG_t = 0x0580,
  402. .AD7124_CFG1_REG_t = 0x09F0,
  403. .AD7124_FILT1_REG_t = 0x0060180,
  404. .AD7124_GAIN1_REG_t = 0x5558CC,
  405. .AD7124_CH0_MAP_REG_t = 0x918D,
  406. };
  407. struct AD7124_ATY_Cfg AD7124_ATY_Cfg_RTD4_1 = {
  408. .AD7124_ADC_CTRL_REG_t = 0x0480,
  409. .AD7124_IO_CTRL1_REG_t = 0x000400,
  410. // .AD7124_ERREN_REG_t = 0x06FFFF,
  411. .AD7124_CFG0_REG_t = 0x09E4,
  412. .AD7124_FILT0_REG_t = 0x0060180,
  413. .AD7124_GAIN0_REG_t = 0x5558CC,
  414. .AD7124_CH0_MAP_REG_t = 0x9211, //IC Temp
  415. .AD7124_CFG1_REG_t = 0x09E4,
  416. .AD7124_FILT1_REG_t = 0x0060180,
  417. .AD7124_GAIN1_REG_t = 0x05558CC,
  418. .AD7124_CH1_MAP_REG_t = 0x9022,
  419. };
  420. struct AD7124_ATY_Cfg AD7124_ATY_Cfg_NTC1_1 = {
  421. .AD7124_ADC_CTRL_REG_t = 0x0480,
  422. .AD7124_IO_CTRL1_REG_t = 0x002040,
  423. .AD7124_CFG1_REG_t = 0x09E1,
  424. .AD7124_FILT1_REG_t = 0x0060180,
  425. .AD7124_GAIN1_REG_t = 0x05558CC,
  426. // 500uA * 5.11K = 2.5Vref, 1K gain 2 max
  427. .AD7124_CH2_MAP_REG_t = 0x90A6,
  428. };
  429. struct AD7124_ATY_Cfg AD7124_ATY_Cfg_NTC10_1 = {
  430. .AD7124_ADC_CTRL_REG_t = 0x0580,
  431. .AD7124_CFG1_REG_t = 0x09F0,
  432. .AD7124_FILT1_REG_t = 0x0060180,
  433. .AD7124_GAIN1_REG_t = 0x5558CC,
  434. .AD7124_CH3_MAP_REG_t = 0x918D,
  435. .AD7124_CH4_MAP_REG_t = 0x91CF,
  436. };
  437. struct AD7124_ATY_Cfg AD7124_ATY_Cfg_TC_1 = {
  438. .AD7124_ADC_CTRL_REG_t = 0x0580,
  439. .AD7124_IO_CTRL2_REG_t = 0x0500,
  440. .AD7124_CFG1_REG_t = 0x09F7,
  441. .AD7124_FILT1_REG_t = 0x0060180,
  442. .AD7124_GAIN1_REG_t = 0x5558CC,
  443. .AD7124_CH5_MAP_REG_t = 0x9109,
  444. .AD7124_CH6_MAP_REG_t = 0x914B,
  445. };
  446. struct AD7124_ATY_Dev AD7124_ATY_Dev_1 = {
  447. .enSet = AD7124_1_EN_SET,
  448. .syncSet = AD7124_1_SYNC_SET,
  449. .nssSet = AD7124_1_NSS_SET,
  450. .spiProcess = AD7124_1_SPI,
  451. .initFlag = 0,
  452. .addr = 0,
  453. .id = 0,
  454. .data = group_AD7124_Data,
  455. // .cfg = &AD7124_ATY_Cfg_NTC10_O1,
  456. .cfg = &AD7124_ATY_Cfg_CHIP_T,
  457. .delay = HAL_Delay,
  458. .lock = __ATY_UNLOCKED
  459. };
  460. */
  461. /* use
  462. // tested 18ms fastest at stm32f103cbt6 72MHz, spi 18MBit/s, line 50mm, signal channel IC T
  463. #define AD_INIT_MAX_COUNT 8
  464. uint8_t adDetectType = 0; // 0: IC Temp / user channel, 1: RTD, 2: NTC1K, 34: NTC10K, 56: TC
  465. uint32_t ad7124Code = 0;
  466. void AD7124_Calc(uint8_t* codeGroup){
  467. if((codeGroup[4] & 0x80) != 0){
  468. AD7124_ATY_Dev_1.initFlag++;
  469. if(AD7124_ATY_Dev_1.initFlag > AD_INIT_MAX_COUNT){
  470. AD7124_ATY_Dev_1.initFlag = 0;
  471. }
  472. return;
  473. }
  474. if((codeGroup[4] & 0x0F) != adDetectType){
  475. AD7124_ATY_Dev_1.initFlag++;
  476. if(AD7124_ATY_Dev_1.initFlag > AD_INIT_MAX_COUNT)
  477. AD7124_ATY_Dev_1.initFlag = 0;
  478. return;
  479. }
  480. ad7124Code = (codeGroup[3] + (codeGroup[2] << 8) + (codeGroup[1] << 16));
  481. printf_ATY("\r\nChip: %f", (((float)(ad7124Code - 0x800000) / 13584.0) - 272.5));
  482. // Type Calc
  483. float calcVol = 0, calcRes = 0, fastTempCalc = 0, aboveTempCalc = 0, belowTempCalc = 0;
  484. if((codeGroup[4] & 0x0F) == 0){ // IC Temp
  485. fastTempCalc = ((float)(ad7124Code - 0x800000) / 13584.0) - 272.5;
  486. }
  487. if((codeGroup[4] & 0x0F) == 1){ // RTD4
  488. calcRes = AD7124_DataToRes(ad7124Code, 24, 5110.0, 16);
  489. }
  490. if((codeGroup[4] & 0x0F) == 2){ // NTC1K
  491. calcRes = AD7124_DataToRes(ad7124Code, 24, 5110.0, 2);
  492. }
  493. if(((codeGroup[4] & 0x0F) == 3) || ((codeGroup[4] & 0x0F) == 4)){ // NTC10K
  494. calcRes = 10.0 * 1000.0 * ((double)((double)(ad7124Code - 0x800000) / (double)(0x1000000 - ad7124Code)));
  495. }
  496. if(((codeGroup[4] & 0x0F) == 5) || ((codeGroup[4] & 0x0F) == 6)){ // TC
  497. calcVol = (((float)ad7124Code - 8388608.0) * 2500.0 / (128.0 * 8388608.0));
  498. }
  499. // Type Table, put table out of function!!
  500. const uint16_t RT_table_N30toP50_1_T_size = 81;
  501. const double RT_table_N30toP50_1_T[81] = {-30, -29, -28, -27, -26, -25, -24, -23, -22, -21, -20, -19, -18, -17, -16, -15, -14, -13, -12, -11, -10, -9, -8, -7, -6, -5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50};
  502. const double RT_table_PT1000_N30toP50_1_R[81] = {882.21656767, 886.1604620248771, 890.1030863723519, 894.0444460833969, 897.984546428592, 901.9233925781249, 905.8609896017921, 909.797342468997, 913.7324560487519, 917.666335109677, 921.5989843200001, 925.530408247557, 929.460611359792, 933.389598023757, 937.317372506112, 941.243938973125, 945.1693014906721, 949.0934640242369, 953.0164304389119, 956.938204499397, 960.85878987, 964.7781901146369, 968.696408696832, 972.613448979717, 976.529314226032, 980.444007598125, 984.3575321579519, 988.2698908670769, 992.1810865866721, 996.091122077517, 1000, 1003.9077225, 1007.81429, 1011.7197025, 1015.6239599999999, 1019.5270625000002, 1023.4290100000001, 1027.3298025, 1031.2294399999998, 1035.1279225, 1039.02525, 1042.9214224999998, 1046.81644, 1050.7103025, 1054.60301, 1058.4945625000003, 1062.38496, 1066.2742025, 1070.16229, 1074.0492225, 1077.935, 1081.8196225, 1085.70309, 1089.5854024999999, 1093.46656, 1097.3465625000001, 1101.22541, 1105.1031025, 1108.97964, 1112.8550225, 1116.7292499999999, 1120.6023225, 1124.47424, 1128.3450025000002, 1132.2146100000002, 1136.0830625, 1139.95036, 1143.8165025, 1147.68149, 1151.5453224999999, 1155.408, 1159.2695224999998, 1163.12989, 1166.9891025000002, 1170.84716, 1174.7040625, 1178.5598100000002, 1182.4144025, 1186.26784, 1190.1201225, 1193.97125};
  503. const double RT_table_NTC10K_B3950_N30toP50_1_R[81] = {200203.9024466842, 187316.35371436414, 175353.56517945265, 164242.815037761, 153917.57353446394, 144316.93726809666, 135385.11855020453, 127070.98414555467, 119327.63833441163, 112112.04578468086, 105384.690206038, 99109.26518793346, 93252.3940049376, 87783.37551199133, 82673.95355365716, 77898.10757980836, 73431.86239916032, 69253.11521500889, 65341.47827746307, 61678.13565594302, 58245.71278707882, 55028.15758840015, 52010.63204917008, 49179.41331794596, 46521.80340337541, 44026.046691571566, 41681.25456127495, 39477.33644786429, 37404.936769989145, 35455.37718893085, 33620.60372143574, 31893.138272305434, 30266.034194017953, 28732.835517560583, 27287.53953191174, 25924.56241959352, 24638.70768276219, 23425.137118719744, 22279.344125776763, 21197.12914032421, 20174.57702398485, 19208.036236013788, 18294.09964087108, 17429.586814247774, 16611.527722935953, 15837.147664908136, 15103.853365929419, 14409.220138062792, 13750.980013633698, 13127.010775676536, 12535.32581266281, 11974.064731474306, 11441.484668193882, 10935.952241391826, 10455.936097237052, 10000, 9566.796425378521, 9155.060617602236, 8763.605074487228, 8391.314427550227, 8037.140686973136, 7700.09882366077, 7379.2626628761145, 7073.761065987096, 6782.774378735532, 6505.531126156567, 6241.304935849771, 5989.411672745506, 5749.206769831047, 5520.082740513648, 5301.466859409668, 5092.818999369683, 4893.62961348718, 4703.417851699504, 4521.7298023814565, 4348.136850059472, 4182.234141043995, 4023.6391493935307, 3871.990336190894, 3726.945895634597, 3588.1825819290834};
  504. const double RT_table_NTC10K_B3380_N30toP50_1_R[81] = {129916.73842576398, 122726.45506217859, 115987.98389609528, 109669.80710548842, 103742.81092588141, 98180.08736222527, 92956.75343550005, 88049.78631286524, 83437.87283482423, 79101.27210022854, 75021.689901878, 71182.16392373295, 67566.95871677202, 64161.46956567978, 60952.13444397613, 57926.35333195929, 55072.41424084727, 52379.42534858893, 49837.25270871057, 47436.46304390781, 45168.27118147633, 43024.49172859917, 40997.49462244794, 39080.16422340271, 37265.86164983361, 35548.39008012747, 33921.96277228722, 32381.173573736873, 30920.9697141643, 29536.62669253702, 28223.725086022154, 26978.129123593826, 25795.96688077618, 24673.61196437721, 23607.66656734277, 22594.945784110834, 21632.463086167136, 20717.41686598908, 19847.177965288593, 19019.278110503867, 18231.399184902846, 17481.363272511575, 16767.123414418118, 16086.755022872807, 15438.44790305672, 14820.498836453826, 14231.304683479702, 13669.355966418227, 13133.230896827301, 12621.589814422336, 12133.170007053395, 11666.78088378108, 11221.299475246835, 10795.666237541593, 10388.881137620136, 10000, 9628.131096037672, 9272.431958502, 8932.106405476528, 8606.401758829414, 8294.606243598528, 7996.046555661133, 7710.085585997876, 7436.120290726329, 7173.579696877923, 6921.923034627457, 6680.637987362497, 6449.239051606348, 6227.265999385221, 6014.2824361639205, 5809.8744479667575, 5613.649331755301, 5425.234403555528, 5244.275879215621, 5070.437823035709, 4903.401159843523, 4742.862746398391, 4588.534498291319, 4440.142568773257, 4297.426576188887, 4160.138876920097};
  505. if(ntcType == 0){
  506. fastTempCalc = ALGO_RT_Table_R2T(calcRes * 1.0,
  507. RT_table_N30toP50_1_T,
  508. RT_table_Custom3950_N30toP50_1_R,
  509. RT_table_N30toP50_1_T_size);
  510. }
  511. else if(ntcType == 1){
  512. fastTempCalc = ALGO_RT_Table_R2T(calcRes * 1.0,
  513. RT_table_N30toP50_1_T,
  514. RT_table_NTC10K_B3380_N30toP50_1_R,
  515. RT_table_N30toP50_1_T_size);
  516. }
  517. else if(ntcType == 2){
  518. fastTempCalc = ALGO_RT_Table_R2T(calcRes * 1.0,
  519. RT_table_N30toP50_1_T,
  520. RT_table_NTC10K_B3950_N30toP50_1_R,
  521. RT_table_N30toP50_1_T_size);
  522. }
  523. // offset
  524. fastTempCalc = (fastTempCalc * 1000.0) + 180.0;
  525. }
  526. void AD7124_Detect(void){
  527. static uint8_t lastChannel = 0;
  528. if(lastChannel != adDetectType){
  529. lastChannel = adDetectType;
  530. AD7124_ATY_Dev_1.initFlag++;
  531. if(AD7124_ATY_Dev_1.initFlag > AD_INIT_MAX_COUNT)
  532. AD7124_ATY_Dev_1.initFlag = 0;
  533. return;
  534. }
  535. switch(adDetectType){
  536. case 0:
  537. case 1:
  538. // AD7124_Calibrate(AD7124_CALIBRATE_INT_FULL | AD7124_CALIBRATE_INT_ZERO,
  539. // &AD7124_ATY_Cfg_RTD4_1, &AD7124_ATY_Dev_1);
  540. AD7124_ReadData(group_AD7124_Data, &AD7124_ATY_Dev_1);
  541. AD7124_Calc(group_AD7124_Data);
  542. AD7124_ReadData(group_AD7124_Data, &AD7124_ATY_Dev_1);
  543. AD7124_Calc(group_AD7124_Data);
  544. break;
  545. case 2:
  546. AD7124_Calibrate(AD7124_CALIBRATE_INT_FULL | AD7124_CALIBRATE_INT_ZERO,
  547. &AD7124_ATY_Cfg_NTC1_1, &AD7124_ATY_Dev_1);
  548. AD7124_ReadData(group_AD7124_Data, &AD7124_ATY_Dev_1);
  549. AD7124_Calc(group_AD7124_Data);
  550. break;
  551. case 3:
  552. case 4:
  553. AD7124_Calibrate(AD7124_CALIBRATE_INT_FULL | AD7124_CALIBRATE_INT_ZERO,
  554. &AD7124_ATY_Cfg_NTC10_1, &AD7124_ATY_Dev_1);
  555. AD7124_ReadData(group_AD7124_Data, &AD7124_ATY_Dev_1);
  556. AD7124_Calc(group_AD7124_Data);
  557. AD7124_ReadData(group_AD7124_Data, &AD7124_ATY_Dev_1);
  558. AD7124_Calc(group_AD7124_Data);
  559. break;
  560. case 5:
  561. case 6:
  562. AD7124_Calibrate(AD7124_CALIBRATE_INT_FULL | AD7124_CALIBRATE_INT_ZERO,
  563. &AD7124_ATY_Cfg_TC_1, &AD7124_ATY_Dev_1);
  564. AD7124_ReadData(group_AD7124_Data, &AD7124_ATY_Dev_1);
  565. AD7124_Calc(group_AD7124_Data);
  566. AD7124_ReadData(group_AD7124_Data, &AD7124_ATY_Dev_1);
  567. AD7124_Calc(group_AD7124_Data);
  568. break;
  569. default:
  570. break;
  571. }
  572. }
  573. */
  574. /* calc
  575. // IC Temp
  576. fastTempCalc = ((float)(ad7124Code - 0x800000) / 13584.0) - 272.5;
  577. // RTD4
  578. calcRes = AD7124_DataToRes(ad7124Code, 24, 5110.0, 16);
  579. fastTempCalc = ALGO_Temp_RTD_Res_Fast(calcRes);
  580. aboveTempCalc = ALGO_Temp_RTD_Res_Above(calcRes);
  581. belowTempCalc = ALGO_Temp_RTD_Res_Below(calcRes);
  582. // NTC1K
  583. calcRes = AD7124_DataToRes(ad7124Code, 24, 5110.0, 2);
  584. fastTempCalc = ALGO_ResToKelvinTemp((calcRes / 1000.0), 1.0, 3950);
  585. // NTC10K
  586. calcVol = (((float)ad7124Code - 8388608.0) * 2500.0 / (1.0 * 8388608.0));
  587. calcRes = ((calcVol * 10.0) / (2500.0 - calcVol));
  588. fastTempCalc = ALGO_ResToKelvinTemp(calcRes, 10.0, 3380);
  589. // TC
  590. calcVol = (((float)ad7124Code - 8388608.0) * 2500.0 / (128.0 * 8388608.0));
  591. float coldTemp = 25.0;
  592. float calcVolCold = ALGO_Temp_TC_TempToVol('T', coldTemp);
  593. calcVol += calcVolCold;
  594. aboveTempCalc = ALGO_Temp_TC_VolToTemp('T', calcVol);
  595. belowTempCalc = ALGO_Temp_TC_VolToTemp('T', calcVol);
  596. fastTempCalc = aboveTempCalc;
  597. */
  598. /******************************************************************************/
  599. /******************************** End Of File *********************************/