AD5933_ATY.c 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197
  1. /**
  2. * @file AD5933_ATY.c
  3. *
  4. * @param Project DEVICE_GENERAL_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 AD5933 for C platform
  20. *
  21. * @version
  22. * - 1_01_24015 > ATY
  23. * -# Preliminary version, first Release
  24. ********************************************************************************
  25. */
  26. #ifndef __AD5933_ATY_C
  27. #define __AD5933_ATY_C
  28. #include "AD5933_ATY.h"
  29. /******************************* For user *************************************/
  30. /******************************************************************************/
  31. uint8_t AD5933_Write(uint8_t addr, uint8_t* data_t, uint8_t len, struct AD5933_ATY_Dev* dev)
  32. {
  33. uint8_t errCode = 0;
  34. __ATY_LOCK(dev);
  35. errCode = dev->i2cProcess(dev->addr, data_t, len, __ATY_RW_W);
  36. __ATY_UNLOCK(dev);
  37. return errCode;
  38. }
  39. uint8_t AD5933_Read(uint8_t addr, uint8_t* data_t, uint8_t len, struct AD5933_ATY_Dev* dev)
  40. {
  41. uint8_t errCode = 0;
  42. __ATY_LOCK(dev);
  43. errCode = dev->i2cProcess(dev->addr, data_t, len, __ATY_RW_R);
  44. __ATY_UNLOCK(dev);
  45. return errCode;
  46. }
  47. uint8_t AD5933_WriteReg(uint8_t reg, uint8_t data, struct AD5933_ATY_Dev* dev)
  48. {
  49. uint8_t errCode = 0;
  50. uint8_t data_t[2] = {reg, data};
  51. errCode = AD5933_Write(dev->addr, data_t, 2, dev);
  52. return errCode;
  53. }
  54. uint8_t AD5933_ReadReg(uint8_t reg, uint8_t* data, struct AD5933_ATY_Dev* dev)
  55. {
  56. uint8_t errCode = 0;
  57. uint8_t data_t[2] = {reg, 0xB0};
  58. errCode = AD5933_Write(dev->addr, data_t, 2, dev);
  59. errCode = AD5933_Read(dev->addr, data_t, 2, dev);
  60. *data = data_t[1];
  61. return errCode;
  62. }
  63. void AD5933_Init(struct AD5933_ATY_Dev* dev)
  64. {
  65. // Transmit to start frequency register
  66. // program 30khz start frequency assuming internal osc of 16.776Khz
  67. AD5933_WriteReg(0x84, 0x45, dev);
  68. AD5933_WriteReg(0x83, 0xA6, dev);
  69. AD5933_WriteReg(0x82, 0x0E, dev);
  70. // Transmit to frequency increment register
  71. // program 1Khz frequency increment assuming internal osc of 16.776Khz
  72. AD5933_WriteReg(0x87, 0x02, dev);
  73. AD5933_WriteReg(0x86, 0x7D, dev);
  74. AD5933_WriteReg(0x85, 0x00, dev);
  75. // Transmit to NUMBER OF INCREMENTS register
  76. // program 10 frequency increments
  77. AD5933_WriteReg(0x89, 0x0A, dev);
  78. AD5933_WriteReg(0x88, 0x00, dev);
  79. // Transmit to settling time cycles register
  80. // program 15 output cycles at each frequency before a adc conversion
  81. AD5933_WriteReg(0x8B, 0x0F, dev);
  82. AD5933_WriteReg(0x8A, 0x00, dev);
  83. // Transmit to CONTROL register
  84. // place the AD5933 in standby mode
  85. AD5933_WriteReg(0x80, 0xB0, dev);
  86. // Choose the internal system clock
  87. AD5933_WriteReg(0x81, 0x00, dev);
  88. // Choose range 1 (2vp-p, 1.6v) PGA = x1
  89. AD5933_WriteReg(0x80, 0x01, dev);
  90. // initialise the sensor with contents of start frequency regsister with range 1 (2vp-p, 1.6v) PGA = x1
  91. AD5933_WriteReg(0x80, 0x10, dev);
  92. // start of frequency swee, devp (2vp-p, 1.6v) PGA = x1
  93. AD5933_WriteReg(0x80, 0x20, dev);
  94. // initialise the sweep sequence
  95. AD5933_Measure(dev);
  96. // //issue a measure temperature command to the control register
  97. // AD5933_WriteReg(0x80, 0x90, dev);
  98. // // read the temperature data and send to uart
  99. // Measure_Temp(dev);
  100. }
  101. // status reg D0 = valid temp, D1 = valid real/imag data, D2 = frequency sweep complete
  102. void AD5933_Measure(struct AD5933_ATY_Dev* dev)
  103. {
  104. while(1){
  105. // D1 status reg loop
  106. uint8_t status = 0;
  107. AD5933_ReadReg(0x8F, &status, dev);
  108. // mask off the valid data bit
  109. status = (status & 0x02);
  110. for(uint16_t i = 0; i < 10000; i++){}
  111. // printf("Status: %02X\r\n", status);
  112. // valid data should be present after start freqy command
  113. if(((status) | 0xFD) == 0xFF)
  114. {
  115. // D1 true condition
  116. AD5933_ReadReg(0x8F, &status, dev);
  117. // D2 test condition
  118. if((status | 0xFB) != 0xFF)
  119. {
  120. uint8_t real_byte_high = 0, real_byte_low = 0, imag_byte_high = 0, imag_byte_low = 0;
  121. AD5933_ReadReg(0x94, &real_byte_high, dev);
  122. AD5933_ReadReg(0x95, &real_byte_low, dev);
  123. AD5933_ReadReg(0x96, &imag_byte_high, dev);
  124. AD5933_ReadReg(0x97, &imag_byte_low, dev);
  125. uint16_t real_data = ((real_byte_high << 8) | real_byte_low);
  126. uint16_t imag_data = ((imag_byte_high << 8) | imag_byte_low);
  127. // printf("Original real register = 0x%02x\r\n", (unsigned int)((unsigned short)real_data));
  128. // printf("Orocessed real register = %d(decimal equivilant)\r\n", (int)real_data);
  129. // printf("Original imag register = 0x%02X\r\n", (unsigned int)((unsigned short)imag_data));
  130. // printf("Orocessed imag register = %d(decimal equivilant)\r\n", (int)imag_data);
  131. printf("%d %d\r\n", (uint16_t)real_data, (uint16_t)imag_data);
  132. // increment to the next frequency
  133. status = 0x30;
  134. AD5933_WriteReg(0x80, status, dev);
  135. }
  136. else // End of frequency sweep exit loop
  137. {
  138. // printf("Status: %02X\r\n", status);
  139. // printf("end sweep\r\n");
  140. break;
  141. }
  142. }
  143. }
  144. }
  145. #endif /* __AD5933_ATY_C */
  146. /************************************ etc *************************************/
  147. // void LOG_ALL(uint8_t* str){ printf((const char*)str); }
  148. /* init */
  149. // uint8_t AD5933_1_I2C(uint8_t addr, uint8_t* data_t, uint8_t len, uint8_t rw){
  150. // if(rw == __ATY_RW_W)
  151. // return (uint8_t)HAL_I2C_Master_Transmit(&hi2c1, (addr << 1 | 0), data_t, len, 1000);
  152. // else if(rw == __ATY_RW_R)
  153. // return (uint8_t)HAL_I2C_Master_Receive(&hi2c1, (addr << 1 | 1), data_t, len, 1000);
  154. // }
  155. // struct AD5933_ATY_Dev AD5933_ATY_t_1 = {
  156. // .addr = AD5933_ADDRESS,
  157. // .i2cProcess = AD5933_1_I2C,
  158. // .lock = __ATY_UNLOCKED,
  159. // .debugEnable = 0,
  160. // };
  161. /* use */
  162. // AD5933_SetValue(0xF0, &AD5933_ATY_t_1);
  163. // AD5933_GetValue(&getValue, &AD5933_ATY_t_1);
  164. /******************************************************************************/
  165. /******************************** End Of File *********************************/