test_i2s.c 26 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737
  1. /*
  2. * SPDX-FileCopyrightText: 2021-2022 Espressif Systems (Shanghai) CO LTD
  3. *
  4. * SPDX-License-Identifier: Unlicense OR CC0-1.0
  5. */
  6. /**
  7. * I2S test environment UT_T1_I2S:
  8. * We use internal signals instead of external wiring, but please keep the following IO connections, or connect nothing to prevent the signal from being disturbed.
  9. * connect GPIO15 and GPIO19, GPIO25(ESP32)/GPIO17(ESP32-S2) and GPIO26, GPIO21 and GPIO22(ESP32)/GPIO20(ESP32-S2)
  10. * Please do not connect GPIO32(ESP32) any pull-up resistors externally, it will be used to test i2s adc function.
  11. */
  12. #include <stdio.h>
  13. #include <string.h>
  14. #include "freertos/FreeRTOS.h"
  15. #include "freertos/task.h"
  16. #include "freertos/queue.h"
  17. #include "driver/gpio.h"
  18. #include "hal/gpio_hal.h"
  19. #include "unity.h"
  20. #include "math.h"
  21. #include "esp_rom_gpio.h"
  22. #if SOC_I2S_SUPPORTED
  23. #include "driver/i2s.h"
  24. #define SAMPLE_RATE (36000)
  25. #define SAMPLE_BITS (16)
  26. #if CONFIG_IDF_TARGET_ESP32
  27. #define MASTER_BCK_IO 15
  28. #define MASTER_WS_IO 25
  29. #define SLAVE_BCK_IO 19
  30. #define SLAVE_WS_IO 26
  31. #define DATA_IN_IO 21
  32. #define DATA_OUT_IO 22
  33. #define ADC1_CHANNEL_4_IO 32
  34. #define I2S0_DATA_OUT_IDX I2S0O_DATA_OUT23_IDX
  35. #define I2S0_DATA_IN_IDX I2S0I_DATA_IN15_IDX
  36. #define I2S1_DATA_OUT_IDX I2S1O_DATA_OUT23_IDX
  37. #define I2S1_DATA_IN_IDX I2S1I_DATA_IN15_IDX
  38. #elif CONFIG_IDF_TARGET_ESP32S2
  39. #define MASTER_BCK_IO 15
  40. #define MASTER_WS_IO 28
  41. #define SLAVE_BCK_IO 19
  42. #define SLAVE_WS_IO 26
  43. #define DATA_IN_IO 21
  44. #define DATA_OUT_IO 20
  45. #define I2S0_DATA_OUT_IDX I2S0O_DATA_OUT23_IDX
  46. #define I2S0_DATA_IN_IDX I2S0I_DATA_IN15_IDX
  47. #elif CONFIG_IDF_TARGET_ESP32C3
  48. // TODO: change pins
  49. #define MASTER_BCK_IO 4
  50. #define MASTER_WS_IO 5
  51. #define SLAVE_BCK_IO 14
  52. #define SLAVE_WS_IO 15
  53. #define DATA_IN_IO 19
  54. #define DATA_OUT_IO 18
  55. #define I2S0_DATA_OUT_IDX I2SO_SD_OUT_IDX
  56. #define I2S0_DATA_IN_IDX I2SI_SD_IN_IDX
  57. #elif CONFIG_IDF_TARGET_ESP32S3
  58. #define MASTER_BCK_IO 4
  59. #define MASTER_WS_IO 5
  60. #define SLAVE_BCK_IO 14
  61. #define SLAVE_WS_IO 15
  62. #define DATA_IN_IO 19
  63. #define DATA_OUT_IO 18
  64. #define I2S0_DATA_OUT_IDX I2S0O_SD_OUT_IDX
  65. #define I2S0_DATA_IN_IDX I2S0I_SD_IN_IDX
  66. #define I2S1_DATA_OUT_IDX I2S1O_SD_OUT_IDX
  67. #define I2S1_DATA_IN_IDX I2S1I_SD_IN_IDX
  68. #endif
  69. #define PERCENT_DIFF 0.0001
  70. #define I2S_TEST_MODE_SLAVE_TO_MAXTER 0
  71. #define I2S_TEST_MODE_MASTER_TO_SLAVE 1
  72. #define I2S_TEST_MODE_LOOPBACK 2
  73. // mode: 0, master rx, slave tx. mode: 1, master tx, slave rx. mode: 2, master tx rx loopback
  74. // Since ESP32-S2 has only one I2S, only loop back test can be tested.
  75. static void i2s_test_io_config(int mode)
  76. {
  77. // Connect internal signals using IO matrix.
  78. gpio_hal_iomux_func_sel(GPIO_PIN_MUX_REG[MASTER_BCK_IO], PIN_FUNC_GPIO);
  79. gpio_hal_iomux_func_sel(GPIO_PIN_MUX_REG[MASTER_WS_IO], PIN_FUNC_GPIO);
  80. gpio_hal_iomux_func_sel(GPIO_PIN_MUX_REG[DATA_OUT_IO], PIN_FUNC_GPIO);
  81. gpio_set_direction(MASTER_BCK_IO, GPIO_MODE_INPUT_OUTPUT);
  82. gpio_set_direction(MASTER_WS_IO, GPIO_MODE_INPUT_OUTPUT);
  83. gpio_set_direction(DATA_OUT_IO, GPIO_MODE_INPUT_OUTPUT);
  84. switch (mode) {
  85. #if SOC_I2S_NUM > 1
  86. case I2S_TEST_MODE_SLAVE_TO_MAXTER: {
  87. esp_rom_gpio_connect_out_signal(MASTER_BCK_IO, I2S0I_BCK_OUT_IDX, 0, 0);
  88. esp_rom_gpio_connect_in_signal(MASTER_BCK_IO, I2S1O_BCK_IN_IDX, 0);
  89. esp_rom_gpio_connect_out_signal(MASTER_WS_IO, I2S0I_WS_OUT_IDX, 0, 0);
  90. esp_rom_gpio_connect_in_signal(MASTER_WS_IO, I2S1O_WS_IN_IDX, 0);
  91. esp_rom_gpio_connect_out_signal(DATA_OUT_IO, I2S1_DATA_OUT_IDX, 0, 0);
  92. esp_rom_gpio_connect_in_signal(DATA_OUT_IO, I2S0_DATA_IN_IDX, 0);
  93. }
  94. break;
  95. case I2S_TEST_MODE_MASTER_TO_SLAVE: {
  96. esp_rom_gpio_connect_out_signal(MASTER_BCK_IO, I2S0O_BCK_OUT_IDX, 0, 0);
  97. esp_rom_gpio_connect_in_signal(MASTER_BCK_IO, I2S1I_BCK_IN_IDX, 0);
  98. esp_rom_gpio_connect_out_signal(MASTER_WS_IO, I2S0O_WS_OUT_IDX, 0, 0);
  99. esp_rom_gpio_connect_in_signal(MASTER_WS_IO, I2S1I_WS_IN_IDX, 0);
  100. esp_rom_gpio_connect_out_signal(DATA_OUT_IO, I2S0_DATA_OUT_IDX, 0, 0);
  101. esp_rom_gpio_connect_in_signal(DATA_OUT_IO, I2S1_DATA_IN_IDX, 0);
  102. }
  103. break;
  104. #endif
  105. case I2S_TEST_MODE_LOOPBACK: {
  106. esp_rom_gpio_connect_out_signal(DATA_OUT_IO, I2S0_DATA_OUT_IDX, 0, 0);
  107. esp_rom_gpio_connect_in_signal(DATA_OUT_IO, I2S0_DATA_IN_IDX, 0);
  108. }
  109. break;
  110. default: {
  111. TEST_FAIL_MESSAGE("error: mode not supported");
  112. }
  113. break;
  114. }
  115. }
  116. /**
  117. * i2s initialize test
  118. * 1. i2s_driver_install
  119. * 2. i2s_set_pin
  120. */
  121. TEST_CASE("I2S basic driver install, uninstall, set pin test", "[i2s]")
  122. {
  123. // dac, adc i2s
  124. i2s_config_t i2s_config = {
  125. .mode = I2S_MODE_MASTER | I2S_MODE_TX,
  126. .sample_rate = SAMPLE_RATE,
  127. .bits_per_sample = SAMPLE_BITS,
  128. .channel_format = I2S_CHANNEL_FMT_RIGHT_LEFT,
  129. .communication_format = I2S_COMM_FORMAT_STAND_I2S,
  130. .dma_desc_num = 6,
  131. .dma_frame_num = 60,
  132. .use_apll = 0,
  133. .intr_alloc_flags = ESP_INTR_FLAG_LEVEL1,
  134. #if SOC_I2S_SUPPORTS_TDM
  135. .chan_mask = I2S_TDM_ACTIVE_CH0 | I2S_TDM_ACTIVE_CH1,
  136. .total_chan = 2,
  137. .left_align = false,
  138. .big_edin = false,
  139. .bit_order_msb = false,
  140. .skip_msk = false
  141. #endif
  142. };
  143. // normal i2s
  144. i2s_pin_config_t pin_config = {
  145. .mck_io_num = -1,
  146. .bck_io_num = MASTER_BCK_IO,
  147. .ws_io_num = MASTER_WS_IO,
  148. .data_out_num = DATA_OUT_IO,
  149. .data_in_num = -1
  150. };
  151. QueueHandle_t evt_que;
  152. TEST_ESP_OK(i2s_driver_install(I2S_NUM_0, &i2s_config, 16, &evt_que));
  153. TEST_ASSERT(evt_que);
  154. TEST_ESP_OK(i2s_set_pin(I2S_NUM_0, &pin_config));
  155. TEST_ESP_OK(i2s_driver_uninstall(I2S_NUM_0));
  156. //error param test
  157. TEST_ASSERT(i2s_driver_install(I2S_NUM_MAX, &i2s_config, 0, NULL) == ESP_ERR_INVALID_ARG);
  158. TEST_ASSERT(i2s_driver_install(I2S_NUM_0, NULL, 0, NULL) == ESP_ERR_INVALID_ARG);
  159. i2s_config.dma_desc_num = 1;
  160. TEST_ASSERT(i2s_driver_install(I2S_NUM_0, &i2s_config, 0, NULL) == ESP_ERR_INVALID_ARG);
  161. i2s_config.dma_desc_num = 129;
  162. TEST_ASSERT(i2s_driver_install(I2S_NUM_0, &i2s_config, 0, NULL) == ESP_ERR_INVALID_ARG);
  163. TEST_ASSERT_EQUAL(ESP_ERR_INVALID_STATE, i2s_driver_uninstall(I2S_NUM_0));
  164. }
  165. TEST_CASE("I2S Loopback test(master tx and rx)", "[i2s]")
  166. {
  167. // master driver installed and send data
  168. i2s_config_t master_i2s_config = {
  169. .mode = I2S_MODE_MASTER | I2S_MODE_TX | I2S_MODE_RX,
  170. .sample_rate = SAMPLE_RATE,
  171. .bits_per_sample = SAMPLE_BITS,
  172. .channel_format = I2S_CHANNEL_FMT_RIGHT_LEFT,
  173. .communication_format = I2S_COMM_FORMAT_STAND_I2S,
  174. .dma_desc_num = 6,
  175. .dma_frame_num = 100,
  176. .use_apll = 0,
  177. .intr_alloc_flags = ESP_INTR_FLAG_LEVEL1,
  178. #if SOC_I2S_SUPPORTS_TDM
  179. .chan_mask = I2S_TDM_ACTIVE_CH0 | I2S_TDM_ACTIVE_CH1,
  180. .total_chan = 2,
  181. .left_align = false,
  182. .big_edin = false,
  183. .bit_order_msb = false,
  184. .skip_msk = false
  185. #endif
  186. };
  187. i2s_pin_config_t master_pin_config = {
  188. .mck_io_num = -1,
  189. .bck_io_num = MASTER_BCK_IO,
  190. .ws_io_num = MASTER_WS_IO,
  191. .data_out_num = DATA_OUT_IO,
  192. .data_in_num = DATA_IN_IO
  193. };
  194. TEST_ESP_OK(i2s_driver_install(I2S_NUM_0, &master_i2s_config, 0, NULL));
  195. TEST_ESP_OK(i2s_set_pin(I2S_NUM_0, &master_pin_config));
  196. i2s_test_io_config(I2S_TEST_MODE_LOOPBACK);
  197. printf("\r\nheap size: %d\n", esp_get_free_heap_size());
  198. uint8_t *data_wr = (uint8_t *)malloc(sizeof(uint8_t) * 400);
  199. size_t i2s_bytes_write = 0;
  200. size_t bytes_read = 0;
  201. int length = 0;
  202. uint8_t *i2s_read_buff = (uint8_t *)malloc(sizeof(uint8_t) * 10000);
  203. for (int i = 0; i < 100; i++) {
  204. data_wr[i] = i + 1;
  205. }
  206. int flag = 0; // break loop flag
  207. int end_position = 0;
  208. // write data to slave
  209. i2s_write(I2S_NUM_0, data_wr, sizeof(uint8_t) * 400, &i2s_bytes_write, 1000 / portTICK_PERIOD_MS);
  210. while (!flag) {
  211. if (length >= 10000 - 500) {
  212. break;
  213. }
  214. i2s_read(I2S_NUM_0, i2s_read_buff + length, sizeof(uint8_t) * 500, &bytes_read, 1000 / portMAX_DELAY);
  215. if (bytes_read > 0) {
  216. for (int i = length; i < length + bytes_read; i++) {
  217. if (i2s_read_buff[i] == 100) {
  218. flag = 1;
  219. end_position = i;
  220. break;
  221. }
  222. }
  223. }
  224. length = length + bytes_read;
  225. }
  226. // test the read data right or not
  227. for (int i = end_position - 99; i <= end_position; i++) {
  228. TEST_ASSERT_EQUAL_UINT8((i - end_position + 100), *(i2s_read_buff + i));
  229. }
  230. free(data_wr);
  231. free(i2s_read_buff);
  232. i2s_driver_uninstall(I2S_NUM_0);
  233. }
  234. #if SOC_I2S_SUPPORTS_TDM
  235. TEST_CASE("I2S TDM Loopback test(master tx and rx)", "[i2s]")
  236. {
  237. // master driver installed and send data
  238. i2s_config_t master_i2s_config = {
  239. .mode = I2S_MODE_MASTER | I2S_MODE_TX | I2S_MODE_RX,
  240. .sample_rate = SAMPLE_RATE,
  241. .bits_per_sample = SAMPLE_BITS,
  242. .channel_format = I2S_CHANNEL_FMT_MULTIPLE,
  243. .communication_format = I2S_COMM_FORMAT_STAND_I2S,
  244. .total_chan = 4,
  245. .chan_mask = I2S_TDM_ACTIVE_CH0 | I2S_TDM_ACTIVE_CH1 | I2S_TDM_ACTIVE_CH2 | I2S_TDM_ACTIVE_CH3,
  246. .dma_desc_num = 6,
  247. .dma_frame_num = 100,
  248. .use_apll = 0,
  249. .intr_alloc_flags = ESP_INTR_FLAG_LEVEL1,
  250. };
  251. i2s_pin_config_t master_pin_config = {
  252. .mck_io_num = -1,
  253. .bck_io_num = MASTER_BCK_IO,
  254. .ws_io_num = MASTER_WS_IO,
  255. .data_out_num = DATA_OUT_IO,
  256. .data_in_num = DATA_IN_IO
  257. };
  258. TEST_ESP_OK(i2s_driver_install(I2S_NUM_0, &master_i2s_config, 0, NULL));
  259. TEST_ESP_OK(i2s_set_pin(I2S_NUM_0, &master_pin_config));
  260. i2s_test_io_config(I2S_TEST_MODE_LOOPBACK);
  261. printf("\r\nheap size: %d\n", esp_get_free_heap_size());
  262. uint8_t *data_wr = (uint8_t *)malloc(sizeof(uint8_t) * 400);
  263. size_t i2s_bytes_write = 0;
  264. size_t bytes_read = 0;
  265. int length = 0;
  266. uint8_t *i2s_read_buff = (uint8_t *)malloc(sizeof(uint8_t) * 10000);
  267. for (int i = 0; i < 100; i++) {
  268. data_wr[i] = i + 1;
  269. }
  270. int flag = 0; // break loop flag
  271. int end_position = 0;
  272. // write data to slave
  273. i2s_write(I2S_NUM_0, data_wr, sizeof(uint8_t) * 400, &i2s_bytes_write, 1000 / portTICK_PERIOD_MS);
  274. while (!flag) {
  275. if (length >= 10000 - 500) {
  276. break;
  277. }
  278. i2s_read(I2S_NUM_0, i2s_read_buff + length, sizeof(uint8_t) * 500, &bytes_read, 1000 / portMAX_DELAY);
  279. if (bytes_read > 0) {
  280. for (int i = length; i < length + bytes_read; i++) {
  281. if (i2s_read_buff[i] == 100) {
  282. flag = 1;
  283. end_position = i;
  284. break;
  285. }
  286. }
  287. }
  288. length = length + bytes_read;
  289. }
  290. // test the read data right or not
  291. for (int i = end_position - 99; i <= end_position; i++) {
  292. TEST_ASSERT_EQUAL_UINT8((i - end_position + 100), *(i2s_read_buff + i));
  293. }
  294. free(data_wr);
  295. free(i2s_read_buff);
  296. i2s_driver_uninstall(I2S_NUM_0);
  297. }
  298. #endif
  299. #if SOC_I2S_NUM > 1
  300. /* ESP32S2 and ESP32C3 has only single I2S port and hence following test cases are not applicable */
  301. TEST_CASE("I2S write and read test(master tx and slave rx)", "[i2s]")
  302. {
  303. // master driver installed and send data
  304. i2s_config_t master_i2s_config = {
  305. .mode = I2S_MODE_MASTER | I2S_MODE_TX,
  306. .sample_rate = SAMPLE_RATE,
  307. .bits_per_sample = SAMPLE_BITS,
  308. .channel_format = I2S_CHANNEL_FMT_RIGHT_LEFT,
  309. .communication_format = I2S_COMM_FORMAT_STAND_I2S,
  310. .dma_desc_num = 6,
  311. .dma_frame_num = 100,
  312. .use_apll = 0,
  313. .intr_alloc_flags = ESP_INTR_FLAG_LEVEL1,
  314. #if SOC_I2S_SUPPORTS_TDM
  315. .chan_mask = I2S_TDM_ACTIVE_CH0 | I2S_TDM_ACTIVE_CH1,
  316. .total_chan = 2,
  317. .left_align = false,
  318. .big_edin = false,
  319. .bit_order_msb = false,
  320. .skip_msk = false
  321. #endif
  322. };
  323. i2s_pin_config_t master_pin_config = {
  324. .mck_io_num = -1,
  325. .bck_io_num = MASTER_BCK_IO,
  326. .ws_io_num = MASTER_WS_IO,
  327. .data_out_num = DATA_OUT_IO,
  328. .data_in_num = -1
  329. };
  330. TEST_ESP_OK(i2s_driver_install(I2S_NUM_0, &master_i2s_config, 0, NULL));
  331. TEST_ESP_OK(i2s_set_pin(I2S_NUM_0, &master_pin_config));
  332. i2s_test_io_config(I2S_TEST_MODE_MASTER_TO_SLAVE);
  333. printf("\r\nheap size: %d\n", esp_get_free_heap_size());
  334. i2s_config_t slave_i2s_config = {
  335. .mode = I2S_MODE_SLAVE | I2S_MODE_RX,
  336. .sample_rate = SAMPLE_RATE,
  337. .bits_per_sample = SAMPLE_BITS,
  338. .channel_format = I2S_CHANNEL_FMT_RIGHT_LEFT,
  339. .communication_format = I2S_COMM_FORMAT_STAND_I2S,
  340. .dma_desc_num = 6,
  341. .dma_frame_num = 100,
  342. .use_apll = 0,
  343. .intr_alloc_flags = ESP_INTR_FLAG_LEVEL1,
  344. #if SOC_I2S_SUPPORTS_TDM
  345. .chan_mask = I2S_TDM_ACTIVE_CH0 | I2S_TDM_ACTIVE_CH1,
  346. .total_chan = 2,
  347. .left_align = false,
  348. .big_edin = false,
  349. .bit_order_msb = false,
  350. .skip_msk = false
  351. #endif
  352. };
  353. i2s_pin_config_t slave_pin_config = {
  354. .mck_io_num = -1,
  355. .bck_io_num = SLAVE_BCK_IO,
  356. .ws_io_num = SLAVE_WS_IO,
  357. .data_out_num = -1,
  358. .data_in_num = DATA_IN_IO,
  359. };
  360. // slave driver installed and receive data
  361. TEST_ESP_OK(i2s_driver_install(I2S_NUM_1, &slave_i2s_config, 0, NULL));
  362. TEST_ESP_OK(i2s_set_pin(I2S_NUM_1, &slave_pin_config));
  363. i2s_test_io_config(I2S_TEST_MODE_MASTER_TO_SLAVE);
  364. printf("\r\nheap size: %d\n", esp_get_free_heap_size());
  365. uint8_t *data_wr = (uint8_t *)malloc(sizeof(uint8_t) * 400);
  366. size_t i2s_bytes_write = 0;
  367. size_t bytes_read = 0;
  368. int length = 0;
  369. uint8_t *i2s_read_buff = (uint8_t *)malloc(sizeof(uint8_t) * 10000);
  370. for (int i = 0; i < 100; i++) {
  371. data_wr[i] = i + 1;
  372. }
  373. int flag = 0; // break loop flag
  374. int end_position = 0;
  375. // write data to slave
  376. i2s_write(I2S_NUM_0, data_wr, sizeof(uint8_t) * 400, &i2s_bytes_write, 1000 / portTICK_PERIOD_MS);
  377. printf("write data size: %d\n", i2s_bytes_write);
  378. while (!flag) {
  379. i2s_read(I2S_NUM_1, i2s_read_buff + length, sizeof(uint8_t) * 500, &bytes_read, 1000 / portTICK_PERIOD_MS);
  380. if (bytes_read > 0) {
  381. printf("read data size: %d\n", bytes_read);
  382. for (int i = length; i < length + bytes_read; i++) {
  383. if (i2s_read_buff[i] == 100) {
  384. flag = 1;
  385. end_position = i;
  386. break;
  387. }
  388. }
  389. }
  390. length = length + bytes_read;
  391. }
  392. // test the readed data right or not
  393. for (int i = end_position - 99; i <= end_position; i++) {
  394. TEST_ASSERT_EQUAL_UINT8((i - end_position + 100), *(i2s_read_buff + i));
  395. }
  396. free(data_wr);
  397. free(i2s_read_buff);
  398. i2s_driver_uninstall(I2S_NUM_0);
  399. i2s_driver_uninstall(I2S_NUM_1);
  400. }
  401. TEST_CASE("I2S write and read test(master rx and slave tx)", "[i2s]")
  402. {
  403. // master driver installed and send data
  404. i2s_config_t master_i2s_config = {
  405. .mode = I2S_MODE_MASTER | I2S_MODE_RX,
  406. .sample_rate = SAMPLE_RATE,
  407. .bits_per_sample = SAMPLE_BITS,
  408. .channel_format = I2S_CHANNEL_FMT_RIGHT_LEFT,
  409. .communication_format = I2S_COMM_FORMAT_STAND_I2S,
  410. .dma_desc_num = 6,
  411. .dma_frame_num = 100,
  412. .use_apll = 1,
  413. .intr_alloc_flags = ESP_INTR_FLAG_LEVEL1,
  414. #if SOC_I2S_SUPPORTS_TDM
  415. .chan_mask = I2S_TDM_ACTIVE_CH0 | I2S_TDM_ACTIVE_CH1,
  416. .total_chan = 2,
  417. .left_align = false,
  418. .big_edin = false,
  419. .bit_order_msb = false,
  420. .skip_msk = false
  421. #endif
  422. };
  423. i2s_pin_config_t master_pin_config = {
  424. .mck_io_num = -1,
  425. .bck_io_num = MASTER_BCK_IO,
  426. .ws_io_num = MASTER_WS_IO,
  427. .data_out_num = -1,
  428. .data_in_num = DATA_IN_IO,
  429. };
  430. TEST_ESP_OK(i2s_driver_install(I2S_NUM_0, &master_i2s_config, 0, NULL));
  431. TEST_ESP_OK(i2s_set_pin(I2S_NUM_0, &master_pin_config));
  432. i2s_test_io_config(I2S_TEST_MODE_SLAVE_TO_MAXTER);
  433. printf("\r\nheap size: %d\n", esp_get_free_heap_size());
  434. i2s_config_t slave_i2s_config = {
  435. .mode = I2S_MODE_SLAVE | I2S_MODE_TX, // Only RX
  436. .sample_rate = SAMPLE_RATE,
  437. .bits_per_sample = SAMPLE_BITS,
  438. .channel_format = I2S_CHANNEL_FMT_RIGHT_LEFT, //2-channels
  439. .communication_format = I2S_COMM_FORMAT_STAND_I2S,
  440. .dma_desc_num = 6,
  441. .dma_frame_num = 100,
  442. .use_apll = 1,
  443. .intr_alloc_flags = ESP_INTR_FLAG_LEVEL1,
  444. #if SOC_I2S_SUPPORTS_TDM
  445. .chan_mask = I2S_TDM_ACTIVE_CH0 | I2S_TDM_ACTIVE_CH1,
  446. .total_chan = 2,
  447. .left_align = false,
  448. .big_edin = false,
  449. .bit_order_msb = false,
  450. .skip_msk = false
  451. #endif
  452. };
  453. i2s_pin_config_t slave_pin_config = {
  454. .mck_io_num = -1,
  455. .bck_io_num = SLAVE_BCK_IO,
  456. .ws_io_num = SLAVE_WS_IO,
  457. .data_out_num = DATA_OUT_IO,
  458. .data_in_num = -1
  459. };
  460. // slave driver installed and receive data
  461. TEST_ESP_OK(i2s_driver_install(I2S_NUM_1, &slave_i2s_config, 0, NULL));
  462. TEST_ESP_OK(i2s_set_pin(I2S_NUM_1, &slave_pin_config));
  463. i2s_test_io_config(I2S_TEST_MODE_SLAVE_TO_MAXTER);
  464. printf("\r\nheap size: %d\n", esp_get_free_heap_size());
  465. uint8_t *data_wr = (uint8_t *)malloc(sizeof(uint8_t) * 400);
  466. size_t i2s_bytes_write = 0;
  467. size_t bytes_read = 0;
  468. int length = 0;
  469. uint8_t *i2s_read_buff = (uint8_t *)malloc(sizeof(uint8_t) * 10000);
  470. for (int i = 0; i < 100; i++) {
  471. data_wr[i] = i + 1;
  472. }
  473. // slave write data to master
  474. i2s_write(I2S_NUM_1, data_wr, sizeof(uint8_t) * 400, &i2s_bytes_write, 1000 / portTICK_PERIOD_MS);
  475. printf("write data size: %d\n", i2s_bytes_write);
  476. int flag = 0; // break loop flag
  477. volatile int end_position = 0;
  478. // write data to slave
  479. while (!flag) {
  480. TEST_ESP_OK(i2s_read(I2S_NUM_0, i2s_read_buff + length, 10000 - length, &bytes_read, 1000 / portTICK_PERIOD_MS));
  481. if (bytes_read > 0) {
  482. printf("read data size: %d\n", bytes_read);
  483. for (int i = length; i < length + bytes_read; i++) {
  484. if (i2s_read_buff[i] == 100) {
  485. flag = 1;
  486. end_position = i;
  487. break;
  488. }
  489. }
  490. }
  491. length = length + bytes_read;
  492. }
  493. // test the readed data right or not
  494. for (int i = end_position - 99; i <= end_position; i++) {
  495. TEST_ASSERT_EQUAL_UINT8((i - end_position + 100), *(i2s_read_buff + i));
  496. }
  497. free(data_wr);
  498. free(i2s_read_buff);
  499. i2s_driver_uninstall(I2S_NUM_0);
  500. i2s_driver_uninstall(I2S_NUM_1);
  501. }
  502. #endif
  503. TEST_CASE("I2S memory leaking test", "[i2s]")
  504. {
  505. i2s_config_t master_i2s_config = {
  506. .mode = I2S_MODE_MASTER | I2S_MODE_RX,
  507. .sample_rate = SAMPLE_RATE,
  508. .bits_per_sample = SAMPLE_BITS,
  509. .channel_format = I2S_CHANNEL_FMT_RIGHT_LEFT,
  510. .communication_format = I2S_COMM_FORMAT_STAND_I2S,
  511. .dma_desc_num = 6,
  512. .dma_frame_num = 100,
  513. .use_apll = 0,
  514. .intr_alloc_flags = ESP_INTR_FLAG_LEVEL1,
  515. #if SOC_I2S_SUPPORTS_TDM
  516. .chan_mask = I2S_TDM_ACTIVE_CH0 | I2S_TDM_ACTIVE_CH1,
  517. .total_chan = 2,
  518. .left_align = false,
  519. .big_edin = false,
  520. .bit_order_msb = false,
  521. .skip_msk = false
  522. #endif
  523. };
  524. i2s_pin_config_t master_pin_config = {
  525. .mck_io_num = -1,
  526. .bck_io_num = MASTER_BCK_IO,
  527. .ws_io_num = MASTER_WS_IO,
  528. .data_out_num = -1,
  529. .data_in_num = DATA_IN_IO
  530. };
  531. TEST_ESP_OK(i2s_driver_install(I2S_NUM_0, &master_i2s_config, 0, NULL));
  532. TEST_ESP_OK(i2s_set_pin(I2S_NUM_0, &master_pin_config));
  533. i2s_driver_uninstall(I2S_NUM_0);
  534. int initial_size = esp_get_free_heap_size();
  535. for (int i = 0; i < 100; i++) {
  536. TEST_ESP_OK(i2s_driver_install(I2S_NUM_0, &master_i2s_config, 0, NULL));
  537. TEST_ESP_OK(i2s_set_pin(I2S_NUM_0, &master_pin_config));
  538. i2s_driver_uninstall(I2S_NUM_0);
  539. TEST_ASSERT(initial_size == esp_get_free_heap_size());
  540. }
  541. vTaskDelay(100 / portTICK_PERIOD_MS);
  542. TEST_ASSERT(initial_size == esp_get_free_heap_size());
  543. }
  544. #if SOC_I2S_SUPPORTS_APLL
  545. /*
  546. * The I2S APLL clock variation test used to test the difference between the different sample rates, different bits per sample
  547. * and the APLL clock generate for it. The TEST_CASE passes PERCENT_DIFF variation from the provided sample rate in APLL generated clock
  548. * The percentage difference calculated as (mod((obtained clock rate - desired clock rate)/(desired clock rate))) * 100.
  549. */
  550. TEST_CASE("I2S APLL clock variation test", "[i2s]")
  551. {
  552. i2s_pin_config_t pin_config = {
  553. .mck_io_num = -1,
  554. .bck_io_num = MASTER_BCK_IO,
  555. .ws_io_num = MASTER_WS_IO,
  556. .data_out_num = DATA_OUT_IO,
  557. .data_in_num = -1
  558. };
  559. i2s_config_t i2s_config = {
  560. .mode = I2S_MODE_MASTER | I2S_MODE_TX,
  561. .sample_rate = SAMPLE_RATE,
  562. .bits_per_sample = SAMPLE_BITS,
  563. .channel_format = I2S_CHANNEL_FMT_RIGHT_LEFT,
  564. .communication_format = I2S_COMM_FORMAT_STAND_I2S,
  565. .dma_desc_num = 6,
  566. .dma_frame_num = 60,
  567. .use_apll = true,
  568. .intr_alloc_flags = 0,
  569. #if SOC_I2S_SUPPORTS_TDM
  570. .chan_mask = I2S_TDM_ACTIVE_CH0 | I2S_TDM_ACTIVE_CH1,
  571. .total_chan = 2,
  572. .left_align = false,
  573. .big_edin = false,
  574. .bit_order_msb = false,
  575. .skip_msk = false
  576. #endif
  577. };
  578. TEST_ESP_OK(i2s_driver_install(I2S_NUM_0, &i2s_config, 0, NULL));
  579. TEST_ESP_OK(i2s_set_pin(I2S_NUM_0, &pin_config));
  580. TEST_ESP_OK(i2s_driver_uninstall(I2S_NUM_0));
  581. int initial_size = esp_get_free_heap_size();
  582. uint32_t sample_rate_arr[8] = { 10675, 11025, 16000, 22050, 32000, 44100, 48000, 96000 };
  583. int bits_per_sample_arr[3] = { 16, 24, 32 };
  584. for (int i = 0; i < (sizeof(sample_rate_arr) / sizeof(sample_rate_arr[0])); i++) {
  585. for (int j = 0; j < (sizeof(bits_per_sample_arr) / sizeof(bits_per_sample_arr[0])); j++) {
  586. i2s_config.sample_rate = sample_rate_arr[i];
  587. i2s_config.bits_per_sample = bits_per_sample_arr[j];
  588. TEST_ESP_OK(i2s_driver_install(I2S_NUM_0, &i2s_config, 0, NULL));
  589. TEST_ESP_OK(i2s_set_pin(I2S_NUM_0, &pin_config));
  590. TEST_ASSERT((fabs((i2s_get_clk(I2S_NUM_0) - sample_rate_arr[i])) / (sample_rate_arr[i])) * 100 < PERCENT_DIFF);
  591. TEST_ESP_OK(i2s_driver_uninstall(I2S_NUM_0));
  592. TEST_ASSERT(initial_size == esp_get_free_heap_size());
  593. }
  594. }
  595. vTaskDelay(100 / portTICK_PERIOD_MS);
  596. TEST_ASSERT(initial_size == esp_get_free_heap_size());
  597. }
  598. #endif
  599. #if SOC_I2S_SUPPORTS_ADC
  600. /* Only ESP32 need I2S adc/dac test */
  601. TEST_CASE("I2S adc test", "[i2s]")
  602. {
  603. // init I2S ADC
  604. i2s_config_t i2s_config = {
  605. .mode = I2S_MODE_MASTER | I2S_MODE_RX | I2S_MODE_ADC_BUILT_IN,
  606. .sample_rate = SAMPLE_RATE,
  607. .bits_per_sample = SAMPLE_BITS,
  608. .channel_format = I2S_CHANNEL_FMT_RIGHT_LEFT,
  609. .intr_alloc_flags = 0,
  610. .dma_desc_num = 2,
  611. .dma_frame_num = 1024,
  612. .use_apll = 0,
  613. };
  614. // install and start I2S driver
  615. i2s_driver_install(I2S_NUM_0, &i2s_config, 0, NULL);
  616. // init ADC pad
  617. i2s_set_adc_mode(ADC_UNIT_1, ADC1_CHANNEL_4);
  618. // enable adc sampling, ADC_WIDTH_BIT_12, ADC_ATTEN_DB_11 hard-coded in adc_i2s_mode_init
  619. i2s_adc_enable(I2S_NUM_0);
  620. // init read buffer
  621. uint16_t *i2sReadBuffer = (uint16_t *)calloc(1024, sizeof(uint16_t));
  622. size_t bytesRead;
  623. for (int loop = 0; loop < 10; loop++) {
  624. for (int level = 0; level <= 1; level++) {
  625. if (level == 0) {
  626. gpio_set_pull_mode(ADC1_CHANNEL_4_IO, GPIO_PULLDOWN_ONLY);
  627. } else {
  628. gpio_set_pull_mode(ADC1_CHANNEL_4_IO, GPIO_PULLUP_ONLY);
  629. }
  630. vTaskDelay(200 / portTICK_PERIOD_MS);
  631. // read data from adc, will block until buffer is full
  632. i2s_read(I2S_NUM_0, (void *)i2sReadBuffer, 1024 * sizeof(uint16_t), &bytesRead, portMAX_DELAY);
  633. // calc average
  634. int64_t adcSumValue = 0;
  635. for (size_t i = 0; i < 1024; i++) {
  636. adcSumValue += i2sReadBuffer[i] & 0xfff;
  637. }
  638. int adcAvgValue = adcSumValue / 1024;
  639. printf("adc average val: %d\n", adcAvgValue);
  640. if (level == 0) {
  641. if (adcAvgValue > 100) {
  642. i2s_adc_disable(I2S_NUM_0);
  643. free(i2sReadBuffer);
  644. i2s_driver_uninstall(I2S_NUM_0);
  645. TEST_ASSERT_LESS_THAN(100, adcAvgValue);
  646. }
  647. } else {
  648. if (adcAvgValue < 4000) {
  649. i2s_adc_disable(I2S_NUM_0);
  650. free(i2sReadBuffer);
  651. i2s_driver_uninstall(I2S_NUM_0);
  652. TEST_ASSERT_GREATER_THAN(4000, adcAvgValue);
  653. }
  654. }
  655. }
  656. }
  657. i2s_adc_disable(I2S_NUM_0);
  658. free(i2sReadBuffer);
  659. i2s_driver_uninstall(I2S_NUM_0);
  660. }
  661. #endif
  662. #if SOC_I2S_SUPPORTS_DAC
  663. TEST_CASE("I2S dac test", "[i2s]")
  664. {
  665. // dac, adc i2s
  666. i2s_config_t i2s_config = {
  667. .mode = I2S_MODE_MASTER | I2S_MODE_TX,
  668. .sample_rate = SAMPLE_RATE,
  669. .bits_per_sample = SAMPLE_BITS,
  670. .channel_format = I2S_CHANNEL_FMT_RIGHT_LEFT,
  671. .communication_format = I2S_COMM_FORMAT_STAND_I2S,
  672. .dma_desc_num = 6,
  673. .dma_frame_num = 60,
  674. .use_apll = 0,
  675. .intr_alloc_flags = ESP_INTR_FLAG_LEVEL1,
  676. };
  677. //install and start i2s driver
  678. TEST_ESP_OK(i2s_driver_install(I2S_NUM_0, &i2s_config, 0, NULL));
  679. //for internal DAC, this will enable both of the internal channels
  680. TEST_ESP_OK(i2s_set_pin(I2S_NUM_0, NULL));
  681. //stop & destroy i2s driver
  682. TEST_ESP_OK(i2s_driver_uninstall(I2S_NUM_0));
  683. }
  684. #endif
  685. #endif //SOC_I2S_SUPPORTED