tests: drivers: spi: spi_slave: Extend test scope

Add possibility to test all four SPI modes (CPOL, CPHA).
Add possibility to test different bitrates.
Add tests that checks handling of zero length buffers on master.

Signed-off-by: Sebastian Głąb <sebastian.glab@nordicsemi.no>
This commit is contained in:
Sebastian Głąb 2024-05-21 08:07:22 +02:00 committed by Carles Cufí
commit b82946fba7
13 changed files with 180 additions and 15 deletions

View file

@ -0,0 +1,14 @@
# Copyright (c) 2024 Nordic Semiconductor ASA
# SPDX-License-Identifier: Apache-2.0
config TESTED_SPI_MODE
int "SPI mode"
default 0
help
SPI mode value (clock polarity and phase) used in the test.
0: CPOL 0 (Active high), CPHA 0 (leading)
1: CPOL 0 (Active high), CPHA 1 (trailing)
2: CPOL 1 (Active low), CPHA 0 (leading)
3: CPOL 1 (Active low), CPHA 1 (trailing)
source "Kconfig.zephyr"

View file

@ -0,0 +1,9 @@
In this test suite two instances of the SPI peripheral are connected together.
One SPI instance works as a master, second one is configured as a slave.
In each test, both instances get identical configuration (CPOL, CPHA, bitrate, etc.).
Four GPIO loopbacks are required (see overlay for nrf54l15pdk for reference):
1. spi22-SPIM_SCK connected with spi21-SPIS_SCK,
2. spi22-SPIM_MISO connected with spi21-SPIS_MISO,
3. spi22-SPIM_MOSI connected with spi21-SPIS_MOSI,
4. spi22-cs-gpios connected with spi21-SPIS_CSN.

View file

@ -0,0 +1,9 @@
/*
* Copyright (c) 2024 Nordic Semiconductor
*
* SPDX-License-Identifier: Apache-2.0
*/
&dut_spi_dt {
spi-max-frequency = <1000000>;
};

View file

@ -0,0 +1,9 @@
/*
* Copyright (c) 2024 Nordic Semiconductor
*
* SPDX-License-Identifier: Apache-2.0
*/
&dut_spi_dt {
spi-max-frequency = <250000>;
};

View file

@ -0,0 +1,9 @@
/*
* Copyright (c) 2024 Nordic Semiconductor
*
* SPDX-License-Identifier: Apache-2.0
*/
&dut_spi_dt {
spi-max-frequency = <2000000>;
};

View file

@ -0,0 +1,9 @@
/*
* Copyright (c) 2024 Nordic Semiconductor
*
* SPDX-License-Identifier: Apache-2.0
*/
&dut_spi_dt {
spi-max-frequency = <4000000>;
};

View file

@ -0,0 +1,9 @@
/*
* Copyright (c) 2024 Nordic Semiconductor
*
* SPDX-License-Identifier: Apache-2.0
*/
&dut_spi_dt {
spi-max-frequency = <500000>;
};

View file

@ -0,0 +1,9 @@
/*
* Copyright (c) 2024 Nordic Semiconductor
*
* SPDX-License-Identifier: Apache-2.0
*/
&dut_spi_dt {
spi-max-frequency = <8000000>;
};

View file

@ -53,7 +53,6 @@
dut_spi_dt: test-spi-dev@0 {
compatible = "vnd,spi-device";
reg = <0>;
spi-max-frequency = <4000000>;
};
};

View file

@ -63,7 +63,6 @@ dut_spi: &spi130 {
dut_spi_dt: test-spi-dev@0 {
compatible = "vnd,spi-device";
reg = <0>;
spi-max-frequency = <500000>;
};
};

View file

@ -57,7 +57,6 @@
dut_spi_dt: test-spi-dev@0 {
compatible = "vnd,spi-device";
reg = <0>;
spi-max-frequency = <4000000>;
};
};

View file

