|
|
|
@@ -1112,6 +1112,181 @@ TEST_CASE("SPI master hd dma TX without RX test", "[spi]")
|
|
|
|
|
//There is only one GPSPI controller, so single-board test is disabled.
|
|
|
|
|
#endif //#if !DISABLED_FOR_TARGETS(ESP32C3)
|
|
|
|
|
|
|
|
|
|
#if !TEMPORARY_DISABLED_FOR_TARGETS(ESP32) //TODO: IDF-3494
|
|
|
|
|
#define FD_TEST_BUF_SIZE 32
|
|
|
|
|
#define TEST_NUM 4
|
|
|
|
|
#define FD_SEED1 199
|
|
|
|
|
#define FD_SEED2 29
|
|
|
|
|
#define FD_SEED3 48
|
|
|
|
|
#define FD_SEED4 327
|
|
|
|
|
|
|
|
|
|
static void master_only_tx_trans(spi_device_handle_t spi, uint8_t *mst_send_buf, uint32_t length)
|
|
|
|
|
{
|
|
|
|
|
ESP_LOGI(MASTER_TAG, "FD DMA, Only TX:");
|
|
|
|
|
spi_transaction_t trans = {0};
|
|
|
|
|
trans.tx_buffer = mst_send_buf;
|
|
|
|
|
trans.length = length * 8;
|
|
|
|
|
unity_wait_for_signal("Slave ready");
|
|
|
|
|
TEST_ESP_OK(spi_device_transmit(spi, &trans));
|
|
|
|
|
ESP_LOG_BUFFER_HEX("MASTER TX:", mst_send_buf, length);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static void master_only_rx_trans(spi_device_handle_t spi, uint8_t *mst_recv_buf, uint8_t *slv_send_buf, uint32_t length)
|
|
|
|
|
{
|
|
|
|
|
ESP_LOGI(MASTER_TAG, "FD DMA, Only RX:");
|
|
|
|
|
spi_transaction_t trans = {0};
|
|
|
|
|
trans.tx_buffer = NULL;
|
|
|
|
|
trans.rx_buffer = mst_recv_buf;
|
|
|
|
|
trans.length = length * 8;
|
|
|
|
|
unity_wait_for_signal("Slave ready");
|
|
|
|
|
TEST_ESP_OK(spi_device_transmit(spi, &trans));
|
|
|
|
|
ESP_LOG_BUFFER_HEX("MASTER RX:", mst_recv_buf, length);
|
|
|
|
|
TEST_ASSERT_EQUAL_HEX8_ARRAY(slv_send_buf, mst_recv_buf, length);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static void master_both_trans(spi_device_handle_t spi, uint8_t *mst_send_buf, uint8_t *mst_recv_buf, uint8_t *slv_send_buf, uint32_t length)
|
|
|
|
|
{
|
|
|
|
|
ESP_LOGI(MASTER_TAG, "FD DMA, Both TX and RX:");
|
|
|
|
|
spi_transaction_t trans = {0};
|
|
|
|
|
trans.tx_buffer = mst_send_buf;
|
|
|
|
|
trans.rx_buffer = mst_recv_buf;
|
|
|
|
|
trans.length = length * 8;
|
|
|
|
|
unity_wait_for_signal("Slave ready");
|
|
|
|
|
TEST_ESP_OK(spi_device_transmit(spi, &trans));
|
|
|
|
|
ESP_LOG_BUFFER_HEX("MASTER TX:", mst_send_buf, length);
|
|
|
|
|
ESP_LOG_BUFFER_HEX("MASTER RX:", mst_recv_buf, length);
|
|
|
|
|
TEST_ASSERT_EQUAL_HEX8_ARRAY(slv_send_buf, mst_recv_buf, length);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static void fd_master(void)
|
|
|
|
|
{
|
|
|
|
|
spi_bus_config_t bus_cfg = SPI_BUS_TEST_DEFAULT_CONFIG();
|
|
|
|
|
TEST_ESP_OK(spi_bus_initialize(TEST_SPI_HOST, &bus_cfg, SPI_DMA_CH_AUTO));
|
|
|
|
|
|
|
|
|
|
spi_device_handle_t spi;
|
|
|
|
|
spi_device_interface_config_t dev_cfg = SPI_DEVICE_TEST_DEFAULT_CONFIG();
|
|
|
|
|
TEST_ESP_OK(spi_bus_add_device(TEST_SPI_HOST, &dev_cfg, &spi));
|
|
|
|
|
|
|
|
|
|
unity_send_signal("Master ready");
|
|
|
|
|
|
|
|
|
|
uint8_t *mst_send_buf = heap_caps_malloc(FD_TEST_BUF_SIZE, MALLOC_CAP_DMA);
|
|
|
|
|
uint8_t *mst_recv_buf = heap_caps_calloc(FD_TEST_BUF_SIZE, 1, MALLOC_CAP_DMA);
|
|
|
|
|
uint8_t *slv_send_buf = heap_caps_malloc(FD_TEST_BUF_SIZE, MALLOC_CAP_DMA);
|
|
|
|
|
|
|
|
|
|
//Master FD DMA, RX without TX Test
|
|
|
|
|
for (int i = 0; i < TEST_NUM; i++) {
|
|
|
|
|
// 1. Master FD DMA, only receive, with NULL tx_buffer
|
|
|
|
|
get_tx_buffer(FD_SEED1+i, mst_send_buf, slv_send_buf, FD_TEST_BUF_SIZE);
|
|
|
|
|
memset(mst_recv_buf, 0x0, FD_TEST_BUF_SIZE);
|
|
|
|
|
master_only_rx_trans(spi, mst_recv_buf, slv_send_buf, FD_TEST_BUF_SIZE);
|
|
|
|
|
|
|
|
|
|
//2. Master FD DMA with TX and RX
|
|
|
|
|
get_tx_buffer(FD_SEED2+i, mst_send_buf, slv_send_buf, FD_TEST_BUF_SIZE);
|
|
|
|
|
memset(mst_recv_buf, 0x0, FD_TEST_BUF_SIZE);
|
|
|
|
|
master_both_trans(spi, mst_send_buf, mst_recv_buf, slv_send_buf, FD_TEST_BUF_SIZE);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//Master FD DMA, TX without RX Test
|
|
|
|
|
for (int i = 0; i < TEST_NUM; i++) {
|
|
|
|
|
// 1. Master FD DMA, only send, with NULL rx_buffer
|
|
|
|
|
get_tx_buffer(FD_SEED3+i, mst_send_buf, slv_send_buf, FD_TEST_BUF_SIZE);
|
|
|
|
|
master_only_tx_trans(spi, mst_send_buf, FD_TEST_BUF_SIZE);
|
|
|
|
|
|
|
|
|
|
//2. Master FD DMA with TX and RX
|
|
|
|
|
get_tx_buffer(FD_SEED4+i, mst_send_buf, slv_send_buf, FD_TEST_BUF_SIZE);
|
|
|
|
|
memset(mst_recv_buf, 0x0, FD_TEST_BUF_SIZE);
|
|
|
|
|
master_both_trans(spi, mst_send_buf, mst_recv_buf, slv_send_buf, FD_TEST_BUF_SIZE);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
free(mst_send_buf);
|
|
|
|
|
free(mst_recv_buf);
|
|
|
|
|
free(slv_send_buf);
|
|
|
|
|
master_free_device_bus(spi);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static void slave_only_tx_trans(uint8_t *slv_send_buf, uint32_t length)
|
|
|
|
|
{
|
|
|
|
|
ESP_LOGI(SLAVE_TAG, "FD DMA, Only TX");
|
|
|
|
|
spi_slave_transaction_t trans = {0};
|
|
|
|
|
trans.tx_buffer = slv_send_buf;
|
|
|
|
|
trans.length = length * 8;
|
|
|
|
|
unity_send_signal("Slave ready");
|
|
|
|
|
TEST_ESP_OK(spi_slave_transmit(SPI2_HOST, &trans, portMAX_DELAY));
|
|
|
|
|
ESP_LOG_BUFFER_HEX("SLAVE TX:", slv_send_buf, length);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static void slave_only_rx_trans(uint8_t *slv_recv_buf, uint8_t *mst_send_buf, uint32_t length)
|
|
|
|
|
{
|
|
|
|
|
ESP_LOGI(SLAVE_TAG, "FD DMA, Only RX");
|
|
|
|
|
spi_slave_transaction_t trans = {};
|
|
|
|
|
trans.tx_buffer = NULL;
|
|
|
|
|
trans.rx_buffer = slv_recv_buf;
|
|
|
|
|
trans.length = length * 8;
|
|
|
|
|
unity_send_signal("Slave ready");
|
|
|
|
|
TEST_ESP_OK(spi_slave_transmit(SPI2_HOST, &trans, portMAX_DELAY));
|
|
|
|
|
ESP_LOG_BUFFER_HEX("SLAVE RX:", slv_recv_buf, length);
|
|
|
|
|
TEST_ASSERT_EQUAL(length * 8, trans.trans_len);
|
|
|
|
|
TEST_ASSERT_EQUAL_HEX8_ARRAY(mst_send_buf, slv_recv_buf, length);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static void slave_both_trans(uint8_t *slv_send_buf, uint8_t *slv_recv_buf, uint8_t *mst_send_buf, uint32_t length)
|
|
|
|
|
{
|
|
|
|
|
ESP_LOGI(SLAVE_TAG, "FD DMA, Both TX and RX:");
|
|
|
|
|
spi_slave_transaction_t trans = {0};
|
|
|
|
|
trans.tx_buffer = slv_send_buf;
|
|
|
|
|
trans.rx_buffer = slv_recv_buf;
|
|
|
|
|
trans.length = length * 8;
|
|
|
|
|
unity_send_signal("Slave ready");
|
|
|
|
|
TEST_ESP_OK(spi_slave_transmit(SPI2_HOST, &trans, portMAX_DELAY));
|
|
|
|
|
ESP_LOG_BUFFER_HEX("SLAVE TX:", slv_send_buf, length);
|
|
|
|
|
ESP_LOG_BUFFER_HEX("SLAVE RX:", slv_recv_buf, length);
|
|
|
|
|
TEST_ASSERT_EQUAL_HEX8_ARRAY(mst_send_buf, slv_recv_buf, length);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static void fd_slave(void)
|
|
|
|
|
{
|
|
|
|
|
spi_bus_config_t buscfg = SPI_BUS_TEST_DEFAULT_CONFIG();
|
|
|
|
|
spi_slave_interface_config_t slvcfg = SPI_SLAVE_TEST_DEFAULT_CONFIG();
|
|
|
|
|
|
|
|
|
|
TEST_ESP_OK(spi_slave_initialize(SPI2_HOST, &buscfg, &slvcfg, SPI_DMA_CH_AUTO));
|
|
|
|
|
|
|
|
|
|
unity_wait_for_signal("Master ready");
|
|
|
|
|
|
|
|
|
|
uint8_t *slv_send_buf = heap_caps_malloc(FD_TEST_BUF_SIZE, MALLOC_CAP_DMA);
|
|
|
|
|
uint8_t *slv_recv_buf = heap_caps_calloc(FD_TEST_BUF_SIZE, 1, MALLOC_CAP_DMA);
|
|
|
|
|
uint8_t *mst_send_buf = heap_caps_malloc(FD_TEST_BUF_SIZE, MALLOC_CAP_DMA);
|
|
|
|
|
|
|
|
|
|
for (int i = 0; i < TEST_NUM; i++) {
|
|
|
|
|
//1. Slave TX without RX (rx_buffer == NULL)
|
|
|
|
|
get_tx_buffer(FD_SEED1+i, mst_send_buf, slv_send_buf, FD_TEST_BUF_SIZE);
|
|
|
|
|
slave_only_tx_trans(slv_send_buf, FD_TEST_BUF_SIZE);
|
|
|
|
|
|
|
|
|
|
//2. Slave both TX and RX
|
|
|
|
|
get_tx_buffer(FD_SEED2+i, mst_send_buf, slv_send_buf, FD_TEST_BUF_SIZE);
|
|
|
|
|
memset(slv_recv_buf, 0x0, FD_TEST_BUF_SIZE);
|
|
|
|
|
slave_both_trans(slv_send_buf, slv_recv_buf, mst_send_buf, FD_TEST_BUF_SIZE);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
for (int i = 0; i < TEST_NUM; i++) {
|
|
|
|
|
// 1. Slave RX without TX (tx_buffer == NULL)
|
|
|
|
|
get_tx_buffer(FD_SEED3+i, mst_send_buf, slv_send_buf, FD_TEST_BUF_SIZE);
|
|
|
|
|
memset(slv_recv_buf, 0x0, FD_TEST_BUF_SIZE);
|
|
|
|
|
slave_only_rx_trans(slv_recv_buf, mst_send_buf, FD_TEST_BUF_SIZE);
|
|
|
|
|
|
|
|
|
|
//2. Slave both TX and RX
|
|
|
|
|
get_tx_buffer(FD_SEED4+i, mst_send_buf, slv_send_buf, FD_TEST_BUF_SIZE);
|
|
|
|
|
memset(slv_recv_buf, 0x0, FD_TEST_BUF_SIZE);
|
|
|
|
|
slave_both_trans(slv_send_buf, slv_recv_buf, mst_send_buf, FD_TEST_BUF_SIZE);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
free(slv_send_buf);
|
|
|
|
|
free(slv_recv_buf);
|
|
|
|
|
free(mst_send_buf);
|
|
|
|
|
TEST_ASSERT(spi_slave_free(SPI2_HOST) == ESP_OK);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
TEST_CASE_MULTIPLE_DEVICES("SPI Master: FD, DMA, Master Single Direction Test", "[spi_ms][test_env=Example_SPI_Multi_device]", fd_master, fd_slave);
|
|
|
|
|
#endif //#if !TEMPORARY_DISABLED_FOR_TARGETS(ESP32) //TODO: IDF-3494
|
|
|
|
|
|
|
|
|
|
/********************************************************************************
|
|
|
|
|
* Test SPI transaction interval
|
|
|
|
|