test_spi_param.c 80 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983
  1. /*
  2. * SPDX-FileCopyrightText: 2021-2022 Espressif Systems (Shanghai) CO LTD
  3. *
  4. * SPDX-License-Identifier: Apache-2.0
  5. */
  6. #include "esp_log.h"
  7. #include "esp_attr.h"
  8. #include "soc/spi_periph.h"
  9. #include "sdkconfig.h"
  10. #include "test_utils.h"
  11. #include "test_spi_utils.h"
  12. #include "driver/spi_master.h"
  13. #include "driver/spi_slave.h"
  14. #if SOC_SPI_SUPPORT_SLAVE_HD_VER2
  15. #include "esp_serial_slave_link/essl_spi.h"
  16. #include "driver/spi_slave_hd.h"
  17. #endif
  18. #if (TEST_SPI_PERIPH_NUM >= 2)
  19. //These will only be enabled on chips with 2 or more SPI peripherals
  20. #ifndef MIN
  21. #define MIN(a, b)((a) > (b)? (b): (a))
  22. #endif
  23. /********************************************************************************
  24. * Test By Internal Connections
  25. ********************************************************************************/
  26. static void local_test_init(void **context);
  27. static void local_test_deinit(void *context);
  28. static void local_test_loop(const void *test_param, void *context);
  29. static const ptest_func_t local_test_func = {
  30. .pre_test = local_test_init,
  31. .post_test = local_test_deinit,
  32. .loop = local_test_loop,
  33. .def_param = spitest_def_param,
  34. };
  35. #define TEST_SPI_LOCAL(name, param_set) \
  36. PARAM_GROUP_DECLARE(name, param_set) \
  37. TEST_SINGLE_BOARD(SPI_##name, param_set, "[spi][timeout=120]", &local_test_func)
  38. static void local_test_init(void **arg)
  39. {
  40. esp_log_level_set("gpio", ESP_LOG_WARN);
  41. TEST_ASSERT(*arg == NULL);
  42. *arg = malloc(sizeof(spitest_context_t));
  43. spitest_context_t *context = (spitest_context_t *)*arg;
  44. TEST_ASSERT(context != NULL);
  45. context->slave_context = (spi_slave_task_context_t) {};
  46. esp_err_t err = init_slave_context( &context->slave_context, TEST_SLAVE_HOST);
  47. TEST_ASSERT(err == ESP_OK);
  48. xTaskCreate(spitest_slave_task, "spi_slave", 4096, &context->slave_context, 0, &context->handle_slave);
  49. }
  50. static void local_test_deinit(void *arg)
  51. {
  52. spitest_context_t *context = arg;
  53. vTaskDelete(context->handle_slave);
  54. context->handle_slave = 0;
  55. deinit_slave_context(&context->slave_context);
  56. }
  57. static void local_test_start(spi_device_handle_t *spi, int freq, const spitest_param_set_t *pset, spitest_context_t *context)
  58. {
  59. //master config
  60. spi_bus_config_t buscfg = SPI_BUS_TEST_DEFAULT_CONFIG();
  61. spi_device_interface_config_t devcfg = SPI_DEVICE_TEST_DEFAULT_CONFIG();
  62. spi_slave_interface_config_t slvcfg = SPI_SLAVE_TEST_DEFAULT_CONFIG();
  63. //pin config & initialize
  64. //we can't have two sets of iomux pins on the same pins
  65. assert(!pset->master_iomux || !pset->slave_iomux);
  66. if (pset->slave_iomux) {
  67. //only in this case, use VSPI iomux pins
  68. buscfg.miso_io_num = SLAVE_IOMUX_PIN_MISO;
  69. buscfg.mosi_io_num = SLAVE_IOMUX_PIN_MOSI;
  70. buscfg.sclk_io_num = SLAVE_IOMUX_PIN_SCLK;
  71. devcfg.spics_io_num = SLAVE_IOMUX_PIN_CS;
  72. slvcfg.spics_io_num = SLAVE_IOMUX_PIN_CS;
  73. } else {
  74. buscfg.miso_io_num = MASTER_IOMUX_PIN_MISO;
  75. buscfg.mosi_io_num = MASTER_IOMUX_PIN_MOSI;
  76. buscfg.sclk_io_num = MASTER_IOMUX_PIN_SCLK;
  77. devcfg.spics_io_num = MASTER_IOMUX_PIN_CS;
  78. slvcfg.spics_io_num = MASTER_IOMUX_PIN_CS;
  79. }
  80. //this does nothing, but avoid the driver from using iomux pins if required
  81. buscfg.quadhd_io_num = (!pset->master_iomux && !pset->slave_iomux ? UNCONNECTED_PIN : -1);
  82. devcfg.mode = pset->mode;
  83. const int cs_pretrans_max = 15;
  84. if (pset->dup == HALF_DUPLEX_MISO) {
  85. devcfg.cs_ena_pretrans = cs_pretrans_max;
  86. devcfg.flags |= SPI_DEVICE_HALFDUPLEX;
  87. } else if (pset->dup == HALF_DUPLEX_MOSI) {
  88. devcfg.cs_ena_pretrans = cs_pretrans_max;
  89. devcfg.flags |= SPI_DEVICE_NO_DUMMY;
  90. } else {
  91. devcfg.cs_ena_pretrans = cs_pretrans_max;
  92. }
  93. const int cs_posttrans_max = 15;
  94. devcfg.cs_ena_posttrans = cs_posttrans_max;
  95. devcfg.input_delay_ns = pset->slave_tv_ns;
  96. devcfg.clock_speed_hz = freq;
  97. if (pset->master_limit != 0 && freq > pset->master_limit) {
  98. devcfg.flags |= SPI_DEVICE_NO_DUMMY;
  99. }
  100. //slave config
  101. slvcfg.mode = pset->mode;
  102. slave_pull_up(&buscfg, slvcfg.spics_io_num);
  103. int dma_chan = (pset->master_dma_chan == 0) ? 0 : SPI_DMA_CH_AUTO;
  104. TEST_ESP_OK(spi_bus_initialize(TEST_SPI_HOST, &buscfg, dma_chan));
  105. TEST_ESP_OK(spi_bus_add_device(TEST_SPI_HOST, &devcfg, spi));
  106. //slave automatically use iomux pins if pins are on VSPI_* pins
  107. buscfg.quadhd_io_num = -1;
  108. int slave_dma_chan = (pset->slave_dma_chan == 0) ? 0 : SPI_DMA_CH_AUTO;
  109. TEST_ESP_OK(spi_slave_initialize(TEST_SLAVE_HOST, &buscfg, &slvcfg, slave_dma_chan));
  110. //initialize master and slave on the same pins break some of the output configs, fix them
  111. if (pset->master_iomux) {
  112. spitest_gpio_output_sel(buscfg.mosi_io_num, FUNC_SPI, spi_periph_signal[TEST_SPI_HOST].spid_out);
  113. spitest_gpio_output_sel(buscfg.miso_io_num, FUNC_GPIO, spi_periph_signal[TEST_SLAVE_HOST].spiq_out);
  114. spitest_gpio_output_sel(devcfg.spics_io_num, FUNC_SPI, spi_periph_signal[TEST_SPI_HOST].spics_out[0]);
  115. spitest_gpio_output_sel(buscfg.sclk_io_num, FUNC_SPI, spi_periph_signal[TEST_SPI_HOST].spiclk_out);
  116. } else if (pset->slave_iomux) {
  117. spitest_gpio_output_sel(buscfg.mosi_io_num, FUNC_GPIO, spi_periph_signal[TEST_SPI_HOST].spid_out);
  118. spitest_gpio_output_sel(buscfg.miso_io_num, FUNC_SPI, spi_periph_signal[TEST_SLAVE_HOST].spiq_out);
  119. spitest_gpio_output_sel(devcfg.spics_io_num, FUNC_GPIO, spi_periph_signal[TEST_SPI_HOST].spics_out[0]);
  120. spitest_gpio_output_sel(buscfg.sclk_io_num, FUNC_GPIO, spi_periph_signal[TEST_SPI_HOST].spiclk_out);
  121. } else {
  122. spitest_gpio_output_sel(buscfg.mosi_io_num, FUNC_GPIO, spi_periph_signal[TEST_SPI_HOST].spid_out);
  123. spitest_gpio_output_sel(buscfg.miso_io_num, FUNC_GPIO, spi_periph_signal[TEST_SLAVE_HOST].spiq_out);
  124. spitest_gpio_output_sel(devcfg.spics_io_num, FUNC_GPIO, spi_periph_signal[TEST_SPI_HOST].spics_out[0]);
  125. spitest_gpio_output_sel(buscfg.sclk_io_num, FUNC_GPIO, spi_periph_signal[TEST_SPI_HOST].spiclk_out);
  126. }
  127. if (context) {
  128. //clear master receive buffer
  129. memset(context->master_rxbuf, 0x66, sizeof(context->master_rxbuf));
  130. }
  131. }
  132. static void local_test_end(spi_device_handle_t spi)
  133. {
  134. master_free_device_bus(spi);
  135. TEST_ASSERT(spi_slave_free(TEST_SLAVE_HOST) == ESP_OK);
  136. }
  137. static void local_test_loop(const void *arg1, void *arg2)
  138. {
  139. const spitest_param_set_t *pset = arg1;
  140. spitest_context_t *context = arg2;
  141. spi_device_handle_t spi;
  142. spitest_init_transactions(pset, context);
  143. const int *timing_speed_array = pset->freq_list;
  144. ESP_LOGI(MASTER_TAG, "****************** %s ***************", pset->pset_name);
  145. for (int i = 0; ; i++) {
  146. const int freq = timing_speed_array[i];
  147. if (freq == 0) {
  148. break;
  149. }
  150. if (pset->freq_limit && freq > pset->freq_limit) {
  151. break;
  152. }
  153. ESP_LOGI(MASTER_TAG, "==> %dkHz", freq / 1000);
  154. bool check_master_data = (pset->dup != HALF_DUPLEX_MOSI &&
  155. (pset->master_limit == 0 || freq <= pset->master_limit));
  156. if (!check_master_data) {
  157. ESP_LOGI(MASTER_TAG, "skip master data check");
  158. }
  159. bool check_slave_data = (pset->dup != HALF_DUPLEX_MISO);
  160. if (!check_slave_data) {
  161. ESP_LOGI(SLAVE_TAG, "skip slave data check");
  162. }
  163. local_test_start(&spi, freq, pset, context);
  164. for (int k = 0; k < pset->test_size; k++) {
  165. WORD_ALIGNED_ATTR uint8_t recvbuf[320 + 8];
  166. slave_txdata_t *txdata = &context->slave_trans[k];
  167. spi_slave_transaction_t slave_trans = {
  168. .tx_buffer = txdata->start,
  169. .rx_buffer = recvbuf,
  170. .length = txdata->len,
  171. };
  172. esp_err_t err = spi_slave_queue_trans(TEST_SLAVE_HOST, &slave_trans, portMAX_DELAY);
  173. TEST_ESP_OK(err);
  174. //wait for both master and slave end
  175. spi_transaction_t *t = &context->master_trans[k];
  176. int len = get_trans_len(pset->dup, t);
  177. ESP_LOGI(MASTER_TAG, " ==> #%d: len: %d", k, len);
  178. //send master tx data
  179. err = spi_device_transmit(spi, t);
  180. TEST_ESP_OK(err);
  181. spi_slave_transaction_t *ret_trans;
  182. err = spi_slave_get_trans_result(TEST_SLAVE_HOST, &ret_trans, 5);
  183. TEST_ESP_OK(err);
  184. TEST_ASSERT_EQUAL(&slave_trans, ret_trans);
  185. uint32_t rcv_len = slave_trans.trans_len;
  186. bool failed = false;
  187. //check master data
  188. if (check_master_data && memcmp(slave_trans.tx_buffer, t->rx_buffer, (len + 7) / 8) != 0 ) {
  189. failed = true;
  190. }
  191. //check slave data and length
  192. //currently the rcv_len can be in range of [t->length-1, t->length+3]
  193. if ( rcv_len < len - 1 || rcv_len > len + 4) {
  194. failed = true;
  195. }
  196. if (check_slave_data && memcmp(t->tx_buffer, slave_trans.rx_buffer, (len + 7) / 8) != 0 ) {
  197. failed = true;
  198. }
  199. if (failed) {
  200. ESP_LOGI(SLAVE_TAG, "slave_recv_len: %" PRIu32, rcv_len);
  201. spitest_master_print_data(t, len);
  202. ESP_LOG_BUFFER_HEX("slave tx", slave_trans.tx_buffer, len);
  203. ESP_LOG_BUFFER_HEX("slave rx", slave_trans.rx_buffer, len);
  204. //already failed, try to use the TEST_ASSERT to output the reason...
  205. TEST_ASSERT_EQUAL_HEX8_ARRAY(slave_trans.tx_buffer, t->rx_buffer, (len + 7) / 8);
  206. TEST_ASSERT_EQUAL_HEX8_ARRAY(t->tx_buffer, slave_trans.rx_buffer, (len + 7) / 8);
  207. TEST_ASSERT(rcv_len >= len - 1 && rcv_len <= len + 4);
  208. }
  209. }
  210. local_test_end(spi);
  211. }
  212. }
  213. /************ Timing Test ***********************************************/
  214. //TODO: esp32s2 has better timing performance
  215. static spitest_param_set_t timing_pgroup[] = {
  216. //signals are not fed to peripherals through iomux if the functions are not selected to iomux
  217. #if !DISABLED_FOR_TARGETS(ESP32S2, ESP32S3)
  218. {
  219. .pset_name = "FULL_DUP, MASTER IOMUX",
  220. .freq_limit = ESP_SPI_SLAVE_MAX_FREQ_SYNC,
  221. .master_limit = 13 * 1000 * 1000,
  222. .dup = FULL_DUPLEX,
  223. .master_iomux = true,
  224. .slave_iomux = false,
  225. .slave_tv_ns = TV_INT_CONNECT_GPIO,
  226. },
  227. {
  228. .pset_name = "FULL_DUP, SLAVE IOMUX",
  229. .freq_limit = ESP_SPI_SLAVE_MAX_FREQ_SYNC,
  230. .master_limit = 13 * 1000 * 1000,
  231. .dup = FULL_DUPLEX,
  232. .master_iomux = false,
  233. .slave_iomux = true,
  234. .slave_tv_ns = TV_INT_CONNECT,
  235. },
  236. #endif
  237. {
  238. .pset_name = "FULL_DUP, BOTH GPIO",
  239. .freq_limit = ESP_SPI_SLAVE_MAX_FREQ_SYNC,
  240. .master_limit = 10 * 1000 * 1000,
  241. .dup = FULL_DUPLEX,
  242. .master_iomux = false,
  243. .slave_iomux = false,
  244. .slave_tv_ns = TV_INT_CONNECT_GPIO,
  245. },
  246. //signals are not fed to peripherals through iomux if the functions are not selected to iomux
  247. #if !DISABLED_FOR_TARGETS(ESP32S2, ESP32S3)
  248. {
  249. .pset_name = "MISO_DUP, MASTER IOMUX",
  250. .freq_limit = ESP_SPI_SLAVE_MAX_FREQ_SYNC,
  251. .master_limit = ESP_SPI_SLAVE_MAX_FREQ_SYNC,
  252. .dup = HALF_DUPLEX_MISO,
  253. .master_iomux = true,
  254. .slave_iomux = false,
  255. .slave_tv_ns = TV_INT_CONNECT_GPIO,
  256. },
  257. {
  258. .pset_name = "MISO_DUP, SLAVE IOMUX",
  259. .freq_limit = ESP_SPI_SLAVE_MAX_FREQ_SYNC,
  260. //.freq_limit = ESP_SPI_SLAVE_MAX_FREQ_SYNC,
  261. .dup = HALF_DUPLEX_MISO,
  262. .master_iomux = false,
  263. .slave_iomux = true,
  264. .slave_tv_ns = TV_INT_CONNECT,
  265. },
  266. #endif
  267. {
  268. .pset_name = "MISO_DUP, BOTH GPIO",
  269. .freq_limit = ESP_SPI_SLAVE_MAX_FREQ_SYNC,
  270. //.freq_limit = ESP_SPI_SLAVE_MAX_FREQ_SYNC,
  271. .dup = HALF_DUPLEX_MISO,
  272. .master_iomux = false,
  273. .slave_iomux = false,
  274. .slave_tv_ns = TV_INT_CONNECT_GPIO,
  275. },
  276. //signals are not fed to peripherals through iomux if the functions are not selected to iomux
  277. #if !DISABLED_FOR_TARGETS(ESP32S2, ESP32S3)
  278. {
  279. .pset_name = "MOSI_DUP, MASTER IOMUX",
  280. .freq_limit = ESP_SPI_SLAVE_MAX_FREQ_SYNC,
  281. //.freq_limit = ESP_SPI_SLAVE_MAX_READ_FREQ, //ESP_SPI_SLAVE_MAX_FREQ_SYNC,
  282. .dup = HALF_DUPLEX_MOSI,
  283. .master_iomux = true,
  284. .slave_iomux = false,
  285. .slave_tv_ns = TV_INT_CONNECT_GPIO,
  286. },
  287. {
  288. .pset_name = "MOSI_DUP, SLAVE IOMUX",
  289. .freq_limit = ESP_SPI_SLAVE_MAX_FREQ_SYNC,
  290. //.freq_limit = ESP_SPI_SLAVE_MAX_READ_FREQ, //ESP_SPI_SLAVE_MAX_FREQ_SYNC,
  291. .dup = HALF_DUPLEX_MOSI,
  292. .master_iomux = false,
  293. .slave_iomux = true,
  294. .slave_tv_ns = TV_INT_CONNECT,
  295. },
  296. #endif
  297. {
  298. .pset_name = "MOSI_DUP, BOTH GPIO",
  299. .freq_limit = ESP_SPI_SLAVE_MAX_FREQ_SYNC,
  300. //.freq_limit = ESP_SPI_SLAVE_MAX_READ_FREQ, //ESP_SPI_SLAVE_MAX_FREQ_SYNC,
  301. .dup = HALF_DUPLEX_MOSI,
  302. .master_iomux = false,
  303. .slave_iomux = false,
  304. .slave_tv_ns = TV_INT_CONNECT_GPIO,
  305. },
  306. };
  307. TEST_SPI_LOCAL(TIMING, timing_pgroup)
  308. /************ Mode Test ***********************************************/
  309. #define FREQ_LIMIT_MODE 16 * 1000 * 1000
  310. static int test_freq_mode_local[] = {
  311. 1 * 1000 * 1000,
  312. 9 * 1000 * 1000, //maximum freq MISO stable before next latch edge
  313. 13 * 1000 * 1000,
  314. 16 * 1000 * 1000,
  315. 20 * 1000 * 1000,
  316. 26 * 1000 * 1000,
  317. 40 * 1000 * 1000,
  318. 0,
  319. };
  320. //signals are not fed to peripherals through iomux if the functions are not selected to iomux
  321. #ifdef CONFIG_IDF_TARGET_ESP32
  322. #define LOCAL_MODE_TEST_SLAVE_IOMUX true
  323. /*
  324. * When DMA is enabled in mode 0 and 2, an special workaround is used. The MISO (slave's output) is
  325. * half an SPI clock ahead, but then delay 3 apb clocks.
  326. * Compared to the normal timing, the MISO is not slower than when the frequency is below 13.3MHz,
  327. * under which there's no need for the master to compensate the MISO signal. However compensation
  328. * is required when the frequency is beyond 16MHz, at this time, an extra positive delay is added
  329. * to the normal delay (3 apb clocks).
  330. *
  331. * It's is hard to tell the master driver that kind of delay logic. This magic delay value happens
  332. * to compensate master timing beyond 16MHz.
  333. *
  334. * If the master or slave's timing is changed again, and the test no longer passes, above 16MHz,
  335. * it's OK to use `master_limit` to disable master data check or skip the test above some
  336. * frequencies above 10MHz (the design target value).
  337. */
  338. #define SLAVE_EXTRA_DELAY_DMA 12.5
  339. #else
  340. #define LOCAL_MODE_TEST_SLAVE_IOMUX false
  341. #define SLAVE_EXTRA_DELAY_DMA 0
  342. #endif
  343. static spitest_param_set_t mode_pgroup[] = {
  344. {
  345. .pset_name = "Mode 0",
  346. .freq_list = test_freq_mode_local,
  347. .master_limit = 13 * 1000 * 1000,
  348. .dup = FULL_DUPLEX,
  349. .mode = 0,
  350. .master_iomux = false,
  351. .slave_iomux = LOCAL_MODE_TEST_SLAVE_IOMUX,
  352. .slave_tv_ns = TV_INT_CONNECT,
  353. },
  354. {
  355. .pset_name = "Mode 1",
  356. .freq_list = test_freq_mode_local,
  357. .freq_limit = 26 * 1000 * 1000,
  358. .master_limit = 13 * 1000 * 1000,
  359. .dup = FULL_DUPLEX,
  360. .mode = 1,
  361. .master_iomux = false,
  362. .slave_iomux = LOCAL_MODE_TEST_SLAVE_IOMUX,
  363. .slave_tv_ns = TV_INT_CONNECT,
  364. },
  365. {
  366. .pset_name = "Mode 2",
  367. .freq_list = test_freq_mode_local,
  368. .master_limit = 13 * 1000 * 1000,
  369. .dup = FULL_DUPLEX,
  370. .mode = 2,
  371. .master_iomux = false,
  372. .slave_iomux = LOCAL_MODE_TEST_SLAVE_IOMUX,
  373. .slave_tv_ns = TV_INT_CONNECT,
  374. },
  375. {
  376. .pset_name = "Mode 3",
  377. .freq_list = test_freq_mode_local,
  378. .freq_limit = 26 * 1000 * 1000,
  379. .master_limit = 13 * 1000 * 1000,
  380. .dup = FULL_DUPLEX,
  381. .mode = 3,
  382. .master_iomux = false,
  383. .slave_iomux = LOCAL_MODE_TEST_SLAVE_IOMUX,
  384. .slave_tv_ns = TV_INT_CONNECT,
  385. },
  386. {
  387. .pset_name = "Mode 0, DMA",
  388. .freq_list = test_freq_mode_local,
  389. .master_limit = 13 * 1000 * 1000,
  390. .dup = FULL_DUPLEX,
  391. .mode = 0,
  392. .slave_dma_chan = SPI_DMA_CH_AUTO,
  393. .master_iomux = false,
  394. .slave_iomux = LOCAL_MODE_TEST_SLAVE_IOMUX,
  395. .slave_tv_ns = TV_INT_CONNECT,
  396. .length_aligned = true,
  397. },
  398. {
  399. .pset_name = "Mode 1, DMA",
  400. .freq_list = test_freq_mode_local,
  401. .freq_limit = 26 * 1000 * 1000,
  402. .master_limit = 13 * 1000 * 1000,
  403. .dup = FULL_DUPLEX,
  404. .mode = 1,
  405. .slave_dma_chan = SPI_DMA_CH_AUTO,
  406. .master_iomux = false,
  407. .slave_iomux = LOCAL_MODE_TEST_SLAVE_IOMUX,
  408. .slave_tv_ns = TV_INT_CONNECT,
  409. .length_aligned = true,
  410. },
  411. {
  412. .pset_name = "Mode 2, DMA",
  413. .freq_list = test_freq_mode_local,
  414. .master_limit = 13 * 1000 * 1000,
  415. .dup = FULL_DUPLEX,
  416. .mode = 2,
  417. .slave_dma_chan = SPI_DMA_CH_AUTO,
  418. .master_iomux = false,
  419. .slave_iomux = LOCAL_MODE_TEST_SLAVE_IOMUX,
  420. .slave_tv_ns = TV_INT_CONNECT,
  421. .length_aligned = true,
  422. },
  423. {
  424. .pset_name = "Mode 3, DMA",
  425. .freq_list = test_freq_mode_local,
  426. .freq_limit = 26 * 1000 * 1000,
  427. .master_limit = 13 * 1000 * 1000,
  428. .dup = FULL_DUPLEX,
  429. .mode = 3,
  430. .slave_dma_chan = SPI_DMA_CH_AUTO,
  431. .master_iomux = false,
  432. .slave_iomux = LOCAL_MODE_TEST_SLAVE_IOMUX,
  433. .slave_tv_ns = TV_INT_CONNECT,
  434. .length_aligned = true,
  435. },
  436. /////////////////////////// MISO ////////////////////////////////////
  437. {
  438. .pset_name = "MISO, Mode 0",
  439. .freq_list = test_freq_mode_local,
  440. .dup = HALF_DUPLEX_MISO,
  441. .mode = 0,
  442. .master_iomux = false,
  443. .slave_iomux = LOCAL_MODE_TEST_SLAVE_IOMUX,
  444. .slave_tv_ns = TV_INT_CONNECT,
  445. },
  446. {
  447. .pset_name = "MISO, Mode 1",
  448. .freq_list = test_freq_mode_local,
  449. .dup = HALF_DUPLEX_MISO,
  450. .mode = 1,
  451. .master_iomux = false,
  452. .slave_iomux = LOCAL_MODE_TEST_SLAVE_IOMUX,
  453. .slave_tv_ns = TV_INT_CONNECT,
  454. },
  455. {
  456. .pset_name = "MISO, Mode 2",
  457. .freq_list = test_freq_mode_local,
  458. .dup = HALF_DUPLEX_MISO,
  459. .mode = 2,
  460. .master_iomux = false,
  461. .slave_iomux = LOCAL_MODE_TEST_SLAVE_IOMUX,
  462. .slave_tv_ns = TV_INT_CONNECT,
  463. },
  464. {
  465. .pset_name = "MISO, Mode 3",
  466. .freq_list = test_freq_mode_local,
  467. .dup = HALF_DUPLEX_MISO,
  468. .mode = 3,
  469. .master_iomux = false,
  470. .slave_iomux = LOCAL_MODE_TEST_SLAVE_IOMUX,
  471. .slave_tv_ns = TV_INT_CONNECT,
  472. },
  473. {
  474. .pset_name = "MISO, Mode 0, DMA",
  475. .freq_list = test_freq_mode_local,
  476. .dup = HALF_DUPLEX_MISO,
  477. .mode = 0,
  478. .slave_dma_chan = SPI_DMA_CH_AUTO,
  479. .master_iomux = false,
  480. .slave_iomux = LOCAL_MODE_TEST_SLAVE_IOMUX,
  481. .slave_tv_ns = TV_INT_CONNECT + SLAVE_EXTRA_DELAY_DMA,
  482. .length_aligned = true,
  483. },
  484. {
  485. .pset_name = "MISO, Mode 1, DMA",
  486. .freq_list = test_freq_mode_local,
  487. .dup = HALF_DUPLEX_MISO,
  488. .mode = 1,
  489. .slave_dma_chan = SPI_DMA_CH_AUTO,
  490. .master_iomux = false,
  491. .slave_iomux = LOCAL_MODE_TEST_SLAVE_IOMUX,
  492. .slave_tv_ns = TV_INT_CONNECT,
  493. .length_aligned = true,
  494. },
  495. {
  496. .pset_name = "MISO, Mode 2, DMA",
  497. .freq_list = test_freq_mode_local,
  498. .dup = HALF_DUPLEX_MISO,
  499. .mode = 2,
  500. .slave_dma_chan = SPI_DMA_CH_AUTO,
  501. .master_iomux = false,
  502. .slave_iomux = LOCAL_MODE_TEST_SLAVE_IOMUX,
  503. .slave_tv_ns = TV_INT_CONNECT + SLAVE_EXTRA_DELAY_DMA,
  504. .length_aligned = true,
  505. },
  506. {
  507. .pset_name = "MISO, Mode 3, DMA",
  508. .freq_list = test_freq_mode_local,
  509. .dup = HALF_DUPLEX_MISO,
  510. .mode = 3,
  511. .slave_dma_chan = SPI_DMA_CH_AUTO,
  512. .master_iomux = false,
  513. .slave_iomux = LOCAL_MODE_TEST_SLAVE_IOMUX,
  514. .slave_tv_ns = TV_INT_CONNECT,
  515. .length_aligned = true,
  516. },
  517. };
  518. TEST_SPI_LOCAL(MODE, mode_pgroup)
  519. /**********************SPI master slave transaction length test*************/
  520. /* Test SPI slave can receive different length of data in all 4 modes (permutations of
  521. * CPOL/CPHA and when DMA is used or not).
  522. * Length from 1 to 16 bytes are tested.
  523. */
  524. #define MASTER_DATA_RAND_SEED 123
  525. #define SLAVE_DATA_RAND_SEED 456
  526. TEST_CASE("Slave receive correct data", "[spi]")
  527. {
  528. // Initialize device handle and spi bus
  529. unsigned int master_seed_send = MASTER_DATA_RAND_SEED;
  530. unsigned int slave_seed_send = SLAVE_DATA_RAND_SEED;
  531. unsigned int master_seed_cmp = slave_seed_send;
  532. unsigned int slave_seed_cmp = master_seed_send;
  533. const int buf_size = 20;
  534. WORD_ALIGNED_ATTR uint8_t slave_sendbuf[buf_size];
  535. WORD_ALIGNED_ATTR uint8_t slave_recvbuf[buf_size];
  536. WORD_ALIGNED_ATTR uint8_t master_sendbuf[buf_size];
  537. WORD_ALIGNED_ATTR uint8_t master_recvbuf[buf_size];
  538. uint8_t master_cmpbuf[buf_size];
  539. uint8_t slave_cmpbuf[buf_size];
  540. for (int spi_mode = 0; spi_mode < 4; spi_mode++) {
  541. for (int dma_chan = 0; dma_chan < 2; dma_chan++) {
  542. spi_device_handle_t spi;
  543. spitest_param_set_t test_param = {
  544. .dup = FULL_DUPLEX,
  545. .mode = spi_mode,
  546. .master_iomux = false,
  547. .slave_iomux = false,
  548. .master_dma_chan = 0,
  549. .slave_dma_chan = (dma_chan ? SPI_DMA_CH_AUTO : 0),
  550. };
  551. ESP_LOGI(SLAVE_TAG, "Test slave recv @ mode %d, dma enabled=%d", spi_mode, dma_chan);
  552. local_test_start(&spi, 1000 * 1000, &test_param, NULL);
  553. for (int round = 0; round < 20; round++) {
  554. // printf("trans %d\n", round);
  555. int master_trans_len = round + 1;
  556. const int slave_trans_len = 16;
  557. memset(master_sendbuf, 0xcc, buf_size);
  558. memset(slave_sendbuf, 0x55, buf_size);
  559. memset(master_recvbuf, 0xaa, buf_size);
  560. memset(slave_recvbuf, 0xbb, buf_size);
  561. for (int i = 0; i < master_trans_len; i++) {
  562. master_sendbuf[i] = rand_r(&master_seed_send);
  563. slave_sendbuf[i] = rand_r(&slave_seed_send);
  564. }
  565. spi_slave_transaction_t slave_trans = {
  566. .length = slave_trans_len * 8,
  567. .tx_buffer = slave_sendbuf,
  568. .rx_buffer = slave_recvbuf
  569. };
  570. esp_err_t ret = spi_slave_queue_trans(TEST_SLAVE_HOST, &slave_trans, portMAX_DELAY);
  571. TEST_ESP_OK(ret);
  572. spi_transaction_t master_trans = {
  573. .length = 8 * master_trans_len,
  574. .tx_buffer = master_sendbuf,
  575. .rx_buffer = master_recvbuf
  576. };
  577. ret = spi_device_transmit(spi, &master_trans);
  578. TEST_ESP_OK(ret);
  579. spi_slave_transaction_t *out_trans;
  580. ret = spi_slave_get_trans_result(TEST_SLAVE_HOST, &out_trans, portMAX_DELAY);
  581. TEST_ESP_OK(ret);
  582. TEST_ASSERT_EQUAL_HEX32(&slave_trans, out_trans);
  583. for (int i = 0; i < master_trans_len; i++) {
  584. master_cmpbuf[i] = rand_r(&master_seed_cmp);
  585. slave_cmpbuf[i] = rand_r(&slave_seed_cmp);
  586. }
  587. // esp_log_buffer_hex("master_send", master_sendbuf, buf_size);
  588. // esp_log_buffer_hex("slave_recv", slave_recvbuf, buf_size);
  589. // esp_log_buffer_hex("slave_send", slave_sendbuf, buf_size);
  590. // esp_log_buffer_hex("master_recv", master_recvbuf, buf_size);
  591. int master_expected_len = MIN(master_trans_len, slave_trans_len);
  592. TEST_ASSERT_EQUAL_HEX8_ARRAY(master_cmpbuf, master_recvbuf, master_expected_len);
  593. int slave_expected_len;
  594. if (dma_chan) {
  595. slave_expected_len = (master_expected_len & (~3));
  596. } else {
  597. slave_expected_len = master_expected_len;
  598. }
  599. if (slave_expected_len) {
  600. TEST_ASSERT_EQUAL_HEX8_ARRAY(slave_cmpbuf, slave_recvbuf, slave_expected_len);
  601. }
  602. }
  603. local_test_end(spi);
  604. }
  605. }
  606. }
  607. #if !TEMPORARY_DISABLED_FOR_TARGETS(ESP32S2, ESP32S3, ESP32C3, ESP32C2)
  608. //These tests are ESP32 only due to lack of runners
  609. /********************************************************************************
  610. * Test By Master & Slave (2 boards)
  611. *
  612. * Wiring:
  613. * | Master | Slave |
  614. * | ------ | ----- |
  615. * | 12 | 19 |
  616. * | 13 | 23 |
  617. * | 14 | 18 |
  618. * | 15 | 5 |
  619. * | GND | GND |
  620. *
  621. ********************************************************************************/
  622. static void test_master_init(void **context);
  623. static void test_master_deinit(void *context);
  624. static void test_master_loop(const void *test_cfg, void *context);
  625. static const ptest_func_t master_test_func = {
  626. .pre_test = test_master_init,
  627. .post_test = test_master_deinit,
  628. .loop = test_master_loop,
  629. .def_param = spitest_def_param,
  630. };
  631. static void test_slave_init(void **context);
  632. static void test_slave_deinit(void *context);
  633. static void test_slave_loop(const void *test_cfg, void *context);
  634. static const ptest_func_t slave_test_func = {
  635. .pre_test = test_slave_init,
  636. .post_test = test_slave_deinit,
  637. .loop = test_slave_loop,
  638. .def_param = spitest_def_param,
  639. };
  640. //temporarily close mass data print to avoid pytest run too busy to timeout
  641. #define TEST_LOG_DBUG false
  642. #define TEST_SPI_MASTER_SLAVE(name, param_group, extra_tag) \
  643. PARAM_GROUP_DECLARE(name, param_group) \
  644. TEST_MASTER_SLAVE(name, param_group, "[spi_ms][test_env=generic_multi_device][timeout=120]"extra_tag, &master_test_func, &slave_test_func)
  645. /************ Master Code ***********************************************/
  646. static void test_master_init(void **arg)
  647. {
  648. TEST_ASSERT(*arg == NULL);
  649. *arg = malloc(sizeof(spitest_context_t));
  650. spitest_context_t *context = *arg;
  651. TEST_ASSERT(context != NULL);
  652. context->slave_context = (spi_slave_task_context_t) {};
  653. esp_err_t err = init_slave_context(&context->slave_context, TEST_SPI_HOST);
  654. TEST_ASSERT(err == ESP_OK);
  655. unity_send_signal("Master ready");
  656. }
  657. static void test_master_deinit(void *arg)
  658. {
  659. spitest_context_t *context = (spitest_context_t *)arg;
  660. deinit_slave_context(&context->slave_context);
  661. }
  662. static void test_master_start(spi_device_handle_t *spi, int freq, const spitest_param_set_t *pset, spitest_context_t *context)
  663. {
  664. //master config
  665. spi_bus_config_t buspset = SPI_BUS_TEST_DEFAULT_CONFIG();
  666. //this does nothing, but avoid the driver from using native pins
  667. if (!pset->master_iomux) {
  668. buspset.quadhd_io_num = UNCONNECTED_PIN;
  669. }
  670. spi_device_interface_config_t devpset = SPI_DEVICE_TEST_DEFAULT_CONFIG();
  671. devpset.spics_io_num = SPI2_IOMUX_PIN_NUM_CS;
  672. devpset.mode = pset->mode;
  673. const int cs_pretrans_max = 15;
  674. if (pset->dup == HALF_DUPLEX_MISO) {
  675. devpset.cs_ena_pretrans = cs_pretrans_max;
  676. devpset.flags |= SPI_DEVICE_HALFDUPLEX;
  677. } else if (pset->dup == HALF_DUPLEX_MOSI) {
  678. devpset.cs_ena_pretrans = cs_pretrans_max;
  679. devpset.flags |= SPI_DEVICE_NO_DUMMY;
  680. } else {
  681. devpset.cs_ena_pretrans = cs_pretrans_max;//20;
  682. }
  683. const int cs_posttrans_max = 15;
  684. devpset.cs_ena_posttrans = cs_posttrans_max;
  685. devpset.input_delay_ns = pset->slave_tv_ns;
  686. devpset.clock_speed_hz = freq;
  687. if (pset->master_limit != 0 && freq > pset->master_limit) {
  688. devpset.flags |= SPI_DEVICE_NO_DUMMY;
  689. }
  690. int dma_chan = (pset->master_dma_chan == 0) ? 0 : SPI_DMA_CH_AUTO;
  691. TEST_ESP_OK(spi_bus_initialize(TEST_SPI_HOST, &buspset, dma_chan));
  692. TEST_ESP_OK(spi_bus_add_device(TEST_SPI_HOST, &devpset, spi));
  693. //prepare data for the slave
  694. for (int i = 0; i < pset->test_size; i ++) {
  695. /* in the single board, the data is send to the slave task, then to the driver.
  696. * However, in this test we don't know the data received by the slave.
  697. * So we send to the return queue of the slave directly.
  698. */
  699. //xQueueSend( slave_context.data_to_send, &slave_txdata[i], portMAX_DELAY );
  700. uint8_t slave_buffer[320 + 8];
  701. int length;
  702. if (pset->dup != HALF_DUPLEX_MISO) {
  703. length = context->master_trans[i].length;
  704. } else {
  705. length = context->master_trans[i].rxlength;
  706. }
  707. uint32_t *ptr = (uint32_t *)slave_buffer;
  708. ptr[0] = length;
  709. ptr[1] = (uint32_t)context->slave_trans[i].start;
  710. if (context->master_trans[i].tx_buffer != NULL) {
  711. memcpy(ptr + 2, context->master_trans[i].tx_buffer, (context->master_trans[i].length + 7) / 8);
  712. }
  713. //Send to return queue directly
  714. xRingbufferSend(context->slave_context.data_received, slave_buffer, 8 + (length + 7) / 8, portMAX_DELAY);
  715. }
  716. memset(context->master_rxbuf, 0x66, sizeof(context->master_rxbuf));
  717. }
  718. static void test_master_loop(const void *arg1, void *arg2)
  719. {
  720. const spitest_param_set_t *test_cfg = (spitest_param_set_t *)arg1;
  721. spitest_context_t *context = (spitest_context_t *)arg2;
  722. spi_device_handle_t spi;
  723. spitest_init_transactions(test_cfg, context);
  724. const int *timing_speed_array = test_cfg->freq_list;
  725. ESP_LOGI(MASTER_TAG, "****************** %s ***************", test_cfg->pset_name);
  726. for (int i = 0; ; i++ ) {
  727. const int freq = timing_speed_array[i];
  728. if (freq == 0) {
  729. break;
  730. }
  731. if (test_cfg->freq_limit && freq > test_cfg->freq_limit) {
  732. break;
  733. }
  734. ESP_LOGI(MASTER_TAG, "==============> %dk", freq / 1000);
  735. test_master_start(&spi, freq, test_cfg, context);
  736. unity_wait_for_signal("Slave ready");
  737. for ( int j = 0; j < test_cfg->test_size; j ++ ) {
  738. //wait for both master and slave end
  739. ESP_LOGI( MASTER_TAG, "=> test%d", j );
  740. //send master tx data
  741. vTaskDelay(20);
  742. spi_transaction_t *t = &context->master_trans[j];
  743. TEST_ESP_OK (spi_device_transmit(spi, t) );
  744. int len = get_trans_len(test_cfg->dup, t);
  745. if (TEST_LOG_DBUG) {
  746. spitest_master_print_data(t, len);
  747. }
  748. size_t rcv_len;
  749. slave_rxdata_t *rcv_data = xRingbufferReceive( context->slave_context.data_received, &rcv_len, portMAX_DELAY );
  750. if (TEST_LOG_DBUG) {
  751. spitest_slave_print_data(rcv_data, false);
  752. }
  753. //check result
  754. bool check_master_data = (test_cfg->dup != HALF_DUPLEX_MOSI &&
  755. (test_cfg->master_limit == 0 || freq <= test_cfg->master_limit));
  756. const bool check_slave_data = false;
  757. const bool check_len = false;
  758. if (!check_master_data) {
  759. ESP_LOGI(MASTER_TAG, "skip data check due to duplex mode or freq.");
  760. } else {
  761. TEST_ESP_OK(spitest_check_data(len, t, rcv_data, check_master_data,
  762. check_len, check_slave_data));
  763. }
  764. //clean
  765. vRingbufferReturnItem( context->slave_context.data_received, rcv_data );
  766. }
  767. master_free_device_bus(spi);
  768. }
  769. }
  770. /************ Slave Code ***********************************************/
  771. static void test_slave_init(void **arg)
  772. {
  773. TEST_ASSERT(*arg == NULL);
  774. *arg = malloc(sizeof(spitest_context_t));
  775. spitest_context_t *context = (spitest_context_t *)*arg;
  776. TEST_ASSERT(context != NULL);
  777. context->slave_context = (spi_slave_task_context_t) {};
  778. esp_err_t err = init_slave_context( &context->slave_context, TEST_SPI_HOST);
  779. TEST_ASSERT( err == ESP_OK );
  780. unity_wait_for_signal("Master ready");
  781. xTaskCreate( spitest_slave_task, "spi_slave", 4096, &context->slave_context, 0, &context->handle_slave);
  782. }
  783. static void test_slave_deinit(void *arg)
  784. {
  785. spitest_context_t *context = (spitest_context_t *)arg;
  786. vTaskDelete( context->handle_slave );
  787. context->handle_slave = 0;
  788. deinit_slave_context(&context->slave_context);
  789. }
  790. static void timing_slave_start(int speed, const spitest_param_set_t *pset, spitest_context_t *context)
  791. {
  792. //slave config
  793. spi_bus_config_t slv_buscfg = SPI_BUS_TEST_DEFAULT_CONFIG();
  794. //this does nothing, but avoid the driver from using native pins
  795. if (!pset->slave_iomux) {
  796. slv_buscfg.quadhd_io_num = UNCONNECTED_PIN;
  797. }
  798. spi_slave_interface_config_t slvcfg = SPI_SLAVE_TEST_DEFAULT_CONFIG();
  799. slvcfg.spics_io_num = SPI2_IOMUX_PIN_NUM_CS;
  800. slvcfg.mode = pset->mode;
  801. //Enable pull-ups on SPI lines so we don't detect rogue pulses when no master is connected.
  802. slave_pull_up(&slv_buscfg, slvcfg.spics_io_num);
  803. int slave_dma_chan = (pset->slave_dma_chan == 0) ? 0 : SPI_DMA_CH_AUTO;
  804. TEST_ESP_OK(spi_slave_initialize(TEST_SPI_HOST, &slv_buscfg, &slvcfg, slave_dma_chan));
  805. //prepare data for the master
  806. for (int i = 0; i < pset->test_size; i++) {
  807. if (pset->dup == FULL_DUPLEX) {
  808. memcpy(context->master_trans[i].rx_buffer, context->slave_trans[i].start, (context->master_trans[i].length + 7) / 8);
  809. } else if (pset->dup == HALF_DUPLEX_MISO) {
  810. memcpy(context->master_trans[i].rx_buffer, context->slave_trans[i].start, (context->master_trans[i].rxlength + 7) / 8);
  811. }
  812. }
  813. }
  814. static void test_slave_loop(const void *arg1, void *arg2)
  815. {
  816. const spitest_param_set_t *pset = (spitest_param_set_t *)arg1;
  817. spitest_context_t *context = (spitest_context_t *)arg2;
  818. ESP_LOGI(SLAVE_TAG, "****************** %s ***************", pset->pset_name);
  819. spitest_init_transactions(pset, context);
  820. const int *timing_speed_array = pset->freq_list;
  821. for (int i = 0; ; i++ ) {
  822. const int freq = timing_speed_array[i];
  823. if (freq == 0) {
  824. break;
  825. }
  826. if (pset->freq_limit != 0 && freq > pset->freq_limit) {
  827. break;
  828. }
  829. ESP_LOGI(MASTER_TAG, "==============> %dk", timing_speed_array[i] / 1000);
  830. //Initialize SPI slave interface
  831. timing_slave_start(freq, pset, context);
  832. //prepare slave tx data
  833. for (int i = 0; i < pset->test_size; i ++) {
  834. xQueueSend( context->slave_context.data_to_send, &context->slave_trans[i], portMAX_DELAY );
  835. //memcpy(context->master_trans[i].rx_buffer, context->slave_trans[i].start, (context->master_trans[i].length+7)/8);
  836. }
  837. vTaskDelay(50 / portTICK_PERIOD_MS);
  838. unity_send_signal("Slave ready");
  839. for ( int i = 0; i < pset->test_size; i ++ ) {
  840. //wait for both master and slave end
  841. ESP_LOGI( MASTER_TAG, "===== test%d =====", i );
  842. //send master tx data
  843. vTaskDelay(20);
  844. spi_transaction_t *t = &context->master_trans[i];
  845. int len = get_trans_len(pset->dup, t);
  846. if (TEST_LOG_DBUG) {
  847. spitest_master_print_data(t, FULL_DUPLEX);
  848. }
  849. size_t rcv_len;
  850. slave_rxdata_t *rcv_data = xRingbufferReceive( context->slave_context.data_received, &rcv_len, portMAX_DELAY );
  851. if (TEST_LOG_DBUG) {
  852. spitest_slave_print_data(rcv_data, true);
  853. }
  854. //check result
  855. const bool check_master_data = false;
  856. bool check_slave_data = (pset->dup != HALF_DUPLEX_MISO);
  857. const bool check_len = true;
  858. TEST_ESP_OK(spitest_check_data(len, t, rcv_data, check_master_data, check_len, check_slave_data));
  859. //clean
  860. vRingbufferReturnItem( context->slave_context.data_received, rcv_data );
  861. }
  862. TEST_ASSERT(spi_slave_free(TEST_SPI_HOST) == ESP_OK);
  863. }
  864. }
  865. /************ Timing Test ***********************************************/
  866. static spitest_param_set_t timing_conf[] = {
  867. {
  868. .pset_name = "FULL_DUP, BOTH IOMUX",
  869. .freq_limit = ESP_SPI_SLAVE_MAX_FREQ,
  870. .master_limit = 16 * 1000 * 1000,
  871. .dup = FULL_DUPLEX,
  872. .master_iomux = true,
  873. .slave_iomux = true,
  874. .slave_tv_ns = TV_WITH_ESP_SLAVE,
  875. },
  876. {
  877. .pset_name = "FULL_DUP, MASTER IOMUX",
  878. .freq_limit = ESP_SPI_SLAVE_MAX_FREQ,
  879. .master_limit = 11 * 1000 * 1000,
  880. .dup = FULL_DUPLEX,
  881. .master_iomux = true,
  882. .slave_iomux = false,
  883. .slave_tv_ns = TV_WITH_ESP_SLAVE_GPIO,
  884. },
  885. {
  886. .pset_name = "FULL_DUP, SLAVE IOMUX",
  887. .freq_limit = ESP_SPI_SLAVE_MAX_FREQ,
  888. .master_limit = 11 * 1000 * 1000,
  889. .dup = FULL_DUPLEX,
  890. .master_iomux = false,
  891. .slave_iomux = true,
  892. .slave_tv_ns = TV_WITH_ESP_SLAVE,
  893. },
  894. {
  895. .pset_name = "FULL_DUP, BOTH GPIO",
  896. .freq_limit = ESP_SPI_SLAVE_MAX_FREQ,
  897. .master_limit = 9 * 1000 * 1000,
  898. .dup = FULL_DUPLEX,
  899. .master_iomux = false,
  900. .slave_iomux = false,
  901. .slave_tv_ns = TV_WITH_ESP_SLAVE_GPIO,
  902. },
  903. {
  904. .pset_name = "MOSI_DUP, BOTH IOMUX",
  905. .freq_limit = ESP_SPI_SLAVE_MAX_FREQ,
  906. .dup = HALF_DUPLEX_MOSI,
  907. .master_iomux = true,
  908. .slave_iomux = true,
  909. .slave_tv_ns = TV_WITH_ESP_SLAVE,
  910. },
  911. {
  912. .pset_name = "MOSI_DUP, MASTER IOMUX",
  913. .freq_limit = ESP_SPI_SLAVE_MAX_FREQ,
  914. .dup = HALF_DUPLEX_MOSI,
  915. .master_iomux = true,
  916. .slave_iomux = false,
  917. .slave_tv_ns = TV_WITH_ESP_SLAVE_GPIO,
  918. },
  919. {
  920. .pset_name = "MOSI_DUP, SLAVE IOMUX",
  921. .freq_limit = ESP_SPI_SLAVE_MAX_FREQ,
  922. .dup = HALF_DUPLEX_MOSI,
  923. .master_iomux = false,
  924. .slave_iomux = true,
  925. .slave_tv_ns = TV_WITH_ESP_SLAVE,
  926. },
  927. {
  928. .pset_name = "MOSI_DUP, BOTH GPIO",
  929. .freq_limit = ESP_SPI_SLAVE_MAX_FREQ,
  930. .dup = HALF_DUPLEX_MOSI,
  931. .master_iomux = false,
  932. .slave_iomux = false,
  933. .slave_tv_ns = TV_WITH_ESP_SLAVE_GPIO,
  934. },
  935. {
  936. .pset_name = "MISO_DUP, BOTH IOMUX",
  937. .freq_limit = ESP_SPI_SLAVE_MAX_FREQ,
  938. .dup = HALF_DUPLEX_MISO,
  939. .master_iomux = true,
  940. .slave_iomux = true,
  941. .slave_tv_ns = TV_WITH_ESP_SLAVE,
  942. },
  943. {
  944. .pset_name = "MISO_DUP, MASTER IOMUX",
  945. .freq_limit = ESP_SPI_SLAVE_MAX_FREQ,
  946. .dup = HALF_DUPLEX_MISO,
  947. .master_iomux = true,
  948. .slave_iomux = false,
  949. .slave_tv_ns = TV_WITH_ESP_SLAVE_GPIO,
  950. },
  951. {
  952. .pset_name = "MISO_DUP, SLAVE IOMUX",
  953. .freq_limit = ESP_SPI_SLAVE_MAX_FREQ,
  954. .dup = HALF_DUPLEX_MISO,
  955. .master_iomux = false,
  956. .slave_iomux = true,
  957. .slave_tv_ns = TV_WITH_ESP_SLAVE,
  958. },
  959. {
  960. .pset_name = "MISO_DUP, BOTH GPIO",
  961. .freq_limit = ESP_SPI_SLAVE_MAX_FREQ,
  962. .dup = HALF_DUPLEX_MISO,
  963. .master_iomux = false,
  964. .slave_iomux = false,
  965. .slave_tv_ns = TV_WITH_ESP_SLAVE_GPIO,
  966. },
  967. };
  968. TEST_SPI_MASTER_SLAVE(TIMING, timing_conf, "")
  969. /************ Mode Test ***********************************************/
  970. #define FREQ_LIMIT_MODE 16 * 1000 * 1000
  971. //Set to this input delay so that the master will read with delay until 7M
  972. #define DELAY_HCLK_UNTIL_7M 12.5*3
  973. static int test_freq_mode_ms[] = {
  974. 100 * 1000,
  975. 6 * 1000 * 1000,
  976. 7 * 1000 * 1000,
  977. 8 * 1000 * 1000, //maximum freq MISO stable before next latch edge
  978. 9 * 1000 * 1000, //maximum freq MISO stable before next latch edge
  979. 10 * 1000 * 1000,
  980. 11 * 1000 * 1000,
  981. 13 * 1000 * 1000,
  982. 16 * 1000 * 1000,
  983. 20 * 1000 * 1000,
  984. 0,
  985. };
  986. static int test_freq_20M_only[] = {
  987. 20 * 1000 * 1000,
  988. 0,
  989. };
  990. spitest_param_set_t mode_conf[] = {
  991. //non-DMA tests
  992. {
  993. .pset_name = "mode 0, no DMA",
  994. .freq_list = test_freq_mode_ms,
  995. .master_limit = FREQ_LIMIT_MODE,
  996. .dup = FULL_DUPLEX,
  997. .master_iomux = true,
  998. .slave_iomux = true,
  999. .slave_tv_ns = TV_WITH_ESP_SLAVE,
  1000. .mode = 0,
  1001. },
  1002. {
  1003. .pset_name = "mode 1, no DMA",
  1004. .freq_list = test_freq_mode_ms,
  1005. .master_limit = FREQ_LIMIT_MODE,
  1006. .dup = FULL_DUPLEX,
  1007. .master_iomux = true,
  1008. .slave_iomux = true,
  1009. .slave_tv_ns = TV_WITH_ESP_SLAVE,
  1010. .mode = 1,
  1011. },
  1012. {
  1013. .pset_name = "mode 2, no DMA",
  1014. .freq_list = test_freq_mode_ms,
  1015. .master_limit = FREQ_LIMIT_MODE,
  1016. .dup = FULL_DUPLEX,
  1017. .master_iomux = true,
  1018. .slave_iomux = true,
  1019. .slave_tv_ns = TV_WITH_ESP_SLAVE,
  1020. .mode = 2,
  1021. },
  1022. {
  1023. .pset_name = "mode 3, no DMA",
  1024. .freq_list = test_freq_mode_ms,
  1025. .master_limit = FREQ_LIMIT_MODE,
  1026. .dup = FULL_DUPLEX,
  1027. .master_iomux = true,
  1028. .slave_iomux = true,
  1029. .slave_tv_ns = TV_WITH_ESP_SLAVE,
  1030. .mode = 3,
  1031. },
  1032. //the master can only read to 16MHz, use half-duplex mode to read at 20.
  1033. {
  1034. .pset_name = "mode 0, no DMA, 20M",
  1035. .freq_list = test_freq_20M_only,
  1036. .dup = HALF_DUPLEX_MISO,
  1037. .master_iomux = true,
  1038. .slave_iomux = true,
  1039. .slave_tv_ns = TV_WITH_ESP_SLAVE,
  1040. .mode = 0,
  1041. },
  1042. {
  1043. .pset_name = "mode 1, no DMA, 20M",
  1044. .freq_list = test_freq_20M_only,
  1045. .dup = HALF_DUPLEX_MISO,
  1046. .master_iomux = true,
  1047. .slave_iomux = true,
  1048. .slave_tv_ns = TV_WITH_ESP_SLAVE,
  1049. .mode = 1,
  1050. },
  1051. {
  1052. .pset_name = "mode 2, no DMA, 20M",
  1053. .freq_list = test_freq_20M_only,
  1054. .dup = HALF_DUPLEX_MISO,
  1055. .master_iomux = true,
  1056. .slave_iomux = true,
  1057. .slave_tv_ns = TV_WITH_ESP_SLAVE,
  1058. .mode = 2,
  1059. },
  1060. {
  1061. .pset_name = "mode 3, no DMA, 20M",
  1062. .freq_list = test_freq_20M_only,
  1063. .dup = HALF_DUPLEX_MISO,
  1064. .master_iomux = true,
  1065. .slave_iomux = true,
  1066. .slave_tv_ns = TV_WITH_ESP_SLAVE,
  1067. .mode = 3,
  1068. },
  1069. //DMA tests
  1070. {
  1071. .pset_name = "mode 0, DMA",
  1072. .freq_list = test_freq_mode_ms,
  1073. .master_limit = FREQ_LIMIT_MODE,
  1074. .dup = FULL_DUPLEX,
  1075. .master_iomux = true,
  1076. .slave_iomux = true,
  1077. .slave_tv_ns = DELAY_HCLK_UNTIL_7M,
  1078. .mode = 0,
  1079. .master_dma_chan = SPI_DMA_CH_AUTO,
  1080. .slave_dma_chan = SPI_DMA_CH_AUTO,
  1081. .length_aligned = true,
  1082. },
  1083. {
  1084. .pset_name = "mode 1, DMA",
  1085. .freq_list = test_freq_mode_ms,
  1086. .master_limit = FREQ_LIMIT_MODE,
  1087. .dup = FULL_DUPLEX,
  1088. .master_iomux = true,
  1089. .slave_iomux = true,
  1090. .slave_tv_ns = TV_WITH_ESP_SLAVE,
  1091. .mode = 1,
  1092. .master_dma_chan = SPI_DMA_CH_AUTO,
  1093. .slave_dma_chan = SPI_DMA_CH_AUTO,
  1094. .length_aligned = true,
  1095. },
  1096. {
  1097. .pset_name = "mode 2, DMA",
  1098. .freq_list = test_freq_mode_ms,
  1099. .master_limit = FREQ_LIMIT_MODE,
  1100. .dup = FULL_DUPLEX,
  1101. .master_iomux = true,
  1102. .slave_iomux = true,
  1103. .slave_tv_ns = DELAY_HCLK_UNTIL_7M,
  1104. .mode = 2,
  1105. .master_dma_chan = SPI_DMA_CH_AUTO,
  1106. .slave_dma_chan = SPI_DMA_CH_AUTO,
  1107. .length_aligned = true,
  1108. },
  1109. {
  1110. .pset_name = "mode 3, DMA",
  1111. .freq_list = test_freq_mode_ms,
  1112. .master_limit = FREQ_LIMIT_MODE,
  1113. .dup = FULL_DUPLEX,
  1114. .master_iomux = true,
  1115. .slave_iomux = true,
  1116. .slave_tv_ns = TV_WITH_ESP_SLAVE,
  1117. .mode = 3,
  1118. .master_dma_chan = SPI_DMA_CH_AUTO,
  1119. .slave_dma_chan = SPI_DMA_CH_AUTO,
  1120. .length_aligned = true,
  1121. },
  1122. //the master can only read to 16MHz, use half-duplex mode to read at 20.
  1123. {
  1124. .pset_name = "mode 0, DMA, 20M",
  1125. .freq_list = test_freq_20M_only,
  1126. .dup = HALF_DUPLEX_MISO,
  1127. .master_iomux = true,
  1128. .slave_iomux = true,
  1129. .slave_tv_ns = TV_WITH_ESP_SLAVE,
  1130. .mode = 0,
  1131. .master_dma_chan = SPI_DMA_CH_AUTO,
  1132. .slave_dma_chan = SPI_DMA_CH_AUTO,
  1133. },
  1134. {
  1135. .pset_name = "mode 1, DMA, 20M",
  1136. .freq_list = test_freq_20M_only,
  1137. .dup = HALF_DUPLEX_MISO,
  1138. .master_iomux = true,
  1139. .slave_iomux = true,
  1140. .slave_tv_ns = TV_WITH_ESP_SLAVE,
  1141. .mode = 1,
  1142. .master_dma_chan = SPI_DMA_CH_AUTO,
  1143. .slave_dma_chan = SPI_DMA_CH_AUTO,
  1144. },
  1145. {
  1146. .pset_name = "mode 2, DMA, 20M",
  1147. .freq_list = test_freq_20M_only,
  1148. .dup = HALF_DUPLEX_MISO,
  1149. .master_iomux = true,
  1150. .slave_iomux = true,
  1151. .slave_tv_ns = TV_WITH_ESP_SLAVE,
  1152. .mode = 2,
  1153. .master_dma_chan = SPI_DMA_CH_AUTO,
  1154. .slave_dma_chan = SPI_DMA_CH_AUTO,
  1155. },
  1156. {
  1157. .pset_name = "mode 3, DMA, 20M",
  1158. .freq_list = test_freq_20M_only,
  1159. .dup = HALF_DUPLEX_MISO,
  1160. .master_iomux = true,
  1161. .slave_iomux = true,
  1162. .slave_tv_ns = TV_WITH_ESP_SLAVE,
  1163. .mode = 3,
  1164. .master_dma_chan = SPI_DMA_CH_AUTO,
  1165. .slave_dma_chan = SPI_DMA_CH_AUTO,
  1166. },
  1167. };
  1168. TEST_SPI_MASTER_SLAVE(MODE, mode_conf, "")
  1169. #endif // !TEMPORARY_DISABLED_FOR_TARGETS(ESP32S2, ESP32S3, ESP32C3, ESP32C2)
  1170. #endif // #if (TEST_SPI_PERIPH_NUM >= 2)
  1171. #define TEST_STEP_LEN 96
  1172. #define TEST_STEP 2
  1173. static int s_spi_bus_freq[] = {
  1174. IDF_PERFORMANCE_MAX_SPI_CLK_FREQ / 10,
  1175. IDF_PERFORMANCE_MAX_SPI_CLK_FREQ / 7,
  1176. IDF_PERFORMANCE_MAX_SPI_CLK_FREQ / 4,
  1177. IDF_PERFORMANCE_MAX_SPI_CLK_FREQ / 2,
  1178. IDF_PERFORMANCE_MAX_SPI_CLK_FREQ,
  1179. };
  1180. //------------------------------------------- Full Duplex with DMA Freq test --------------------------------------
  1181. static void test_master_fd_dma(void)
  1182. {
  1183. spi_device_handle_t dev0;
  1184. uint8_t *master_send = heap_caps_malloc(TEST_STEP_LEN, MALLOC_CAP_DMA);
  1185. uint8_t *master_recive = heap_caps_malloc(TEST_STEP_LEN, MALLOC_CAP_DMA);
  1186. uint8_t *master_expect = heap_caps_malloc(TEST_STEP_LEN, MALLOC_CAP_DEFAULT);
  1187. for (uint8_t is_gpio = 0; is_gpio < 2; is_gpio++) {
  1188. for (uint8_t mode = 0; mode < 4; mode++) {
  1189. spi_bus_config_t buscfg = SPI_BUS_TEST_DEFAULT_CONFIG();
  1190. if (is_gpio) {
  1191. buscfg.flags |= SPICOMMON_BUSFLAG_GPIO_PINS;
  1192. }
  1193. TEST_ESP_OK(spi_bus_initialize(TEST_SPI_HOST, &buscfg, SPI_DMA_CH_AUTO));
  1194. for (uint8_t speed_level = 0; speed_level < sizeof(s_spi_bus_freq) / sizeof(int); speed_level++) {
  1195. spi_device_interface_config_t devcfg = {
  1196. .mode = mode,
  1197. .spics_io_num = PIN_NUM_CS,
  1198. .queue_size = 16,
  1199. .clock_speed_hz = s_spi_bus_freq[speed_level],
  1200. };
  1201. #if CONFIG_IDF_TARGET_ESP32
  1202. if (is_gpio && (s_spi_bus_freq[speed_level] >= 10 * 1000 * 1000)) {
  1203. continue; //On esp32 with GPIO Matrix, clk freq <= 10MHz
  1204. }
  1205. devcfg.cs_ena_pretrans = 2;
  1206. devcfg.input_delay_ns = 12.5 * 2;
  1207. #endif
  1208. TEST_ESP_OK(spi_bus_add_device(TEST_SPI_HOST, &devcfg, &dev0));
  1209. printf("Next trans: %s\tmode:%d\t@%.2f MHz\n", (is_gpio) ? "GPIO_Matrix" : "IOMUX", mode, s_spi_bus_freq[speed_level] / 1000000.f);
  1210. unity_send_signal("Master ready");
  1211. for (int i = 0; i < TEST_STEP; i++) {
  1212. memset(master_recive, 0x00, TEST_STEP_LEN);
  1213. get_tx_buffer(119 + mode + speed_level + i, master_send, master_expect, TEST_STEP_LEN);
  1214. uint32_t test_trans_len = TEST_STEP_LEN;
  1215. spi_transaction_t trans_cfg = {
  1216. .tx_buffer = master_send,
  1217. .rx_buffer = master_recive,
  1218. .length = test_trans_len * 8,
  1219. };
  1220. unity_wait_for_signal("Slave ready");
  1221. TEST_ESP_OK(spi_device_transmit(dev0, &trans_cfg));
  1222. ESP_LOG_BUFFER_HEX("master tx", master_send, test_trans_len);
  1223. ESP_LOG_BUFFER_HEX_LEVEL("master rx", master_recive, test_trans_len, ESP_LOG_DEBUG);
  1224. ESP_LOG_BUFFER_HEX_LEVEL("master exp", master_expect, test_trans_len, ESP_LOG_DEBUG);
  1225. spitest_cmp_or_dump(master_expect, master_recive, test_trans_len);
  1226. }
  1227. TEST_ESP_OK(spi_bus_remove_device(dev0));
  1228. }
  1229. TEST_ESP_OK(spi_bus_free(TEST_SPI_HOST));
  1230. }
  1231. }
  1232. free(master_send);
  1233. free(master_recive);
  1234. free(master_expect);
  1235. }
  1236. static void test_slave_fd_dma(void)
  1237. {
  1238. uint8_t *slave_send = heap_caps_malloc(TEST_STEP_LEN, MALLOC_CAP_DMA);
  1239. uint8_t *slave_recive = heap_caps_malloc(TEST_STEP_LEN, MALLOC_CAP_DMA);
  1240. uint8_t *slave_expect = heap_caps_malloc(TEST_STEP_LEN, MALLOC_CAP_DEFAULT);
  1241. for (uint8_t is_gpio = 0; is_gpio < 2; is_gpio++) {
  1242. spi_bus_config_t buscfg = SPI_BUS_TEST_DEFAULT_CONFIG();
  1243. if (is_gpio) {
  1244. buscfg.flags |= SPICOMMON_BUSFLAG_GPIO_PINS;
  1245. }
  1246. for (uint8_t mode = 0; mode < 4; mode++) {
  1247. spi_slave_interface_config_t slvcfg = SPI_SLAVE_TEST_DEFAULT_CONFIG();
  1248. slvcfg.mode = mode;
  1249. TEST_ESP_OK(spi_slave_initialize(TEST_SPI_HOST, &buscfg, &slvcfg, SPI_DMA_CH_AUTO));
  1250. for (uint8_t speed_level = 0; speed_level < sizeof(s_spi_bus_freq) / sizeof(int); speed_level++) {
  1251. #if CONFIG_IDF_TARGET_ESP32
  1252. if (is_gpio && (s_spi_bus_freq[speed_level] >= 10 * 1000 * 1000)) {
  1253. continue; //On esp32 with GPIO Matrix, clk freq <= 10MHz
  1254. }
  1255. #endif
  1256. printf("Next trans: %s\tmode:%d\t@%.2f MHz\n", (is_gpio) ? "GPIO_Matrix" : "IOMUX", mode, s_spi_bus_freq[speed_level] / 1000000.f);
  1257. unity_wait_for_signal("Master ready");
  1258. for (int i = 0; i < TEST_STEP; i++) {
  1259. memset(slave_recive, 0x00, TEST_STEP_LEN);
  1260. get_tx_buffer(119 + mode + speed_level + i, slave_expect, slave_send, TEST_STEP_LEN);
  1261. uint32_t test_trans_len = TEST_STEP_LEN;
  1262. spi_slave_transaction_t trans_cfg = {
  1263. .tx_buffer = slave_send,
  1264. .rx_buffer = slave_recive,
  1265. .length = test_trans_len * 8,
  1266. };
  1267. unity_send_signal("Slave ready");
  1268. TEST_ESP_OK(spi_slave_transmit(TEST_SPI_HOST, &trans_cfg, portMAX_DELAY));
  1269. ESP_LOG_BUFFER_HEX("slave tx", slave_send, test_trans_len);
  1270. ESP_LOG_BUFFER_HEX_LEVEL("slave rx", slave_recive, test_trans_len, ESP_LOG_DEBUG);
  1271. ESP_LOG_BUFFER_HEX_LEVEL("slave exp", slave_expect, test_trans_len, ESP_LOG_DEBUG);
  1272. spitest_cmp_or_dump(slave_expect, slave_recive, test_trans_len);
  1273. }
  1274. }
  1275. TEST_ESP_OK(spi_slave_free(TEST_SPI_HOST));
  1276. }
  1277. }
  1278. free(slave_send);
  1279. free(slave_recive);
  1280. free(slave_expect);
  1281. }
  1282. TEST_CASE_MULTIPLE_DEVICES("TEST_SPI_Freq_FD_DMA", "[spi_ms][timeout=30]", test_master_fd_dma, test_slave_fd_dma);
  1283. //------------------------------------------- Full Duplex no DMA Freq test --------------------------------------
  1284. static void test_master_fd_no_dma(void)
  1285. {
  1286. spi_device_handle_t dev0;
  1287. uint8_t *master_send = heap_caps_malloc(SOC_SPI_MAXIMUM_BUFFER_SIZE, MALLOC_CAP_DMA);
  1288. uint8_t *master_recive = heap_caps_malloc(SOC_SPI_MAXIMUM_BUFFER_SIZE, MALLOC_CAP_DMA);
  1289. uint8_t *master_expect = heap_caps_malloc(SOC_SPI_MAXIMUM_BUFFER_SIZE, MALLOC_CAP_DEFAULT);
  1290. for (uint8_t is_gpio = 0; is_gpio < 2; is_gpio++) {
  1291. for (uint8_t mode = 0; mode < 4; mode++) {
  1292. spi_bus_config_t buscfg = SPI_BUS_TEST_DEFAULT_CONFIG();
  1293. if (is_gpio) {
  1294. buscfg.flags |= SPICOMMON_BUSFLAG_GPIO_PINS;
  1295. }
  1296. TEST_ESP_OK(spi_bus_initialize(TEST_SPI_HOST, &buscfg, SPI_DMA_DISABLED));
  1297. for (uint8_t speed_level = 0; speed_level < sizeof(s_spi_bus_freq) / sizeof(int); speed_level++) {
  1298. spi_device_interface_config_t devcfg = {
  1299. .mode = mode,
  1300. .spics_io_num = PIN_NUM_CS,
  1301. .queue_size = 16,
  1302. .clock_speed_hz = s_spi_bus_freq[speed_level],
  1303. };
  1304. #if CONFIG_IDF_TARGET_ESP32
  1305. if (is_gpio && (s_spi_bus_freq[speed_level] >= 10 * 1000 * 1000)) {
  1306. continue; //On esp32 with GPIO Matrix, clk freq <= 10MHz
  1307. }
  1308. devcfg.cs_ena_pretrans = 2,
  1309. devcfg.input_delay_ns = 12.5 * 2,
  1310. #endif
  1311. TEST_ESP_OK(spi_bus_add_device(TEST_SPI_HOST, &devcfg, &dev0));
  1312. printf("Next trans: %s\tmode:%d\t@%.2f MHz\n", (is_gpio) ? "GPIO_Matrix" : "IOMUX", mode, s_spi_bus_freq[speed_level] / 1000000.f);
  1313. unity_send_signal("Master ready");
  1314. for (int i = 0; i < TEST_STEP; i++) {
  1315. memset(master_recive, 0x00, SOC_SPI_MAXIMUM_BUFFER_SIZE);
  1316. get_tx_buffer(211 + mode + speed_level + i, master_send, master_expect, SOC_SPI_MAXIMUM_BUFFER_SIZE);
  1317. uint32_t test_trans_len = SOC_SPI_MAXIMUM_BUFFER_SIZE;
  1318. spi_transaction_t trans_cfg = {
  1319. .tx_buffer = master_send,
  1320. .rx_buffer = master_recive,
  1321. .length = test_trans_len * 8,
  1322. };
  1323. unity_wait_for_signal("Slave ready");
  1324. TEST_ESP_OK(spi_device_transmit(dev0, &trans_cfg));
  1325. ESP_LOG_BUFFER_HEX("master tx", master_send, test_trans_len);
  1326. ESP_LOG_BUFFER_HEX_LEVEL("master rx", master_recive, test_trans_len, ESP_LOG_DEBUG);
  1327. ESP_LOG_BUFFER_HEX_LEVEL("master exp", master_expect, test_trans_len, ESP_LOG_DEBUG);
  1328. spitest_cmp_or_dump(master_expect, master_recive, test_trans_len);
  1329. }
  1330. TEST_ESP_OK(spi_bus_remove_device(dev0));
  1331. }
  1332. TEST_ESP_OK(spi_bus_free(TEST_SPI_HOST));
  1333. }
  1334. }
  1335. free(master_send);
  1336. free(master_recive);
  1337. free(master_expect);
  1338. }
  1339. static void test_slave_fd_no_dma(void)
  1340. {
  1341. uint8_t *slave_send = heap_caps_malloc(SOC_SPI_MAXIMUM_BUFFER_SIZE, MALLOC_CAP_DMA);
  1342. uint8_t *slave_recive = heap_caps_malloc(SOC_SPI_MAXIMUM_BUFFER_SIZE, MALLOC_CAP_DMA);
  1343. uint8_t *slave_expect = heap_caps_malloc(SOC_SPI_MAXIMUM_BUFFER_SIZE, MALLOC_CAP_DEFAULT);
  1344. for (uint8_t is_gpio = 0; is_gpio < 2; is_gpio++) {
  1345. spi_bus_config_t buscfg = SPI_BUS_TEST_DEFAULT_CONFIG();
  1346. if (is_gpio) {
  1347. buscfg.flags |= SPICOMMON_BUSFLAG_GPIO_PINS;
  1348. }
  1349. for (uint8_t mode = 0; mode < 4; mode++) {
  1350. spi_slave_interface_config_t slvcfg = SPI_SLAVE_TEST_DEFAULT_CONFIG();
  1351. slvcfg.mode = mode;
  1352. TEST_ESP_OK(spi_slave_initialize(TEST_SPI_HOST, &buscfg, &slvcfg, SPI_DMA_DISABLED));
  1353. for (uint8_t speed_level = 0; speed_level < sizeof(s_spi_bus_freq) / sizeof(int); speed_level++) {
  1354. #if CONFIG_IDF_TARGET_ESP32
  1355. if (is_gpio && (s_spi_bus_freq[speed_level] >= 10 * 1000 * 1000)) {
  1356. continue; //On esp32 with GPIO Matrix, clk freq <= 10MHz
  1357. }
  1358. #endif
  1359. printf("Next trans: %s\tmode:%d\t@%.2f MHz\n", (is_gpio) ? "GPIO_Matrix" : "IOMUX", mode, s_spi_bus_freq[speed_level] / 1000000.f);
  1360. unity_wait_for_signal("Master ready");
  1361. for (int i = 0; i < TEST_STEP; i++) {
  1362. memset(slave_recive, 0x00, SOC_SPI_MAXIMUM_BUFFER_SIZE);
  1363. get_tx_buffer(211 + mode + speed_level + i, slave_expect, slave_send, SOC_SPI_MAXIMUM_BUFFER_SIZE);
  1364. uint32_t test_trans_len = SOC_SPI_MAXIMUM_BUFFER_SIZE;
  1365. spi_slave_transaction_t trans_cfg = {
  1366. .tx_buffer = slave_send,
  1367. .rx_buffer = slave_recive,
  1368. .length = test_trans_len * 8,
  1369. };
  1370. unity_send_signal("Slave ready");
  1371. TEST_ESP_OK(spi_slave_transmit(TEST_SPI_HOST, &trans_cfg, portMAX_DELAY));
  1372. ESP_LOG_BUFFER_HEX("slave tx", slave_send, test_trans_len);
  1373. ESP_LOG_BUFFER_HEX_LEVEL("slave rx", slave_recive, test_trans_len, ESP_LOG_DEBUG);
  1374. ESP_LOG_BUFFER_HEX_LEVEL("slave exp", slave_expect, test_trans_len, ESP_LOG_DEBUG);
  1375. spitest_cmp_or_dump(slave_expect, slave_recive, test_trans_len);
  1376. }
  1377. }
  1378. TEST_ESP_OK(spi_slave_free(TEST_SPI_HOST));
  1379. }
  1380. }
  1381. free(slave_send);
  1382. free(slave_recive);
  1383. free(slave_expect);
  1384. }
  1385. TEST_CASE_MULTIPLE_DEVICES("TEST_SPI_Freq_FD_no_DMA", "[spi_ms][timeout=30]", test_master_fd_no_dma, test_slave_fd_no_dma);
  1386. #if SOC_SPI_SUPPORT_SLAVE_HD_VER2
  1387. //------------------------------------------- Half Duplex with DMA Freq test --------------------------------------
  1388. static void test_master_hd_dma(void)
  1389. {
  1390. spi_device_handle_t dev0;
  1391. uint8_t *master_send = heap_caps_malloc(TEST_STEP_LEN, MALLOC_CAP_DMA);
  1392. uint8_t *master_recive = heap_caps_malloc(TEST_STEP_LEN, MALLOC_CAP_DMA);
  1393. uint8_t *master_expect = heap_caps_malloc(TEST_STEP_LEN, MALLOC_CAP_DEFAULT);
  1394. for (uint8_t is_gpio = 0; is_gpio < 2; is_gpio++) {
  1395. for (uint8_t mode = 0; mode < 4; mode++) {
  1396. spi_bus_config_t buscfg = SPI_BUS_TEST_DEFAULT_CONFIG();
  1397. if (is_gpio) {
  1398. buscfg.flags |= SPICOMMON_BUSFLAG_GPIO_PINS;
  1399. }
  1400. TEST_ESP_OK(spi_bus_initialize(TEST_SPI_HOST, &buscfg, SPI_DMA_CH_AUTO));
  1401. for (uint8_t speed_level = 0; speed_level < sizeof(s_spi_bus_freq) / sizeof(int); speed_level++) {
  1402. spi_device_interface_config_t devcfg = SPI_SLOT_TEST_DEFAULT_CONFIG();
  1403. devcfg.mode = mode;
  1404. devcfg.flags = SPI_DEVICE_HALFDUPLEX;
  1405. devcfg.clock_speed_hz = s_spi_bus_freq[speed_level];
  1406. TEST_ESP_OK(spi_bus_add_device(TEST_SPI_HOST, &devcfg, &dev0));
  1407. printf("Next trans: %s\tmode:%d\t@%.2f MHz\n", (is_gpio) ? "GPIO_Matrix" : "IOMUX", mode, s_spi_bus_freq[speed_level] / 1000000.f);
  1408. unity_send_signal("Master ready");
  1409. for (int i = 0; i < TEST_STEP; i++) {
  1410. memset(master_recive, 0x00, TEST_STEP_LEN);
  1411. get_tx_buffer(985 + mode + speed_level + i, master_send, master_expect, TEST_STEP_LEN);
  1412. uint32_t test_trans_len = TEST_STEP_LEN;
  1413. unity_wait_for_signal("Slave ready");
  1414. TEST_ESP_OK(essl_spi_rddma(dev0, master_recive, test_trans_len, -1, 0));
  1415. TEST_ESP_OK(essl_spi_wrdma(dev0, master_send, test_trans_len, -1, 0));
  1416. ESP_LOG_BUFFER_HEX("master tx", master_send, test_trans_len);
  1417. ESP_LOG_BUFFER_HEX_LEVEL("master rx", master_recive, test_trans_len, ESP_LOG_DEBUG);
  1418. ESP_LOG_BUFFER_HEX_LEVEL("master exp", master_expect, test_trans_len, ESP_LOG_DEBUG);
  1419. spitest_cmp_or_dump(master_expect, master_recive, test_trans_len);
  1420. }
  1421. TEST_ESP_OK(spi_bus_remove_device(dev0));
  1422. }
  1423. TEST_ESP_OK(spi_bus_free(TEST_SPI_HOST));
  1424. }
  1425. }
  1426. free(master_send);
  1427. free(master_recive);
  1428. free(master_expect);
  1429. }
  1430. static void test_slave_hd_dma(void)
  1431. {
  1432. uint8_t *slave_send = heap_caps_malloc(TEST_STEP_LEN, MALLOC_CAP_DMA);
  1433. uint8_t *slave_recive = heap_caps_malloc(TEST_STEP_LEN, MALLOC_CAP_DMA);
  1434. uint8_t *slave_expect = heap_caps_malloc(TEST_STEP_LEN, MALLOC_CAP_DEFAULT);
  1435. for (uint8_t is_gpio = 0; is_gpio < 2; is_gpio++) {
  1436. spi_bus_config_t buscfg = SPI_BUS_TEST_DEFAULT_CONFIG();
  1437. if (is_gpio) {
  1438. buscfg.flags |= SPICOMMON_BUSFLAG_GPIO_PINS;
  1439. }
  1440. for (uint8_t mode = 0; mode < 4; mode++) {
  1441. spi_slave_hd_slot_config_t hd_slvcfg = SPI_SLOT_TEST_DEFAULT_CONFIG();
  1442. hd_slvcfg.mode = mode;
  1443. hd_slvcfg.dma_chan = SPI_DMA_CH_AUTO;
  1444. TEST_ESP_OK(spi_slave_hd_init(TEST_SPI_HOST, &buscfg, &hd_slvcfg));
  1445. for (uint8_t speed_level = 0; speed_level < sizeof(s_spi_bus_freq) / sizeof(int); speed_level++) {
  1446. printf("Next trans: %s\tmode:%d\t@%.2f MHz\n", (is_gpio) ? "GPIO_Matrix" : "IOMUX", mode, s_spi_bus_freq[speed_level] / 1000000.f);
  1447. unity_wait_for_signal("Master ready");
  1448. for (int i = 0; i < TEST_STEP; i++) {
  1449. memset(slave_recive, 0x00, TEST_STEP_LEN);
  1450. get_tx_buffer(985 + mode + speed_level + i, slave_expect, slave_send, TEST_STEP_LEN);
  1451. uint32_t test_trans_len = TEST_STEP_LEN;
  1452. spi_slave_hd_data_t *ret_trans, slave_trans = {
  1453. .data = slave_send,
  1454. .len = test_trans_len,
  1455. };
  1456. unity_send_signal("Slave ready");
  1457. TEST_ESP_OK(spi_slave_hd_queue_trans(TEST_SPI_HOST, SPI_SLAVE_CHAN_TX, &slave_trans, portMAX_DELAY));
  1458. slave_trans.data = slave_recive;
  1459. TEST_ESP_OK(spi_slave_hd_queue_trans(TEST_SPI_HOST, SPI_SLAVE_CHAN_RX, &slave_trans, portMAX_DELAY));
  1460. TEST_ESP_OK(spi_slave_hd_get_trans_res(TEST_SPI_HOST, SPI_SLAVE_CHAN_RX, &ret_trans, portMAX_DELAY));
  1461. ESP_LOG_BUFFER_HEX("slave tx", slave_send, test_trans_len);
  1462. ESP_LOG_BUFFER_HEX_LEVEL("slave rx", slave_recive, test_trans_len, ESP_LOG_DEBUG);
  1463. ESP_LOG_BUFFER_HEX_LEVEL("slave exp", slave_expect, test_trans_len, ESP_LOG_DEBUG);
  1464. spitest_cmp_or_dump(slave_expect, slave_recive, test_trans_len);
  1465. }
  1466. }
  1467. TEST_ESP_OK(spi_slave_hd_deinit(TEST_SPI_HOST));
  1468. }
  1469. }
  1470. free(slave_send);
  1471. free(slave_recive);
  1472. free(slave_expect);
  1473. }
  1474. TEST_CASE_MULTIPLE_DEVICES("TEST_SPI_Freq_HD_DMA", "[spi_ms][timeout=30]", test_master_hd_dma, test_slave_hd_dma);
  1475. //------------------------------------------- Half Duplex no DMA Freq test --------------------------------------
  1476. static void test_master_hd_no_dma(void)
  1477. {
  1478. spi_device_handle_t dev0;
  1479. uint8_t *master_send = heap_caps_malloc(SOC_SPI_MAXIMUM_BUFFER_SIZE, MALLOC_CAP_DMA);
  1480. uint8_t *master_recive = heap_caps_malloc(SOC_SPI_MAXIMUM_BUFFER_SIZE, MALLOC_CAP_DMA);
  1481. uint8_t *master_expect = heap_caps_malloc(SOC_SPI_MAXIMUM_BUFFER_SIZE, MALLOC_CAP_DEFAULT);
  1482. for (uint8_t is_gpio = 0; is_gpio < 2; is_gpio++) {
  1483. for (uint8_t mode = 0; mode < 4; mode++) {
  1484. spi_bus_config_t buscfg = SPI_BUS_TEST_DEFAULT_CONFIG();
  1485. if (is_gpio) {
  1486. buscfg.flags |= SPICOMMON_BUSFLAG_GPIO_PINS;
  1487. }
  1488. TEST_ESP_OK(spi_bus_initialize(TEST_SPI_HOST, &buscfg, SPI_DMA_DISABLED));
  1489. for (uint8_t speed_level = 0; speed_level < sizeof(s_spi_bus_freq) / sizeof(int); speed_level++) {
  1490. spi_device_interface_config_t devcfg = SPI_SLOT_TEST_DEFAULT_CONFIG();
  1491. devcfg.mode = mode;
  1492. devcfg.flags = SPI_DEVICE_HALFDUPLEX;
  1493. devcfg.clock_speed_hz = s_spi_bus_freq[speed_level];
  1494. TEST_ESP_OK(spi_bus_add_device(TEST_SPI_HOST, &devcfg, &dev0));
  1495. printf("Next trans: %s\tmode:%d\t@%.2f MHz\n", (is_gpio) ? "GPIO_Matrix" : "IOMUX", mode, s_spi_bus_freq[speed_level] / 1000000.f);
  1496. unity_send_signal("Master ready");
  1497. for (int i = 0; i < TEST_STEP; i++) {
  1498. memset(master_recive, 0x00, SOC_SPI_MAXIMUM_BUFFER_SIZE);
  1499. get_tx_buffer(911 + mode + speed_level + i, master_send, master_expect, SOC_SPI_MAXIMUM_BUFFER_SIZE);
  1500. uint32_t test_trans_len = SOC_SPI_MAXIMUM_BUFFER_SIZE;
  1501. unity_wait_for_signal("Slave ready");
  1502. TEST_ESP_OK(essl_spi_rddma(dev0, master_recive, test_trans_len, -1, 0));
  1503. TEST_ESP_OK(essl_spi_wrdma(dev0, master_send, test_trans_len, -1, 0));
  1504. ESP_LOG_BUFFER_HEX("master tx", master_send, test_trans_len);
  1505. ESP_LOG_BUFFER_HEX_LEVEL("master rx", master_recive, test_trans_len, ESP_LOG_DEBUG);
  1506. ESP_LOG_BUFFER_HEX_LEVEL("master exp", master_expect, test_trans_len, ESP_LOG_DEBUG);
  1507. spitest_cmp_or_dump(master_expect, master_recive, test_trans_len);
  1508. }
  1509. TEST_ESP_OK(spi_bus_remove_device(dev0));
  1510. }
  1511. TEST_ESP_OK(spi_bus_free(TEST_SPI_HOST));
  1512. }
  1513. }
  1514. free(master_send);
  1515. free(master_recive);
  1516. free(master_expect);
  1517. }
  1518. static void test_slave_hd_no_dma(void)
  1519. {
  1520. uint8_t *slave_send = heap_caps_malloc(SOC_SPI_MAXIMUM_BUFFER_SIZE, MALLOC_CAP_DMA);
  1521. uint8_t *slave_recive = heap_caps_malloc(SOC_SPI_MAXIMUM_BUFFER_SIZE, MALLOC_CAP_DMA);
  1522. uint8_t *slave_expect = heap_caps_malloc(SOC_SPI_MAXIMUM_BUFFER_SIZE, MALLOC_CAP_DEFAULT);
  1523. for (uint8_t is_gpio = 0; is_gpio < 2; is_gpio++) {
  1524. spi_bus_config_t buscfg = SPI_BUS_TEST_DEFAULT_CONFIG();
  1525. if (is_gpio) {
  1526. buscfg.flags |= SPICOMMON_BUSFLAG_GPIO_PINS;
  1527. }
  1528. for (uint8_t mode = 0; mode < 4; mode++) {
  1529. spi_slave_hd_slot_config_t hd_slvcfg = SPI_SLOT_TEST_DEFAULT_CONFIG();
  1530. hd_slvcfg.mode = mode;
  1531. hd_slvcfg.dma_chan = SPI_DMA_CH_AUTO; //slave hd use dma mandatory, test no dma on master
  1532. TEST_ESP_OK(spi_slave_hd_init(TEST_SPI_HOST, &buscfg, &hd_slvcfg));
  1533. for (uint8_t speed_level = 0; speed_level < sizeof(s_spi_bus_freq) / sizeof(int); speed_level++) {
  1534. printf("Next trans: %s\tmode:%d\t@%.2f MHz\n", (is_gpio) ? "GPIO_Matrix" : "IOMUX", mode, s_spi_bus_freq[speed_level] / 1000000.f);
  1535. unity_wait_for_signal("Master ready");
  1536. for (int i = 0; i < TEST_STEP; i++) {
  1537. memset(slave_recive, 0x00, SOC_SPI_MAXIMUM_BUFFER_SIZE);
  1538. get_tx_buffer(911 + mode + speed_level + i, slave_expect, slave_send, SOC_SPI_MAXIMUM_BUFFER_SIZE);
  1539. uint32_t test_trans_len = SOC_SPI_MAXIMUM_BUFFER_SIZE;
  1540. spi_slave_hd_data_t *ret_trans, slave_trans = {
  1541. .data = slave_send,
  1542. .len = test_trans_len,
  1543. };
  1544. unity_send_signal("Slave ready");
  1545. TEST_ESP_OK(spi_slave_hd_queue_trans(TEST_SPI_HOST, SPI_SLAVE_CHAN_TX, &slave_trans, portMAX_DELAY));
  1546. slave_trans.data = slave_recive;
  1547. TEST_ESP_OK(spi_slave_hd_queue_trans(TEST_SPI_HOST, SPI_SLAVE_CHAN_RX, &slave_trans, portMAX_DELAY));
  1548. TEST_ESP_OK(spi_slave_hd_get_trans_res(TEST_SPI_HOST, SPI_SLAVE_CHAN_RX, &ret_trans, portMAX_DELAY));
  1549. ESP_LOG_BUFFER_HEX("slave tx", slave_send, test_trans_len);
  1550. ESP_LOG_BUFFER_HEX_LEVEL("slave rx", slave_recive, test_trans_len, ESP_LOG_DEBUG);
  1551. ESP_LOG_BUFFER_HEX_LEVEL("slave exp", slave_expect, test_trans_len, ESP_LOG_DEBUG);
  1552. spitest_cmp_or_dump(slave_expect, slave_recive, test_trans_len);
  1553. }
  1554. }
  1555. TEST_ESP_OK(spi_slave_hd_deinit(TEST_SPI_HOST));
  1556. }
  1557. }
  1558. free(slave_send);
  1559. free(slave_recive);
  1560. free(slave_expect);
  1561. }
  1562. TEST_CASE_MULTIPLE_DEVICES("TEST_SPI_Freq_HD_no_DMA", "[spi_ms][timeout=30]", test_master_hd_no_dma, test_slave_hd_no_dma);
  1563. #endif // SOC_SPI_SUPPORT_SLAVE_HD_VER2
  1564. #if CONFIG_IDF_TARGET_ESP32
  1565. // item num should same as `s_spi_bus_freq`
  1566. static int s_master_input_delay[] = {12.5, 12.5 * 2, 12.5 * 2, 12.5 * 5, 12.5 * 5};
  1567. #endif
  1568. //------------------------------------------- SIO with DMA Freq test --------------------------------------
  1569. static void test_master_sio_dma(void)
  1570. {
  1571. spi_device_handle_t dev0;
  1572. uint8_t *master_send = heap_caps_malloc(TEST_STEP_LEN, MALLOC_CAP_DMA);
  1573. uint8_t *master_recive = heap_caps_malloc(TEST_STEP_LEN, MALLOC_CAP_DMA);
  1574. uint8_t *master_expect = heap_caps_malloc(TEST_STEP_LEN, MALLOC_CAP_DEFAULT);
  1575. for (uint8_t sio_master_in = 0; sio_master_in < 2; sio_master_in++) {
  1576. for (uint8_t mode = 0; mode < 4; mode++) {
  1577. spi_bus_config_t buscfg = SPI_BUS_TEST_DEFAULT_CONFIG();
  1578. if (sio_master_in) {
  1579. // normally, spi read data from port Q and write data to port D
  1580. // test master input from port D (output default.), so link port D (normally named mosi) to miso pin.
  1581. buscfg.mosi_io_num = buscfg.miso_io_num;
  1582. printf("\n========================Test sio master input==========================\n");
  1583. } else {
  1584. printf("\n============Test sio master output, data checked by slave.=============\n");
  1585. }
  1586. buscfg.miso_io_num = -1;
  1587. TEST_ESP_OK(spi_bus_initialize(TEST_SPI_HOST, &buscfg, SPI_DMA_CH_AUTO));
  1588. for (uint8_t speed_level = 0; speed_level < sizeof(s_spi_bus_freq) / sizeof(int); speed_level++) {
  1589. spi_device_interface_config_t devcfg = {
  1590. .mode = mode,
  1591. .spics_io_num = PIN_NUM_CS,
  1592. .queue_size = 16,
  1593. .clock_speed_hz = s_spi_bus_freq[speed_level],
  1594. .flags = SPI_DEVICE_HALFDUPLEX | SPI_DEVICE_3WIRE,
  1595. };
  1596. #if CONFIG_IDF_TARGET_ESP32
  1597. devcfg.cs_ena_pretrans = 2;
  1598. devcfg.input_delay_ns = s_master_input_delay[speed_level];
  1599. #endif
  1600. TEST_ESP_OK(spi_bus_add_device(TEST_SPI_HOST, &devcfg, &dev0));
  1601. printf("Next trans: %s\tmode:%d\t@%.2f MHz\n", (sio_master_in) ? "SingleIn" : "SongleOut", mode, s_spi_bus_freq[speed_level] / 1000000.f);
  1602. unity_send_signal("Master ready");
  1603. for (int i = 0; i < TEST_STEP; i++) {
  1604. memset(master_recive, 0x00, TEST_STEP_LEN);
  1605. get_tx_buffer(110 + mode + speed_level + i, master_send, master_expect, TEST_STEP_LEN);
  1606. spi_transaction_t trans = {};
  1607. if (sio_master_in) {
  1608. // master input only
  1609. trans.rxlength = TEST_STEP_LEN * 8;
  1610. trans.rx_buffer = master_recive;
  1611. trans.length = 0;
  1612. trans.tx_buffer = NULL;
  1613. } else {
  1614. // master output only
  1615. trans.length = TEST_STEP_LEN * 8;
  1616. trans.tx_buffer = master_send;
  1617. trans.rxlength = 0;
  1618. trans.rx_buffer = NULL;
  1619. }
  1620. unity_wait_for_signal("Slave ready");
  1621. TEST_ESP_OK(spi_device_transmit(dev0, &trans));
  1622. if (sio_master_in) {
  1623. ESP_LOG_BUFFER_HEX_LEVEL("master rx", trans.rx_buffer, TEST_STEP_LEN, ESP_LOG_DEBUG);
  1624. ESP_LOG_BUFFER_HEX_LEVEL("master exp", master_expect, TEST_STEP_LEN, ESP_LOG_DEBUG);
  1625. spitest_cmp_or_dump(master_expect, master_recive, TEST_STEP_LEN);
  1626. } else {
  1627. ESP_LOG_BUFFER_HEX("master tx", trans.tx_buffer, TEST_STEP_LEN);
  1628. }
  1629. }
  1630. TEST_ESP_OK(spi_bus_remove_device(dev0));
  1631. }
  1632. TEST_ESP_OK(spi_bus_free(TEST_SPI_HOST));
  1633. }
  1634. }
  1635. free(master_send);
  1636. free(master_recive);
  1637. free(master_expect);
  1638. }
  1639. static void test_slave_sio_dma(void)
  1640. {
  1641. uint8_t *slave_send = heap_caps_malloc(TEST_STEP_LEN, MALLOC_CAP_DMA);
  1642. uint8_t *slave_recive = heap_caps_malloc(TEST_STEP_LEN, MALLOC_CAP_DMA);
  1643. uint8_t *slave_expect = heap_caps_malloc(TEST_STEP_LEN, MALLOC_CAP_DEFAULT);
  1644. for (uint8_t sio_master_in = 0; sio_master_in < 2; sio_master_in++) {
  1645. if (sio_master_in) {
  1646. printf("\n======================Slave Tx only====================\n");
  1647. } else {
  1648. printf("\n==================Slave Rx, Check data=================\n");
  1649. }
  1650. for (uint8_t mode = 0; mode < 4; mode++) {
  1651. spi_bus_config_t bus_cfg = SPI_BUS_TEST_DEFAULT_CONFIG();
  1652. #if !CONFIG_IDF_TARGET_ESP32
  1653. bus_cfg.flags |= SPICOMMON_BUSFLAG_GPIO_PINS;
  1654. #endif
  1655. spi_slave_interface_config_t slv_cfg = SPI_SLAVE_TEST_DEFAULT_CONFIG();
  1656. slv_cfg.mode = mode;
  1657. TEST_ESP_OK(spi_slave_initialize(TEST_SPI_HOST, &bus_cfg, &slv_cfg, SPI_DMA_CH_AUTO));
  1658. for (uint8_t speed_level = 0; speed_level < sizeof(s_spi_bus_freq) / sizeof(int); speed_level++) {
  1659. printf("Next trans: %s\tmode:%d\t@%.2f MHz\n", (sio_master_in) ? "SingleIn" : "SongleOut", mode, s_spi_bus_freq[speed_level] / 1000000.f);
  1660. unity_wait_for_signal("Master ready");
  1661. for (int i = 0; i < TEST_STEP; i++) {
  1662. memset(slave_recive, 0x00, TEST_STEP_LEN);
  1663. get_tx_buffer(110 + mode + speed_level + i, slave_expect, slave_send, TEST_STEP_LEN);
  1664. spi_slave_transaction_t trans = {
  1665. .length = TEST_STEP_LEN * 8,
  1666. .tx_buffer = slave_send,
  1667. .rx_buffer = slave_recive,
  1668. };
  1669. unity_send_signal("Slave ready");
  1670. TEST_ESP_OK(spi_slave_transmit(TEST_SPI_HOST, &trans, portMAX_DELAY));
  1671. if (sio_master_in) {
  1672. ESP_LOG_BUFFER_HEX("Slave tx", trans.tx_buffer, TEST_STEP_LEN);
  1673. } else {
  1674. ESP_LOG_BUFFER_HEX_LEVEL("Slave rx", trans.rx_buffer, TEST_STEP_LEN, ESP_LOG_DEBUG);
  1675. ESP_LOG_BUFFER_HEX_LEVEL("Slave exp", slave_expect, TEST_STEP_LEN, ESP_LOG_DEBUG);
  1676. spitest_cmp_or_dump(slave_expect, slave_recive, TEST_STEP_LEN);
  1677. }
  1678. }
  1679. }
  1680. TEST_ESP_OK(spi_slave_free(TEST_SPI_HOST));
  1681. }
  1682. }
  1683. free(slave_send);
  1684. free(slave_recive);
  1685. free(slave_expect);
  1686. }
  1687. TEST_CASE_MULTIPLE_DEVICES("TEST_SPI_Freq_SIO_DMA", "[spi_ms][timeout=30]", test_master_sio_dma, test_slave_sio_dma);
  1688. //------------------------------------------- SIO no DMA Freq test --------------------------------------
  1689. static void test_master_sio_no_dma(void)
  1690. {
  1691. spi_device_handle_t dev0;
  1692. uint8_t *master_send = heap_caps_malloc(SOC_SPI_MAXIMUM_BUFFER_SIZE, MALLOC_CAP_DMA);
  1693. uint8_t *master_recive = heap_caps_malloc(SOC_SPI_MAXIMUM_BUFFER_SIZE, MALLOC_CAP_DMA);
  1694. uint8_t *master_expect = heap_caps_malloc(SOC_SPI_MAXIMUM_BUFFER_SIZE, MALLOC_CAP_DEFAULT);
  1695. for (uint8_t sio_master_in = 0; sio_master_in < 2; sio_master_in++) {
  1696. for (uint8_t mode = 0; mode < 4; mode++) {
  1697. spi_bus_config_t buscfg = SPI_BUS_TEST_DEFAULT_CONFIG();
  1698. if (sio_master_in) {
  1699. // normally, spi read data from port Q and write data to port D
  1700. // test master input from port D (output default.), so link port D (normally named mosi) to miso pin.
  1701. buscfg.mosi_io_num = buscfg.miso_io_num;
  1702. printf("\n========================Test sio master input==========================\n");
  1703. } else {
  1704. printf("\n============Test sio master output, data checked by slave.=============\n");
  1705. }
  1706. buscfg.miso_io_num = -1;
  1707. TEST_ESP_OK(spi_bus_initialize(TEST_SPI_HOST, &buscfg, SPI_DMA_DISABLED));
  1708. for (uint8_t speed_level = 0; speed_level < sizeof(s_spi_bus_freq) / sizeof(int); speed_level++) {
  1709. spi_device_interface_config_t devcfg = {
  1710. .mode = mode,
  1711. .spics_io_num = PIN_NUM_CS,
  1712. .queue_size = 16,
  1713. .cs_ena_pretrans = 2,
  1714. .clock_speed_hz = s_spi_bus_freq[speed_level],
  1715. .flags = SPI_DEVICE_HALFDUPLEX | SPI_DEVICE_3WIRE,
  1716. };
  1717. #if CONFIG_IDF_TARGET_ESP32
  1718. devcfg.cs_ena_pretrans = 2;
  1719. devcfg.input_delay_ns = s_master_input_delay[speed_level];
  1720. #endif
  1721. TEST_ESP_OK(spi_bus_add_device(TEST_SPI_HOST, &devcfg, &dev0));
  1722. printf("Next trans: %s\tmode:%d\t@%.2f MHz\n", (sio_master_in) ? "SingleIn" : "SongleOut", mode, s_spi_bus_freq[speed_level] / 1000000.f);
  1723. unity_send_signal("Master ready");
  1724. for (int i = 0; i < TEST_STEP; i++) {
  1725. memset(master_recive, 0x00, SOC_SPI_MAXIMUM_BUFFER_SIZE);
  1726. get_tx_buffer(122 + mode + speed_level + i, master_send, master_expect, SOC_SPI_MAXIMUM_BUFFER_SIZE);
  1727. spi_transaction_t trans = {};
  1728. if (sio_master_in) {
  1729. // master input only
  1730. trans.rxlength = SOC_SPI_MAXIMUM_BUFFER_SIZE * 8;
  1731. trans.rx_buffer = master_recive;
  1732. trans.length = 0;
  1733. trans.tx_buffer = NULL;
  1734. } else {
  1735. // master output only
  1736. trans.length = SOC_SPI_MAXIMUM_BUFFER_SIZE * 8;
  1737. trans.tx_buffer = master_send;
  1738. trans.rxlength = 0;
  1739. trans.rx_buffer = NULL;
  1740. }
  1741. unity_wait_for_signal("Slave ready");
  1742. TEST_ESP_OK(spi_device_transmit(dev0, &trans));
  1743. if (sio_master_in) {
  1744. ESP_LOG_BUFFER_HEX_LEVEL("master rx", trans.rx_buffer, SOC_SPI_MAXIMUM_BUFFER_SIZE, ESP_LOG_DEBUG);
  1745. ESP_LOG_BUFFER_HEX_LEVEL("master exp", master_expect, SOC_SPI_MAXIMUM_BUFFER_SIZE, ESP_LOG_DEBUG);
  1746. spitest_cmp_or_dump(master_expect, master_recive, SOC_SPI_MAXIMUM_BUFFER_SIZE);
  1747. } else {
  1748. ESP_LOG_BUFFER_HEX("master tx", trans.tx_buffer, SOC_SPI_MAXIMUM_BUFFER_SIZE);
  1749. }
  1750. }
  1751. TEST_ESP_OK(spi_bus_remove_device(dev0));
  1752. }
  1753. TEST_ESP_OK(spi_bus_free(TEST_SPI_HOST));
  1754. }
  1755. }
  1756. free(master_send);
  1757. free(master_recive);
  1758. free(master_expect);
  1759. }
  1760. static void test_slave_sio_no_dma(void)
  1761. {
  1762. uint8_t *slave_send = heap_caps_malloc(SOC_SPI_MAXIMUM_BUFFER_SIZE, MALLOC_CAP_DMA);
  1763. uint8_t *slave_recive = heap_caps_malloc(SOC_SPI_MAXIMUM_BUFFER_SIZE, MALLOC_CAP_DMA);
  1764. uint8_t *slave_expect = heap_caps_malloc(SOC_SPI_MAXIMUM_BUFFER_SIZE, MALLOC_CAP_DEFAULT);
  1765. for (uint8_t sio_master_in = 0; sio_master_in < 2; sio_master_in++) {
  1766. if (sio_master_in) {
  1767. printf("\n======================Slave Tx only====================\n");
  1768. } else {
  1769. printf("\n==================Slave Rx, Check data=================\n");
  1770. }
  1771. for (uint8_t mode = 0; mode < 4; mode++) {
  1772. spi_bus_config_t bus_cfg = SPI_BUS_TEST_DEFAULT_CONFIG();
  1773. #if !CONFIG_IDF_TARGET_ESP32
  1774. bus_cfg.flags |= SPICOMMON_BUSFLAG_GPIO_PINS;
  1775. #endif
  1776. spi_slave_interface_config_t slv_cfg = SPI_SLAVE_TEST_DEFAULT_CONFIG();
  1777. slv_cfg.mode = mode;
  1778. TEST_ESP_OK(spi_slave_initialize(TEST_SPI_HOST, &bus_cfg, &slv_cfg, SPI_DMA_DISABLED));
  1779. for (uint8_t speed_level = 0; speed_level < sizeof(s_spi_bus_freq) / sizeof(int); speed_level++) {
  1780. printf("Next trans: %s\tmode:%d\t@%.2f MHz\n", (sio_master_in) ? "SingleIn" : "SongleOut", mode, s_spi_bus_freq[speed_level] / 1000000.f);
  1781. unity_wait_for_signal("Master ready");
  1782. for (int i = 0; i < TEST_STEP; i++) {
  1783. memset(slave_recive, 0x00, SOC_SPI_MAXIMUM_BUFFER_SIZE);
  1784. get_tx_buffer(122 + mode + speed_level + i, slave_expect, slave_send, SOC_SPI_MAXIMUM_BUFFER_SIZE);
  1785. spi_slave_transaction_t trans = {
  1786. .length = SOC_SPI_MAXIMUM_BUFFER_SIZE * 8,
  1787. .tx_buffer = slave_send,
  1788. .rx_buffer = slave_recive,
  1789. };
  1790. unity_send_signal("Slave ready");
  1791. TEST_ESP_OK(spi_slave_transmit(TEST_SPI_HOST, &trans, portMAX_DELAY));
  1792. if (sio_master_in) {
  1793. ESP_LOG_BUFFER_HEX("Slave tx", trans.tx_buffer, SOC_SPI_MAXIMUM_BUFFER_SIZE);
  1794. } else {
  1795. ESP_LOG_BUFFER_HEX_LEVEL("Slave rx", trans.rx_buffer, SOC_SPI_MAXIMUM_BUFFER_SIZE, ESP_LOG_DEBUG);
  1796. ESP_LOG_BUFFER_HEX_LEVEL("Slave exp", slave_expect, SOC_SPI_MAXIMUM_BUFFER_SIZE, ESP_LOG_DEBUG);
  1797. spitest_cmp_or_dump(slave_expect, slave_recive, SOC_SPI_MAXIMUM_BUFFER_SIZE);
  1798. }
  1799. }
  1800. }
  1801. TEST_ESP_OK(spi_slave_free(TEST_SPI_HOST));
  1802. }
  1803. }
  1804. free(slave_send);
  1805. free(slave_recive);
  1806. free(slave_expect);
  1807. }
  1808. TEST_CASE_MULTIPLE_DEVICES("TEST_SPI_Freq_SIO_no_DMA", "[spi_ms][timeout=30]", test_master_sio_no_dma, test_slave_sio_no_dma);