@ -11,7 +11,17 @@
#include <zephyr/linker/devicetree_regions.h>
#include <zephyr/ztest.h>
#define SPI_MODE (SPI_MODE_CPOL | SPI_MODE_CPHA | SPI_WORD_SET(8) | SPI_LINES_SINGLE)
#if CONFIG_TESTED_SPI_MODE == 0
#define SPI_MODE (SPI_WORD_SET(8) | SPI_LINES_SINGLE | SPI_TRANSFER_LSB)
#elif CONFIG_TESTED_SPI_MODE == 1
#define SPI_MODE (SPI_WORD_SET(8) | SPI_LINES_SINGLE | SPI_TRANSFER_MSB | SPI_MODE_CPHA)
#elif CONFIG_TESTED_SPI_MODE == 2
#define SPI_MODE (SPI_WORD_SET(8) | SPI_LINES_SINGLE | SPI_TRANSFER_LSB | SPI_MODE_CPOL)
#elif CONFIG_TESTED_SPI_MODE == 3
#define SPI_MODE (SPI_WORD_SET(8) | SPI_LINES_SINGLE | SPI_TRANSFER_MSB | SPI_MODE_CPHA \
| SPI_MODE_CPOL)
#endif
#define SPIM_OP (SPI_OP_MODE_MASTER | SPI_MODE)
#define SPIS_OP (SPI_OP_MODE_SLAVE | SPI_MODE)
@ -247,6 +257,57 @@ ZTEST(spi_slave, test_basic_async)
test_basic(true);
}
/** Basic test with zero length buffers.
*/
void test_basic_zero_len(bool async)
{
size_t len = 8;
/* SPIM */
tdata.bufs[0].buf = buf_alloc(len, true);
tdata.bufs[0].len = len;
tdata.bufs[1].buf = buf_alloc(len, true);
/* Intentionally len was set to 0 - second buffer "is empty". */
tdata.bufs[1].len = 0;
tdata.sets[0].buffers = &tdata.bufs[0];
tdata.sets[0].count = 2;
tdata.mtx_set = &tdata.sets[0];
tdata.bufs[2].buf = buf_alloc(len, true);
tdata.bufs[2].len = len;
tdata.bufs[3].buf = buf_alloc(len, true);
/* Intentionally len was set to 0 - second buffer "is empty". */
tdata.bufs[3].len = 0;
tdata.sets[1].buffers = &tdata.bufs[2];
tdata.sets[1].count = 2;
tdata.mrx_set = &tdata.sets[1];
/* SPIS */
tdata.bufs[4].buf = buf_alloc(len, false);
tdata.bufs[4].len = len;
tdata.sets[2].buffers = &tdata.bufs[4];
tdata.sets[2].count = 1;
tdata.stx_set = &tdata.sets[2];
tdata.bufs[6].buf = buf_alloc(len, false);
tdata.bufs[6].len = len;
tdata.sets[3].buffers = &tdata.bufs[6];
tdata.sets[3].count = 1;
tdata.srx_set = &tdata.sets[3];
run_test(true, true, async);
}
ZTEST(spi_slave, test_basic_zero_len)
{
test_basic_zero_len(false);
}
ZTEST(spi_slave, test_basic_zero_len_async)
{
test_basic_zero_len(true);
}
/** Setup a transfer where RX buffer on master and slave are shorter than
* TX buffers. RX buffers shall contain beginning of TX data and last TX
* bytes that did not fit in the RX buffers shall be lost.

View file

@ -1,12 +1,42 @@
common:
depends_on: spi
tags: drivers spi
harness: ztest
harness_config:
fixture: gpio_spi_loopback
platform_allow: |
nrf52840dk/nrf52840 nrf54l15pdk/nrf54l15/cpuapp nrf54h20dk/nrf54h20/cpuapp
nrf54h20dk/nrf54h20/cpurad
integration_platforms:
- nrf52840dk/nrf52840
tests:
drivers.spi_slave.api:
depends_on: spi
tags: drivers spi
harness: ztest
harness_config:
fixture: gpio_spi_loopback
platform_allow: |
nrf52840dk/nrf52840 nrf54l15pdk/nrf54l15/cpuapp nrf54h20dk/nrf54h20/cpuapp
nrf54h20dk/nrf54h20/cpurad
integration_platforms:
- nrf52840dk/nrf52840
drivers.spi.spi_mode0:
extra_configs:
- CONFIG_TESTED_SPI_MODE=0
extra_args: EXTRA_DTC_OVERLAY_FILE="boards/250khz.overlay"
drivers.spi.spi_mode1:
extra_configs:
- CONFIG_TESTED_SPI_MODE=1
extra_args: EXTRA_DTC_OVERLAY_FILE="boards/500khz.overlay"
drivers.spi.spi_mode2:
extra_configs:
- CONFIG_TESTED_SPI_MODE=2
extra_args: EXTRA_DTC_OVERLAY_FILE="boards/1mhz.overlay"
drivers.spi.spi_mode3:
extra_configs:
- CONFIG_TESTED_SPI_MODE=3
extra_args: EXTRA_DTC_OVERLAY_FILE="boards/2mhz.overlay"
drivers.spi.spi_4MHz:
extra_configs:
- CONFIG_TESTED_SPI_MODE=2
extra_args: EXTRA_DTC_OVERLAY_FILE="boards/4mhz.overlay"
drivers.spi.spi_8MHz:
extra_configs:
- CONFIG_TESTED_SPI_MODE=1
extra_args: EXTRA_DTC_OVERLAY_FILE="boards/8mhz.overlay"