test_adc.c 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608
  1. /*
  2. * SPDX-FileCopyrightText: 2020-2022 Espressif Systems (Shanghai) CO LTD
  3. *
  4. * SPDX-License-Identifier: Apache-2.0
  5. */
  6. #include "sdkconfig.h"
  7. #include <sys/param.h>
  8. #include <string.h>
  9. #include "esp_log.h"
  10. #include "test_utils.h"
  11. #include "esp_adc_cal.h"
  12. #include "driver/adc_common.h"
  13. #include "esp_cpu.h"
  14. __attribute__((unused)) static const char *TAG = "ADC";
  15. #if !TEMPORARY_DISABLED_FOR_TARGETS(ESP32, ESP32S2, ESP32S3, ESP32C3, ESP32C2)
  16. //TODO: IDF-3160
  17. #define TEST_COUNT 4096
  18. #define MAX_ARRAY_SIZE 4096
  19. #define TEST_ATTEN ADC_ATTEN_MAX //Set to ADC_ATTEN_*db to test a single attenuation only
  20. static int s_adc_count[MAX_ARRAY_SIZE]={};
  21. static int s_adc_offset = -1;
  22. static int insert_point(uint32_t value)
  23. {
  24. const bool fixed_size = true;
  25. if (s_adc_offset < 0) {
  26. if (fixed_size) {
  27. TEST_ASSERT_GREATER_OR_EQUAL(4096, MAX_ARRAY_SIZE);
  28. s_adc_offset = 0; //Fixed to 0 because the array can hold all the data in 12 bits
  29. } else {
  30. s_adc_offset = MAX((int)value - MAX_ARRAY_SIZE/2, 0);
  31. }
  32. }
  33. if (!fixed_size && (value < s_adc_offset || value >= s_adc_offset + MAX_ARRAY_SIZE)) {
  34. TEST_ASSERT_GREATER_OR_EQUAL(s_adc_offset, value);
  35. TEST_ASSERT_LESS_THAN(s_adc_offset + MAX_ARRAY_SIZE, value);
  36. }
  37. s_adc_count[value - s_adc_offset] ++;
  38. return value - s_adc_offset;
  39. }
  40. static void reset_array(void)
  41. {
  42. memset(s_adc_count, 0, sizeof(s_adc_count));
  43. s_adc_offset = -1;
  44. }
  45. static uint32_t get_average(void)
  46. {
  47. uint32_t sum = 0;
  48. int count = 0;
  49. for (int i = 0; i < MAX_ARRAY_SIZE; i++) {
  50. sum += s_adc_count[i] * (s_adc_offset+i);
  51. count += s_adc_count[i];
  52. }
  53. return sum/count;
  54. }
  55. static void print_summary(bool figure)
  56. {
  57. const int MAX_WIDTH=20;
  58. int max_count = 0;
  59. int start = -1;
  60. int end = -1;
  61. uint32_t sum = 0;
  62. int count = 0;
  63. for (int i = 0; i < MAX_ARRAY_SIZE; i++) {
  64. if (s_adc_count[i] > max_count) {
  65. max_count = s_adc_count[i];
  66. }
  67. if (s_adc_count[i] > 0 && start < 0) {
  68. start = i;
  69. }
  70. if (s_adc_count[i] > 0) {
  71. end = i;
  72. }
  73. count += s_adc_count[i];
  74. sum += s_adc_count[i] * (s_adc_offset+i);
  75. }
  76. if (figure) {
  77. for (int i = start; i <= end; i++) {
  78. printf("%4d ", i+s_adc_offset);
  79. int count = s_adc_count[i] * MAX_WIDTH / max_count;
  80. for (int j = 0; j < count; j++) {
  81. putchar('|');
  82. }
  83. printf(" %d\n", s_adc_count[i]);
  84. }
  85. }
  86. float average = (float)sum/count;
  87. float variation_square = 0;
  88. for (int i = start; i <= end; i ++) {
  89. if (s_adc_count[i] == 0) {
  90. continue;
  91. }
  92. float delta = i + s_adc_offset - average;
  93. variation_square += (delta * delta) * s_adc_count[i];
  94. }
  95. printf("%d points.\n", count);
  96. printf("average: %.1f\n", (float)sum/count);
  97. printf("std: %.2f\n", sqrt(variation_square/count));
  98. }
  99. static void continuous_adc_init(uint16_t adc1_chan_mask, uint16_t adc2_chan_mask, adc_channel_t *channel, uint8_t channel_num, adc_atten_t atten)
  100. {
  101. adc_digi_init_config_t adc_dma_config = {
  102. .max_store_buf_size = TEST_COUNT*2,
  103. .conv_num_each_intr = 128,
  104. .adc1_chan_mask = adc1_chan_mask,
  105. .adc2_chan_mask = adc2_chan_mask,
  106. };
  107. TEST_ESP_OK(adc_digi_initialize(&adc_dma_config));
  108. adc_digi_pattern_table_t adc_pattern[10] = {0};
  109. adc_digi_config_t dig_cfg = {
  110. .conv_limit_en = 0,
  111. .conv_limit_num = 250,
  112. .sample_freq_hz = 83333,
  113. };
  114. dig_cfg.adc_pattern_len = channel_num;
  115. for (int i = 0; i < channel_num; i++) {
  116. uint8_t unit = ((channel[i] >> 3) & 0x1);
  117. uint8_t ch = channel[i] & 0x7;
  118. adc_pattern[i].atten = atten;
  119. adc_pattern[i].channel = ch;
  120. adc_pattern[i].unit = unit;
  121. }
  122. dig_cfg.adc_pattern = adc_pattern;
  123. TEST_ESP_OK(adc_digi_controller_config(&dig_cfg));
  124. }
  125. TEST_CASE("test_adc_dma", "[adc][ignore][manual]")
  126. {
  127. uint16_t adc1_chan_mask = BIT(2);
  128. uint16_t adc2_chan_mask = 0;
  129. adc_channel_t channel[1] = {ADC1_CHANNEL_2};
  130. adc_atten_t target_atten = TEST_ATTEN;
  131. const int output_data_size = sizeof(adc_digi_output_data_t);
  132. int buffer_size = TEST_COUNT*output_data_size;
  133. uint8_t* read_buf = malloc(buffer_size);
  134. TEST_ASSERT_NOT_NULL(read_buf);
  135. adc_atten_t atten;
  136. bool print_figure;
  137. if (target_atten == ADC_ATTEN_MAX) {
  138. atten = ADC_ATTEN_DB_0;
  139. target_atten = ADC_ATTEN_DB_11;
  140. print_figure = false;
  141. } else {
  142. atten = target_atten;
  143. print_figure = true;
  144. }
  145. while (1) {
  146. ESP_LOGI("TEST_ADC", "Test with atten: %d", atten);
  147. memset(read_buf, 0xce, buffer_size);
  148. bool do_calibration = false;
  149. esp_adc_cal_characteristics_t chan1_char = {};
  150. esp_adc_cal_value_t cal_ret = esp_adc_cal_characterize(ADC_UNIT_1, atten, ADC_WIDTH_12Bit, 0, &chan1_char);
  151. if (cal_ret == ESP_ADC_CAL_VAL_EFUSE_TP) {
  152. do_calibration = true;
  153. }
  154. continuous_adc_init(adc1_chan_mask, adc2_chan_mask, channel, sizeof(channel) / sizeof(adc_channel_t), atten);
  155. adc_digi_start();
  156. int remain_count = TEST_COUNT;
  157. while (remain_count) {
  158. int already_got = TEST_COUNT - remain_count;
  159. uint32_t ret_num;
  160. TEST_ESP_OK(adc_digi_read_bytes(read_buf + already_got*output_data_size,
  161. remain_count*output_data_size, &ret_num, ADC_MAX_DELAY));
  162. TEST_ASSERT((ret_num % output_data_size) == 0);
  163. remain_count -= ret_num / output_data_size;
  164. }
  165. adc_digi_output_data_t *p = (void*)read_buf;
  166. reset_array();
  167. for (int i = 0; i < TEST_COUNT; i++) {
  168. insert_point(p[i].type2.data);
  169. }
  170. print_summary(print_figure);
  171. if (do_calibration) {
  172. uint32_t raw = get_average();
  173. uint32_t voltage_mv = esp_adc_cal_raw_to_voltage(raw, &chan1_char);
  174. printf("Voltage = %d mV\n", voltage_mv);
  175. }
  176. adc_digi_stop();
  177. TEST_ESP_OK(adc_digi_deinitialize());
  178. if (atten == target_atten) {
  179. break;
  180. }
  181. atten++;
  182. }
  183. free(read_buf);
  184. }
  185. TEST_CASE("test_adc_single", "[adc][ignore][manual]")
  186. {
  187. adc_atten_t target_atten = TEST_ATTEN;
  188. adc_atten_t atten;
  189. bool print_figure;
  190. if (target_atten == ADC_ATTEN_MAX) {
  191. atten = ADC_ATTEN_DB_0;
  192. target_atten = ADC_ATTEN_DB_11;
  193. print_figure = false;
  194. } else {
  195. atten = target_atten;
  196. print_figure = true;
  197. }
  198. adc1_config_width(ADC_WIDTH_BIT_12);
  199. while (1) {
  200. ESP_LOGI("TEST_ADC", "Test with atten: %d", atten);
  201. adc1_config_channel_atten(ADC1_CHANNEL_2, atten);
  202. bool do_calibration = false;
  203. esp_adc_cal_characteristics_t chan1_char = {};
  204. esp_adc_cal_value_t cal_ret = esp_adc_cal_characterize(ADC_UNIT_1, atten, ADC_WIDTH_12Bit, 0, &chan1_char);
  205. if (cal_ret == ESP_ADC_CAL_VAL_EFUSE_TP) {
  206. do_calibration = true;
  207. }
  208. const int test_count = TEST_COUNT;
  209. adc1_channel_t channel = ADC1_CHANNEL_2;
  210. while (1) {
  211. reset_array();
  212. for (int i = 0; i < test_count; i++) {
  213. uint32_t raw = adc1_get_raw(channel);
  214. insert_point(raw);
  215. }
  216. print_summary(print_figure);
  217. break;
  218. }
  219. if (do_calibration) {
  220. uint32_t raw = get_average();
  221. uint32_t voltage_mv = esp_adc_cal_raw_to_voltage(raw, &chan1_char);
  222. printf("Voltage = %d mV\n", voltage_mv);
  223. }
  224. if (atten == target_atten) {
  225. break;
  226. }
  227. atten++;
  228. }
  229. }
  230. #endif //#if !TEMPORARY_DISABLED_FOR_TARGETS(ESP32, ESP32S2, ESP32S3, ESP32C3, ESP32C2)
  231. #if !TEMPORARY_DISABLED_FOR_TARGETS(ESP32C2) //TODO IDF-3908
  232. /********************************************************************************
  233. * ADC Speed Related Tests
  234. ********************************************************************************/
  235. #define RECORD_TIME_PREPARE() uint32_t __t1, __t2
  236. #define RECORD_TIME_START() do {__t1 = esp_cpu_get_ccount();}while(0)
  237. #define RECORD_TIME_END(p_time) do{__t2 = esp_cpu_get_ccount(); *p_time = (__t2-__t1);}while(0)
  238. #define GET_US_BY_CCOUNT(t) ((double)t/CONFIG_ESP_DEFAULT_CPU_FREQ_MHZ)
  239. //ADC Channels
  240. #if CONFIG_IDF_TARGET_ESP32
  241. #define ADC1_CALI_TEST_CHAN0 ADC1_CHANNEL_6
  242. #define ADC2_CALI_TEST_CHAN0 ADC2_CHANNEL_0
  243. #else
  244. #define ADC1_CALI_TEST_CHAN0 ADC1_CHANNEL_2
  245. #define ADC2_CALI_TEST_CHAN0 ADC2_CHANNEL_0
  246. #endif
  247. //ADC Calibration
  248. #if CONFIG_IDF_TARGET_ESP32
  249. #define ADC_TEST_CALI_SCHEME ESP_ADC_CAL_VAL_EFUSE_VREF
  250. #elif CONFIG_IDF_TARGET_ESP32S2
  251. #define ADC_TEST_CALI_SCHEME ESP_ADC_CAL_VAL_EFUSE_TP
  252. #elif CONFIG_IDF_TARGET_ESP32C3
  253. #define ADC_TEST_CALI_SCHEME ESP_ADC_CAL_VAL_EFUSE_TP
  254. #elif CONFIG_IDF_TARGET_ESP32S3
  255. #define ADC_TEST_CALI_SCHEME ESP_ADC_CAL_VAL_EFUSE_TP_FIT
  256. #endif
  257. #define TIMES_PER_ATTEN 10
  258. static esp_adc_cal_characteristics_t adc1_chars;
  259. static esp_adc_cal_characteristics_t adc2_chars;
  260. static void adc_single_cali_init(adc_unit_t adc_n, adc_channel_t chan, uint32_t atten)
  261. {
  262. esp_err_t ret;
  263. esp_adc_cal_value_t ret_val = ESP_ADC_CAL_VAL_NOT_SUPPORTED;
  264. ret = esp_adc_cal_check_efuse(ADC_TEST_CALI_SCHEME);
  265. if (ret == ESP_ERR_NOT_SUPPORTED) {
  266. ESP_LOGE(TAG, "Cali scheme not supported!");
  267. TEST_ASSERT(ret != ESP_ERR_NOT_SUPPORTED);
  268. } else if (ret != ESP_OK) {
  269. ESP_LOGW(TAG, "No cali eFuse, but will run the test");
  270. }
  271. if (adc_n == ADC_UNIT_1) {
  272. ret_val = esp_adc_cal_characterize(adc_n, atten, ADC_WIDTH_BIT_DEFAULT, 0, &adc1_chars);
  273. TEST_ESP_OK(adc1_config_width(ADC_WIDTH_BIT_DEFAULT));
  274. TEST_ESP_OK(adc1_config_channel_atten((adc1_channel_t)chan, atten));
  275. } else if (adc_n == ADC_UNIT_2) {
  276. TEST_ESP_OK(adc2_config_channel_atten((adc2_channel_t)chan, atten));
  277. ret_val = esp_adc_cal_characterize(adc_n, atten, ADC_WIDTH_BIT_DEFAULT, 0, &adc2_chars);
  278. }
  279. if (ret_val == ESP_ADC_CAL_VAL_NOT_SUPPORTED) {
  280. ESP_LOGW(TAG, "No cali eFuse, or invalid arg, but will run the test");
  281. }
  282. ESP_LOGI(TAG, "ADC%d, channel%d, atten%d", adc_n, chan, atten);
  283. }
  284. static IRAM_ATTR NOINLINE_ATTR uint32_t get_cali_time_in_ccount(uint32_t adc_raw, esp_adc_cal_characteristics_t *chars)
  285. {
  286. uint32_t time;
  287. RECORD_TIME_PREPARE();
  288. RECORD_TIME_START();
  289. esp_adc_cal_raw_to_voltage(adc_raw, chars);
  290. RECORD_TIME_END(&time);
  291. return time;
  292. }
  293. TEST_CASE("test_adc_single_cali_time", "[adc][ignore][manual]")
  294. {
  295. ESP_LOGI(TAG, "CPU FREQ is %dMHz", CONFIG_ESP_DEFAULT_CPU_FREQ_MHZ);
  296. uint32_t adc1_time_record[4][TIMES_PER_ATTEN] = {};
  297. uint32_t adc2_time_record[4][TIMES_PER_ATTEN] = {};
  298. int adc1_raw = 0;
  299. int adc2_raw = 0;
  300. //atten0 ~ atten3
  301. for (int i = 0; i < 4; i++) {
  302. ESP_LOGI(TAG, "----------------atten%d----------------", i);
  303. adc_single_cali_init(ADC_UNIT_1, ADC1_CALI_TEST_CHAN0, i);
  304. adc_single_cali_init(ADC_UNIT_2, ADC2_CALI_TEST_CHAN0, i);
  305. for (int j = 0; j < TIMES_PER_ATTEN; j++) {
  306. adc1_raw = adc1_get_raw(ADC1_CALI_TEST_CHAN0);
  307. TEST_ESP_OK(adc2_get_raw(ADC2_CALI_TEST_CHAN0, ADC_WIDTH_BIT_DEFAULT, &adc2_raw));
  308. adc1_time_record[i][j] = get_cali_time_in_ccount(adc1_raw, &adc1_chars);
  309. adc2_time_record[i][j] = get_cali_time_in_ccount(adc2_raw, &adc2_chars);
  310. IDF_LOG_PERFORMANCE("ADC1 Cali time", "%d us", (int)GET_US_BY_CCOUNT(adc1_time_record[i][j]));
  311. IDF_LOG_PERFORMANCE("ADC2 Cali time", "%d us", (int)GET_US_BY_CCOUNT(adc2_time_record[i][j]));
  312. }
  313. }
  314. }
  315. /********************************************************************************
  316. * ADC Single with Light Sleep
  317. ********************************************************************************/
  318. #include <inttypes.h>
  319. #include "esp_sleep.h"
  320. #include "esp_private/regi2c_ctrl.h"
  321. #if REGI2C_ANA_CALI_PD_WORKAROUND
  322. #include "regi2c_saradc.h"
  323. #endif
  324. //ADC Channels
  325. #if CONFIG_IDF_TARGET_ESP32
  326. #define ADC1_SLEEP_TEST_CHAN ADC1_CHANNEL_6
  327. #define ADC2_SLEEP_TEST_CHAN ADC2_CHANNEL_0
  328. static const char *TAG_CH[2][10] = {{"ADC1_CH6"}, {"ADC2_CH0"}};
  329. #else
  330. #define ADC1_SLEEP_TEST_CHAN ADC1_CHANNEL_2
  331. #define ADC2_SLEEP_TEST_CHAN ADC2_CHANNEL_0
  332. static const char *TAG_CH[2][10] = {{"ADC1_CH2"}, {"ADC2_CH0"}};
  333. #endif
  334. //ADC Attenuation
  335. #define ADC_SLEEP_TEST_ATTEN ADC_ATTEN_DB_6
  336. //ADC Calibration
  337. #if CONFIG_IDF_TARGET_ESP32
  338. #define ADC_SLEEP_TEST_CALI_SCHEME ESP_ADC_CAL_VAL_EFUSE_VREF
  339. #elif CONFIG_IDF_TARGET_ESP32S2
  340. #define ADC_SLEEP_TEST_CALI_SCHEME ESP_ADC_CAL_VAL_EFUSE_TP
  341. #elif CONFIG_IDF_TARGET_ESP32C3
  342. #define ADC_SLEEP_TEST_CALI_SCHEME ESP_ADC_CAL_VAL_EFUSE_TP
  343. #elif CONFIG_IDF_TARGET_ESP32S3
  344. #define ADC_SLEEP_TEST_CALI_SCHEME ESP_ADC_CAL_VAL_EFUSE_TP_FIT
  345. #endif
  346. static esp_adc_cal_characteristics_t adc1_chars;
  347. static esp_adc_cal_characteristics_t adc2_chars;
  348. static bool adc_calibration_init(void)
  349. {
  350. esp_err_t ret;
  351. bool cali_enable = false;
  352. ret = esp_adc_cal_check_efuse(ADC_SLEEP_TEST_CALI_SCHEME);
  353. if (ret == ESP_ERR_NOT_SUPPORTED) {
  354. ESP_LOGW(TAG, "Calibration scheme not supported, skip software calibration");
  355. } else if (ret == ESP_ERR_INVALID_VERSION) {
  356. ESP_LOGW(TAG, "eFuse not burnt, skip software calibration");
  357. } else if (ret == ESP_OK) {
  358. cali_enable = true;
  359. esp_adc_cal_characterize(ADC_UNIT_1, ADC_SLEEP_TEST_ATTEN, ADC_WIDTH_BIT_DEFAULT, 0, &adc1_chars);
  360. esp_adc_cal_characterize(ADC_UNIT_2, ADC_SLEEP_TEST_ATTEN, ADC_WIDTH_BIT_DEFAULT, 0, &adc2_chars);
  361. } else {
  362. ESP_LOGE(TAG, "Invalid arg");
  363. }
  364. return cali_enable;
  365. }
  366. #define TEST_REGI2C_ANA_CALI_BYTE_NUM 8
  367. TEST_CASE("test ADC1 Single Read with Light Sleep", "[adc][manul][ignore]")
  368. {
  369. //ADC1 config
  370. TEST_ESP_OK(adc1_config_width(ADC_WIDTH_BIT_DEFAULT));
  371. TEST_ESP_OK(adc1_config_channel_atten(ADC1_SLEEP_TEST_CHAN, ADC_SLEEP_TEST_ATTEN));
  372. //ADC config calibration
  373. bool cali_en = adc_calibration_init();
  374. int raw_expected = 0;
  375. uint32_t cali_expected = 0;
  376. uint8_t regi2c_cali_val_before[TEST_REGI2C_ANA_CALI_BYTE_NUM] = {};
  377. int raw_after_sleep = 0;
  378. uint32_t cali_after_sleep = 0;
  379. uint8_t regi2c_cali_val_after[TEST_REGI2C_ANA_CALI_BYTE_NUM] = {};
  380. //---------------------------------Before Sleep-----------------------------------//
  381. ESP_LOGI("Before", "Light Sleep");
  382. //Read
  383. raw_expected = adc1_get_raw(ADC1_SLEEP_TEST_CHAN);
  384. if (cali_en) {
  385. cali_expected = esp_adc_cal_raw_to_voltage(raw_expected, &adc1_chars);
  386. }
  387. #if REGI2C_ANA_CALI_PD_WORKAROUND
  388. //Print regi2c
  389. for (int i = 0; i < TEST_REGI2C_ANA_CALI_BYTE_NUM; i++) {
  390. regi2c_cali_val_before[i] = regi2c_ctrl_read_reg(I2C_SAR_ADC, I2C_SAR_ADC_HOSTID, i);
  391. printf("regi2c cali val is 0x%x", regi2c_cali_val_before[i]);
  392. }
  393. printf("\n");
  394. #endif
  395. //Print result
  396. ESP_LOGI(TAG_CH[0][0], "ADC1 raw data: %d", raw_expected);
  397. if (cali_en) {
  398. ESP_LOGI(TAG_CH[0][0], "ADC1 cali data: %d", cali_expected);
  399. }
  400. //---------------------------------After Sleep-----------------------------------//
  401. ESP_LOGI("After", "Light Sleep");
  402. esp_sleep_enable_timer_wakeup(30 * 1000);
  403. esp_light_sleep_start();
  404. ESP_LOGI(TAG, "Wakeup from light sleep.");
  405. #if REGI2C_ANA_CALI_PD_WORKAROUND
  406. //Print regi2c
  407. for (int i = 0; i < TEST_REGI2C_ANA_CALI_BYTE_NUM; i++) {
  408. regi2c_cali_val_after[i] = regi2c_ctrl_read_reg(I2C_SAR_ADC, I2C_SAR_ADC_HOSTID, i);
  409. printf("regi2c cali val is 0x%x", regi2c_cali_val_after[i]);
  410. }
  411. printf("\n");
  412. #endif
  413. //Read
  414. raw_after_sleep = adc1_get_raw(ADC1_SLEEP_TEST_CHAN);
  415. if (cali_en) {
  416. cali_after_sleep = esp_adc_cal_raw_to_voltage(raw_after_sleep, &adc1_chars);
  417. }
  418. //Print result
  419. ESP_LOGI(TAG_CH[0][0], "after light sleep, ADC1 cali data: %d", raw_after_sleep);
  420. if (cali_en) {
  421. ESP_LOGI(TAG_CH[0][0], "after light sleep, ADC1 cali data: %d", cali_after_sleep);
  422. }
  423. //Compare
  424. int32_t raw_diff = raw_expected - raw_after_sleep;
  425. IDF_LOG_PERFORMANCE("ADC1 raw diff after sleep", "%d", raw_diff);
  426. if (cali_en) {
  427. int32_t cali_diff = cali_expected - cali_after_sleep;
  428. IDF_LOG_PERFORMANCE("ADC1 cali diff after sleep", "%d mV", cali_diff);
  429. }
  430. for (int i = 0; i < TEST_REGI2C_ANA_CALI_BYTE_NUM; i++) {
  431. TEST_ASSERT_EQUAL(regi2c_cali_val_before[i], regi2c_cali_val_after[i]);
  432. }
  433. }
  434. TEST_CASE("test ADC2 Single Read with Light Sleep", "[adc][manul][ignore]")
  435. {
  436. //ADC2 config
  437. ESP_ERROR_CHECK(adc2_config_channel_atten(ADC2_SLEEP_TEST_CHAN, ADC_SLEEP_TEST_ATTEN));
  438. //ADC config calibration
  439. bool cali_en = adc_calibration_init();
  440. int raw_expected = 0;
  441. uint32_t cali_expected = 0;
  442. uint8_t regi2c_cali_val_before[TEST_REGI2C_ANA_CALI_BYTE_NUM] = {};
  443. int raw_after_sleep = 0;
  444. uint32_t cali_after_sleep = 0;
  445. uint8_t regi2c_cali_val_after[TEST_REGI2C_ANA_CALI_BYTE_NUM] = {};
  446. //---------------------------------Before Sleep-----------------------------------//
  447. ESP_LOGI("Before", "Light Sleep");
  448. //Read
  449. TEST_ESP_OK(adc2_get_raw(ADC2_SLEEP_TEST_CHAN, ADC_WIDTH_BIT_DEFAULT, &raw_expected));
  450. if (cali_en) {
  451. cali_expected = esp_adc_cal_raw_to_voltage(raw_expected, &adc2_chars);
  452. }
  453. #if REGI2C_ANA_CALI_PD_WORKAROUND
  454. //Print regi2c
  455. for (int i = 0; i < TEST_REGI2C_ANA_CALI_BYTE_NUM; i++) {
  456. regi2c_cali_val_before[i] = regi2c_ctrl_read_reg(I2C_SAR_ADC, I2C_SAR_ADC_HOSTID, i);
  457. printf("regi2c cali val is 0x%x", regi2c_cali_val_before[i]);
  458. }
  459. printf("\n");
  460. #endif
  461. //Print result
  462. ESP_LOGI(TAG_CH[1][0], "ADC2 raw data: %d", raw_expected);
  463. if (cali_en) {
  464. ESP_LOGI(TAG_CH[1][0], "ADC2 cali data: %d", cali_expected);
  465. }
  466. //---------------------------------After Sleep-----------------------------------//
  467. ESP_LOGI("After", "Light Sleep");
  468. esp_sleep_enable_timer_wakeup(30 * 1000);
  469. esp_light_sleep_start();
  470. ESP_LOGI(TAG, "Wakeup from light sleep.");
  471. #if REGI2C_ANA_CALI_PD_WORKAROUND
  472. //Print regi2c
  473. for (int i = 0; i < TEST_REGI2C_ANA_CALI_BYTE_NUM; i++) {
  474. regi2c_cali_val_after[i] = regi2c_ctrl_read_reg(I2C_SAR_ADC, I2C_SAR_ADC_HOSTID, i);
  475. printf("regi2c cali val is 0x%x", regi2c_cali_val_after[i]);
  476. }
  477. printf("\n");
  478. #endif
  479. //Read
  480. TEST_ESP_OK(adc2_get_raw(ADC2_SLEEP_TEST_CHAN, ADC_WIDTH_BIT_DEFAULT, &raw_after_sleep));
  481. if (cali_en) {
  482. cali_after_sleep += esp_adc_cal_raw_to_voltage(raw_after_sleep, &adc2_chars);
  483. }
  484. //Print result
  485. ESP_LOGI(TAG_CH[1][0], "after light sleep, ADC2 cali data: %d", raw_after_sleep);
  486. if (cali_en) {
  487. ESP_LOGI(TAG_CH[1][0], "after light sleep, ADC2 cali data: %d", cali_after_sleep);
  488. }
  489. //Compare
  490. int32_t raw_diff = raw_expected - raw_after_sleep;
  491. IDF_LOG_PERFORMANCE("ADC2 raw diff after sleep", "%d", raw_diff);
  492. if (cali_en) {
  493. int32_t cali_diff = cali_expected - cali_after_sleep;
  494. IDF_LOG_PERFORMANCE("ADC2 cali diff after sleep", "%d mV", cali_diff);
  495. }
  496. for (int i = 0; i < TEST_REGI2C_ANA_CALI_BYTE_NUM; i++) {
  497. TEST_ASSERT_EQUAL(regi2c_cali_val_before[i], regi2c_cali_val_after[i]);
  498. }
  499. }
  500. #endif //#if !TEMPORARY_DISABLED_FOR_TARGETS(ESP32C2) //TODO IDF-3908