@@ -387,6 +387,104 @@ static void slave_write_buffer_test_single_byte(void)
387387
388388TEST_CASE_MULTIPLE_DEVICES ("I2C master read slave test single byte" , "[i2c][test_env=generic_multi_device][timeout=150]" , master_read_slave_test_single_byte , slave_write_buffer_test_single_byte );
389389
390+ static void master_read_slave_test_with_multi_read_job (void )
391+ {
392+ uint8_t data_rd [DATA_LENGTH ] = {0 };
393+ i2c_master_bus_config_t i2c_mst_config = {
394+ .clk_source = I2C_CLK_SRC_DEFAULT ,
395+ .i2c_port = TEST_I2C_PORT ,
396+ .scl_io_num = I2C_MASTER_SCL_IO ,
397+ .sda_io_num = I2C_MASTER_SDA_IO ,
398+ .flags .enable_internal_pullup = true,
399+ };
400+ i2c_master_bus_handle_t bus_handle ;
401+ TEST_ESP_OK (i2c_new_master_bus (& i2c_mst_config , & bus_handle ));
402+
403+ i2c_device_config_t dev_cfg = {
404+ .dev_addr_length = I2C_ADDR_BIT_LEN_7 ,
405+ .device_address = I2C_DEVICE_ADDRESS_NOT_USED ,
406+ .scl_speed_hz = 100000 ,
407+ .scl_wait_us = 20000 ,
408+ };
409+
410+ i2c_master_dev_handle_t dev_handle ;
411+ TEST_ESP_OK (i2c_master_bus_add_device (bus_handle , & dev_cfg , & dev_handle ));
412+
413+ unity_wait_for_signal ("i2c slave init finish" );
414+
415+ uint8_t read_address = (ESP_SLAVE_ADDR << 1 | 1 );
416+
417+ i2c_operation_job_t i2c_ops [] = {
418+ { .command = I2C_MASTER_CMD_START },
419+ { .command = I2C_MASTER_CMD_WRITE , .write = { .ack_check = true, .data = (uint8_t * ) & read_address , .total_bytes = 1 } },
420+ { .command = I2C_MASTER_CMD_READ , .read = { .ack_value = I2C_ACK_VAL , .data = data_rd , .total_bytes = 1 }},
421+ { .command = I2C_MASTER_CMD_READ , .read = { .ack_value = I2C_ACK_VAL , .data = data_rd + 1 , .total_bytes = 1 }},
422+ { .command = I2C_MASTER_CMD_READ , .read = { .ack_value = I2C_NACK_VAL , .data = data_rd + 2 , .total_bytes = 1 }},
423+ { .command = I2C_MASTER_CMD_STOP },
424+ };
425+
426+ i2c_master_execute_defined_operations (dev_handle , i2c_ops , sizeof (i2c_ops ) / sizeof (i2c_operation_job_t ), 1000 );
427+ vTaskDelay (100 / portTICK_PERIOD_MS );
428+ TEST_ASSERT (data_rd [0 ] == 6 );
429+ TEST_ASSERT (data_rd [1 ] == 8 );
430+ TEST_ASSERT (data_rd [2 ] == 10 );
431+ unity_send_signal ("ready to delete master read test" );
432+
433+ TEST_ESP_OK (i2c_master_bus_rm_device (dev_handle ));
434+ TEST_ESP_OK (i2c_del_master_bus (bus_handle ));
435+ }
436+
437+ static void slave_write_buffer_test_single_byte_for_multi_read_job (void )
438+ {
439+ i2c_slave_dev_handle_t handle ;
440+ uint8_t data_wr [DATA_LENGTH ];
441+ event_queue = xQueueCreate (2 , sizeof (i2c_slave_event_t ));
442+ assert (event_queue );
443+
444+ i2c_slave_config_t i2c_slv_config = {
445+ .i2c_port = TEST_I2C_PORT ,
446+ .clk_source = I2C_CLK_SRC_DEFAULT ,
447+ .scl_io_num = I2C_SLAVE_SCL_IO ,
448+ .sda_io_num = I2C_SLAVE_SDA_IO ,
449+ .slave_addr = ESP_SLAVE_ADDR ,
450+ .send_buf_depth = DATA_LENGTH ,
451+ .receive_buf_depth = DATA_LENGTH ,
452+ .flags .enable_internal_pullup = true,
453+ };
454+
455+ TEST_ESP_OK (i2c_new_slave_device (& i2c_slv_config , & handle ));
456+
457+ i2c_slave_event_callbacks_t cbs = {
458+ .on_receive = i2c_slave_receive_cb ,
459+ .on_request = i2c_slave_request_cb ,
460+ };
461+
462+ TEST_ESP_OK (i2c_slave_register_event_callbacks (handle , & cbs , NULL ));
463+
464+ unity_send_signal ("i2c slave init finish" );
465+
466+ data_wr [0 ] = 6 ;
467+ data_wr [1 ] = 8 ;
468+ data_wr [2 ] = 10 ;
469+
470+ i2c_slave_event_t evt ;
471+ uint32_t write_len ;
472+ while (true) {
473+ if (xQueueReceive (event_queue , & evt , portMAX_DELAY ) == pdTRUE ) {
474+ if (evt == I2C_SLAVE_EVT_TX ) {
475+ TEST_ESP_OK (i2c_slave_write (handle , data_wr , 3 , & write_len , 1000 ));
476+ break ;
477+ }
478+ }
479+ }
480+
481+ unity_wait_for_signal ("ready to delete master read test" );
482+ vQueueDelete (event_queue );
483+ TEST_ESP_OK (i2c_del_slave_device (handle ));
484+ }
485+
486+ TEST_CASE_MULTIPLE_DEVICES ("I2C master read slave test single byte 2" , "[i2c][test_env=generic_multi_device][timeout=150]" , master_read_slave_test_with_multi_read_job , slave_write_buffer_test_single_byte_for_multi_read_job );
487+
390488static void i2c_slave_repeat_read (void )
391489{
392490 unity_wait_for_signal ("i2c master init first" );
0 commit comments