From a15176742685a53a5ad5f7a8242a4a7f74932fe5 Mon Sep 17 00:00:00 2001 From: "Michael (Xiao Xufeng)" Date: Wed, 7 Feb 2018 15:45:10 +0800 Subject: [PATCH] test(spi_master): add performance display for spi master. --- components/driver/test/test_spi_master.c | 73 +++++++++++++++++++ components/idf_test/include/idf_performance.h | 4 + 2 files changed, 77 insertions(+) diff --git a/components/driver/test/test_spi_master.c b/components/driver/test/test_spi_master.c index fad766ee3..cc291f4d7 100644 --- a/components/driver/test/test_spi_master.c +++ b/components/driver/test/test_spi_master.c @@ -728,3 +728,76 @@ TEST_CASE("SPI master variable cmd & addr test","[spi]") ESP_LOGI(MASTER_TAG, "test passed."); } + +#define RECORD_TIME_PREPARE() uint32_t __t1, __t2 +#define RECORD_TIME_START() do {__t1 = xthal_get_ccount();}while(0) +#define RECORD_TIME_END(p_time) do{__t2 = xthal_get_ccount(); *p_time = (__t2-__t1)/240;}while(0) + +TEST_CASE("spi_speed","[spi]") +{ + RECORD_TIME_PREPARE(); + uint32_t t_no_dma, t_dma; + esp_err_t ret; + spi_device_handle_t spi; + spi_bus_config_t buscfg={ + .miso_io_num=PIN_NUM_MISO, + .mosi_io_num=PIN_NUM_MOSI, + .sclk_io_num=PIN_NUM_CLK, + .quadwp_io_num=-1, + .quadhd_io_num=-1 + }; + spi_device_interface_config_t devcfg={ + .clock_speed_hz=10*1000*1000, //currently only up to 4MHz for internel connect + .mode=0, //SPI mode 0 + .spics_io_num=PIN_NUM_CS, //CS pin + .queue_size=16, //We want to be able to queue 7 transactions at a time + .pre_cb=NULL, + .cs_ena_pretrans = 0, + }; + //Initialize the SPI bus + ret=spi_bus_initialize(HSPI_HOST, &buscfg, 1); + TEST_ASSERT(ret==ESP_OK); + //Attach the LCD to the SPI bus + ret=spi_bus_add_device(HSPI_HOST, &devcfg, &spi); + TEST_ASSERT(ret==ESP_OK); + + spi_transaction_t trans = { + .length = 1*8, + .flags = SPI_TRANS_USE_TXDATA, + }; + spi_device_transmit(spi, &trans); + + //only record the second time + RECORD_TIME_START(); + spi_device_transmit(spi, &trans); + RECORD_TIME_END(&t_dma); + + TEST_PERFORMANCE_LESS_THAN( SPI_PER_TRANS_NO_POLLING, "%d us", t_dma ); + + TEST_ESP_OK( spi_bus_remove_device(spi) ); + TEST_ESP_OK( spi_bus_free(HSPI_HOST) ); + + ret=spi_bus_initialize(HSPI_HOST, &buscfg, 0); + TEST_ASSERT(ret==ESP_OK); + //Attach the LCD to the SPI bus + ret=spi_bus_add_device(HSPI_HOST, &devcfg, &spi); + TEST_ASSERT(ret==ESP_OK); + + trans = (spi_transaction_t){ + .length = 1*8, + .flags = SPI_TRANS_USE_TXDATA, + }; + spi_device_transmit(spi, &trans); + + //only record the second time + RECORD_TIME_START(); + spi_device_transmit(spi, &trans); + RECORD_TIME_END(&t_no_dma); + + TEST_PERFORMANCE_LESS_THAN( SPI_PER_TRANS_NO_POLLING_NO_DMA, "%d us", t_no_dma ); + + TEST_ESP_OK( spi_bus_remove_device(spi) ); + TEST_ESP_OK( spi_bus_free(HSPI_HOST) ); + + +} diff --git a/components/idf_test/include/idf_performance.h b/components/idf_test/include/idf_performance.h index 6bd52aed9..5721bbd3c 100644 --- a/components/idf_test/include/idf_performance.h +++ b/components/idf_test/include/idf_performance.h @@ -13,3 +13,7 @@ #define IDF_PERFORMANCE_MAX_FREERTOS_SPINLOCK_CYCLES_PER_OP 200 #define IDF_PERFORMANCE_MAX_FREERTOS_SPINLOCK_CYCLES_PER_OP_UNICORE 130 #define IDF_PERFORMANCE_MAX_ESP_TIMER_GET_TIME_PER_CALL 1000 +#define IDF_PERFORMANCE_MAX_SPI_PER_TRANS_NO_POLLING 30 +#define IDF_PERFORMANCE_MAX_SPI_PER_TRANS_NO_POLLING_NO_DMA 25 + +