@@ -36,22 +36,17 @@ static WORD_ALIGNED_ATTR uint8_t slave_rxbuf[320];
3636static const uint8_t master_send [] = { 0x93 , 0x34 , 0x56 , 0x78 , 0x9a , 0xbc , 0xde , 0xf0 , 0xaa , 0xcc , 0xff , 0xee , 0x55 , 0x77 , 0x88 , 0x43 };
3737static const uint8_t slave_send [] = { 0xaa , 0xdc , 0xba , 0x98 , 0x76 , 0x54 , 0x32 , 0x10 , 0x13 , 0x57 , 0x9b , 0xdf , 0x24 , 0x68 , 0xac , 0xe0 };
3838
39- static inline void int_connect ( uint32_t gpio , uint32_t sigo , uint32_t sigi )
39+ static void custom_setup ( void )
4040{
41- esp_rom_gpio_connect_out_signal (gpio , sigo , false, false);
42- esp_rom_gpio_connect_in_signal (gpio , sigi , false);
43- }
41+ //Initialize buffers
42+ memset (master_txbuf , 0 , sizeof (master_txbuf ));
43+ memset (master_rxbuf , 0 , sizeof (master_rxbuf ));
44+ memset (slave_txbuf , 0 , sizeof (slave_txbuf ));
45+ memset (slave_rxbuf , 0 , sizeof (slave_rxbuf ));
4446
45- static void master_init (spi_device_handle_t * spi )
46- {
47- esp_err_t ret ;
48- spi_bus_config_t buscfg = {
49- .miso_io_num = PIN_NUM_MISO ,
50- .mosi_io_num = PIN_NUM_MOSI ,
51- .sclk_io_num = PIN_NUM_CLK ,
52- .quadwp_io_num = UNCONNECTED_PIN ,
53- .quadhd_io_num = -1
54- };
47+ //Initialize SPI Master
48+ spi_bus_config_t buscfg = SPI_BUS_TEST_DEFAULT_CONFIG ();
49+ buscfg .flags |= SPICOMMON_BUSFLAG_GPIO_PINS ;
5550 spi_device_interface_config_t devcfg = {
5651 .clock_speed_hz = 4 * 1000 * 1000 , //currently only up to 4MHz for internal connect
5752 .mode = 0 , //SPI mode 0
@@ -62,61 +57,28 @@ static void master_init(spi_device_handle_t *spi)
6257 .cs_ena_pretrans = 1 ,
6358 };
6459 //Initialize the SPI bus
65- ret = spi_bus_initialize (TEST_SPI_HOST , & buscfg , SPI_DMA_CH_AUTO );
66- TEST_ASSERT (ret == ESP_OK );
67- //Attach the LCD to the SPI bus
68- ret = spi_bus_add_device (TEST_SPI_HOST , & devcfg , spi );
69- TEST_ASSERT (ret == ESP_OK );
70- }
60+ TEST_ESP_OK (spi_bus_initialize (TEST_SPI_HOST , & buscfg , SPI_DMA_CH_AUTO ));
61+ //Attach the device to the SPI bus
62+ TEST_ESP_OK (spi_bus_add_device (TEST_SPI_HOST , & devcfg , & spi ));
7163
72- static void slave_init (void )
73- {
74- //Configuration for the SPI bus
75- spi_bus_config_t buscfg = {
76- .mosi_io_num = PIN_NUM_MOSI ,
77- .miso_io_num = PIN_NUM_MISO ,
78- .sclk_io_num = PIN_NUM_CLK
79- };
8064 //Configuration for the SPI slave interface
81- spi_slave_interface_config_t slvcfg = {
82- .mode = 0 ,
83- .spics_io_num = PIN_NUM_CS ,
84- .queue_size = 3 ,
85- .flags = 0 ,
86- };
65+ spi_slave_interface_config_t slvcfg = SPI_SLAVE_TEST_DEFAULT_CONFIG ();
8766 //Enable pull-ups on SPI lines so we don't detect rogue pulses when no master is connected.
8867 gpio_set_pull_mode (PIN_NUM_MOSI , GPIO_PULLUP_ONLY );
8968 gpio_set_pull_mode (PIN_NUM_CLK , GPIO_PULLUP_ONLY );
9069 gpio_set_pull_mode (PIN_NUM_CS , GPIO_PULLUP_ONLY );
9170 //Initialize SPI slave interface
9271 TEST_ESP_OK (spi_slave_initialize (TEST_SLAVE_HOST , & buscfg , & slvcfg , SPI_DMA_CH_AUTO ));
93- }
94-
95- static void custom_setup (void )
96- {
97- //Initialize buffers
98- memset (master_txbuf , 0 , sizeof (master_txbuf ));
99- memset (master_rxbuf , 0 , sizeof (master_rxbuf ));
100- memset (slave_txbuf , 0 , sizeof (slave_txbuf ));
101- memset (slave_rxbuf , 0 , sizeof (slave_rxbuf ));
102-
103- //Initialize SPI Master
104- master_init (& spi );
105- //Initialize SPI Slave
106- slave_init ();
10772
10873 //Do internal connections
109- int_connect (PIN_NUM_MOSI , spi_periph_signal [TEST_SPI_HOST ].spid_out , spi_periph_signal [TEST_SLAVE_HOST ].spiq_in );
110- int_connect (PIN_NUM_MISO , spi_periph_signal [TEST_SLAVE_HOST ].spiq_out , spi_periph_signal [TEST_SPI_HOST ].spid_in );
111- int_connect (PIN_NUM_CS , spi_periph_signal [TEST_SPI_HOST ].spics_out [0 ], spi_periph_signal [TEST_SLAVE_HOST ].spics_in );
112- int_connect (PIN_NUM_CLK , spi_periph_signal [TEST_SPI_HOST ].spiclk_out , spi_periph_signal [TEST_SLAVE_HOST ].spiclk_in );
74+ same_pin_func_sel (buscfg , devcfg , 0 );
11375}
11476
11577static void custom_teardown (void )
11678{
117- TEST_ASSERT (spi_slave_free (TEST_SLAVE_HOST ) == ESP_OK );
118- TEST_ASSERT (spi_bus_remove_device (spi ) == ESP_OK );
119- TEST_ASSERT (spi_bus_free (TEST_SPI_HOST ) == ESP_OK );
79+ TEST_ESP_OK (spi_slave_free (TEST_SLAVE_HOST ));
80+ TEST_ESP_OK (spi_bus_remove_device (spi ));
81+ TEST_ESP_OK (spi_bus_free (TEST_SPI_HOST ));
12082}
12183
12284TEST_CASE ("test fullduplex slave with only RX direction" , "[spi]" )
@@ -166,6 +128,79 @@ TEST_CASE("test fullduplex slave with only RX direction", "[spi]")
166128 ESP_LOGI (SLAVE_TAG , "test passed." );
167129}
168130
131+ #define TEST_SLV_RX_BUF_LEN 15
132+ TEST_CASE ("Test slave rx no_dma overwrite when length below/over config" , "[spi]" )
133+ {
134+ spi_bus_config_t buscfg = SPI_BUS_TEST_DEFAULT_CONFIG ();
135+ buscfg .flags |= SPICOMMON_BUSFLAG_GPIO_PINS ;
136+ TEST_ESP_OK (spi_bus_initialize (TEST_SPI_HOST , & buscfg , SPI_DMA_DISABLED ));
137+ spi_device_handle_t spidev0 ;
138+ spi_device_interface_config_t devcfg = SPI_DEVICE_TEST_DEFAULT_CONFIG ();
139+ TEST_ESP_OK (spi_bus_add_device (TEST_SPI_HOST , & devcfg , & spidev0 ));
140+
141+ spi_slave_interface_config_t slvcfg = SPI_SLAVE_TEST_DEFAULT_CONFIG ();
142+ TEST_ESP_OK (spi_slave_initialize (TEST_SLAVE_HOST , & buscfg , & slvcfg , SPI_DMA_DISABLED ));
143+
144+ //initialize master and slave on the same pins break some of the output configs, fix them
145+ same_pin_func_sel (buscfg , devcfg , 0 );
146+
147+ uint8_t master_tx [TEST_SLV_RX_BUF_LEN ], slave_rx [TEST_SLV_RX_BUF_LEN ];
148+ for (uint8_t i = 0 ; i < TEST_SLV_RX_BUF_LEN ; i ++ ) {
149+ master_tx [i ] = TEST_SLV_RX_BUF_LEN - i ;
150+ slave_rx [i ] = 100 ;
151+ }
152+
153+ //------------------------------ trans_len < config_len ------------------------------
154+ printf ("Testing trans_len < config_len:\n" );
155+ spi_slave_transaction_t * slave_out , slave_tans = {
156+ .length = 8 * TEST_SLV_RX_BUF_LEN ,
157+ .rx_buffer = slave_rx ,
158+ };
159+ TEST_ESP_OK (spi_slave_queue_trans (TEST_SLAVE_HOST , & slave_tans , portMAX_DELAY ));
160+
161+ spi_transaction_t master_tans = {
162+ .length = 8 * 7 ,
163+ .tx_buffer = master_tx ,
164+ };
165+ spi_device_transmit (spidev0 , & master_tans );
166+
167+ TEST_ESP_OK (spi_slave_get_trans_result (TEST_SLAVE_HOST , & slave_out , portMAX_DELAY ));
168+
169+ ESP_LOGI (SLAVE_TAG , "trans_len: %d, config_len %d" , slave_tans .trans_len / 8 , slave_tans .length / 8 );
170+ ESP_LOG_BUFFER_HEX ("master tx" , master_tans .tx_buffer , master_tans .length / 8 );
171+ ESP_LOG_BUFFER_HEX ("slave rx" , slave_tans .rx_buffer , TEST_SLV_RX_BUF_LEN );
172+
173+ TEST_ASSERT_EQUAL (master_tans .length , slave_tans .trans_len );
174+ for (uint8_t i = slave_tans .trans_len ; i < slave_tans .length ; i += 8 ) {
175+ TEST_ASSERT_EQUAL (slave_rx [i / 8 ], 100 );
176+ }
177+
178+ //------------------------------ trans_len > config_len ------------------------------
179+ printf ("Testing trans_len > config_len:\n" );
180+ slave_tans .length = 8 * 9 ;
181+ TEST_ESP_OK (spi_slave_queue_trans (TEST_SLAVE_HOST , & slave_tans , portMAX_DELAY ));
182+
183+ master_tans .length = 8 * 11 ,
184+ spi_device_transmit (spidev0 , & master_tans );
185+
186+ TEST_ESP_OK (spi_slave_get_trans_result (TEST_SLAVE_HOST , & slave_out , portMAX_DELAY ));
187+
188+ ESP_LOGI (SLAVE_TAG , "trans_len: %d, config_len %d" , master_tans .length / 8 , slave_tans .trans_len / 8 );
189+ ESP_LOG_BUFFER_HEX ("master tx" , master_tans .tx_buffer , master_tans .length / 8 );
190+ ESP_LOG_BUFFER_HEX ("slave rx" , slave_tans .rx_buffer , TEST_SLV_RX_BUF_LEN );
191+
192+ #if !CONFIG_IDF_TARGET_ESP32 // esp32 already hardware limited trans_len <= config_len
193+ TEST_ASSERT_EQUAL (master_tans .length , slave_tans .trans_len );
194+ #endif
195+ for (uint8_t i = slave_tans .length ; i < TEST_SLV_RX_BUF_LEN * 8 ; i += 8 ) {
196+ TEST_ASSERT_EQUAL (slave_rx [i / 8 ], 100 );
197+ }
198+
199+ TEST_ESP_OK (spi_slave_free (TEST_SLAVE_HOST ));
200+ TEST_ESP_OK (spi_bus_remove_device (spidev0 ));
201+ TEST_ESP_OK (spi_bus_free (TEST_SPI_HOST ));
202+ }
203+
169204TEST_CASE ("test fullduplex slave with only TX direction" , "[spi]" )
170205{
171206 custom_setup ();
@@ -336,8 +371,8 @@ static void unaligned_test_master(void)
336371 free (master_send_buf );
337372 free (master_recv_buf );
338373 free (slave_send_buf );
339- TEST_ASSERT (spi_bus_remove_device (spi ) == ESP_OK );
340- TEST_ASSERT (spi_bus_free (TEST_SPI_HOST ) == ESP_OK );
374+ TEST_ESP_OK (spi_bus_remove_device (spi ));
375+ TEST_ESP_OK (spi_bus_free (TEST_SPI_HOST ));
341376}
342377
343378static void unaligned_test_slave (void )
@@ -386,7 +421,7 @@ static void unaligned_test_slave(void)
386421 free (slave_send_buf );
387422 free (slave_recv_buf );
388423 free (master_send_buf );
389- TEST_ASSERT (spi_slave_free (TEST_SPI_HOST ) == ESP_OK );
424+ TEST_ESP_OK (spi_slave_free (TEST_SPI_HOST ));
390425}
391426
392427TEST_CASE_MULTIPLE_DEVICES ("SPI_Slave_Unaligned_Test" , "[spi_ms][timeout=120]" , unaligned_test_master , unaligned_test_slave );
0 commit comments