Skip to content

Commit fb25eb0

Browse files
committed
Merge branch 'fix/p4_spi_slave_example_not_work_v5.3' into 'release/v5.3'
fix(driver_spi): fixed slave (and slave_hd) driver and example error with alignment check (v5.3) See merge request espressif/esp-idf!36404
2 parents 814cb09 + c18f258 commit fb25eb0

File tree

8 files changed

+24
-22
lines changed

8 files changed

+24
-22
lines changed

components/esp_driver_spi/src/gpspi/spi_master.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1131,7 +1131,7 @@ static SPI_MASTER_ISR_ATTR esp_err_t setup_priv_desc(spi_host_t *host, spi_trans
11311131

11321132
if (send_ptr && bus_attr->dma_enabled) {
11331133
if ((!esp_ptr_dma_capable(send_ptr) || tx_unaligned)) {
1134-
ESP_RETURN_ON_FALSE(!(trans_desc->flags & SPI_TRANS_DMA_BUFFER_ALIGN_MANUAL), ESP_ERR_INVALID_ARG, SPI_TAG, "Set flag SPI_TRANS_DMA_BUFFER_ALIGN_MANUAL but TX buffer addr&len not align to %d, or not dma_capable", alignment);
1134+
ESP_RETURN_ON_FALSE(!(trans_desc->flags & SPI_TRANS_DMA_BUFFER_ALIGN_MANUAL), ESP_ERR_INVALID_ARG, SPI_TAG, "Set flag SPI_TRANS_DMA_BUFFER_ALIGN_MANUAL but TX buffer addr&len not align to %d byte, or not dma_capable", alignment);
11351135
//if txbuf in the desc not DMA-capable, or not bytes aligned to alignment, malloc a new one
11361136
ESP_EARLY_LOGD(SPI_TAG, "Allocate TX buffer for DMA");
11371137
tx_byte_len = (tx_byte_len + alignment - 1) & (~(alignment - 1)); // up align alignment
@@ -1151,7 +1151,7 @@ static SPI_MASTER_ISR_ATTR esp_err_t setup_priv_desc(spi_host_t *host, spi_trans
11511151

11521152
if (rcv_ptr && bus_attr->dma_enabled) {
11531153
if ((!esp_ptr_dma_capable(rcv_ptr) || rx_unaligned)) {
1154-
ESP_RETURN_ON_FALSE(!(trans_desc->flags & SPI_TRANS_DMA_BUFFER_ALIGN_MANUAL), ESP_ERR_INVALID_ARG, SPI_TAG, "Set flag SPI_TRANS_DMA_BUFFER_ALIGN_MANUAL but RX buffer addr&len not align to %d, or not dma_capable", alignment);
1154+
ESP_RETURN_ON_FALSE(!(trans_desc->flags & SPI_TRANS_DMA_BUFFER_ALIGN_MANUAL), ESP_ERR_INVALID_ARG, SPI_TAG, "Set flag SPI_TRANS_DMA_BUFFER_ALIGN_MANUAL but RX buffer addr&len not align to %d byte, or not dma_capable", alignment);
11551155
//if rxbuf in the desc not DMA-capable, or not aligned to alignment, malloc a new one
11561156
ESP_EARLY_LOGD(SPI_TAG, "Allocate RX buffer for DMA");
11571157
rx_byte_len = (rx_byte_len + alignment - 1) & (~(alignment - 1)); // up align alignment

components/esp_driver_spi/src/gpspi/spi_slave.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -364,7 +364,7 @@ static esp_err_t SPI_SLAVE_ISR_ATTR spi_slave_setup_priv_trans(spi_host_device_t
364364

365365
if (spihost[host]->dma_enabled && trans->tx_buffer) {
366366
if ((!esp_ptr_dma_capable(trans->tx_buffer) || ((((uint32_t)trans->tx_buffer) | buffer_byte_len) & (alignment - 1)))) {
367-
ESP_RETURN_ON_FALSE_ISR(trans->flags & SPI_SLAVE_TRANS_DMA_BUFFER_ALIGN_AUTO, ESP_ERR_INVALID_ARG, SPI_TAG, "TX buffer addr&len not align to %d, or not dma_capable", alignment);
367+
ESP_RETURN_ON_FALSE_ISR(trans->flags & SPI_SLAVE_TRANS_DMA_BUFFER_ALIGN_AUTO, ESP_ERR_INVALID_ARG, SPI_TAG, "TX buffer addr&len not align to %d byte, or not dma_capable", alignment);
368368
//if txbuf in the desc not DMA-capable, or not align to "alignment", malloc a new one
369369
ESP_EARLY_LOGD(SPI_TAG, "Allocate TX buffer for DMA");
370370
buffer_byte_len = (buffer_byte_len + alignment - 1) & (~(alignment - 1)); // up align to "alignment"
@@ -381,7 +381,7 @@ static esp_err_t SPI_SLAVE_ISR_ATTR spi_slave_setup_priv_trans(spi_host_device_t
381381
}
382382
if (spihost[host]->dma_enabled && trans->rx_buffer) {
383383
if ((!esp_ptr_dma_capable(trans->rx_buffer) || ((((uint32_t)trans->rx_buffer) | (trans->length + 7) / 8) & (alignment - 1)))) {
384-
ESP_RETURN_ON_FALSE_ISR(trans->flags & SPI_SLAVE_TRANS_DMA_BUFFER_ALIGN_AUTO, ESP_ERR_INVALID_ARG, SPI_TAG, "RX buffer addr&len not align to %d, or not dma_capable", alignment);
384+
ESP_RETURN_ON_FALSE_ISR(trans->flags & SPI_SLAVE_TRANS_DMA_BUFFER_ALIGN_AUTO, ESP_ERR_INVALID_ARG, SPI_TAG, "RX buffer addr&len not align to %d byte, or not dma_capable", alignment);
385385
//if rxbuf in the desc not DMA-capable, or not align to "alignment", malloc a new one
386386
ESP_EARLY_LOGD(SPI_TAG, "Allocate RX buffer for DMA");
387387
buffer_byte_len = (buffer_byte_len + alignment - 1) & (~(alignment - 1)); // up align to "alignment"

components/esp_driver_spi/src/gpspi/spi_slave_hd.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -586,8 +586,8 @@ static esp_err_t s_spi_slave_hd_setup_priv_trans(spi_host_device_t host, spi_sla
586586
uint16_t alignment = spihost[host]->internal_mem_align_size;
587587
uint32_t byte_len = orig_trans->len;
588588

589-
if (((uint32_t)orig_trans->data) | (byte_len & (alignment - 1))) {
590-
ESP_RETURN_ON_FALSE(orig_trans->flags & SPI_SLAVE_HD_TRANS_DMA_BUFFER_ALIGN_AUTO, ESP_ERR_INVALID_ARG, TAG, "data buffer addr&len not align to %d, or not dma_capable", alignment);
589+
if (((uint32_t)orig_trans->data | byte_len) & (alignment - 1)) {
590+
ESP_RETURN_ON_FALSE(orig_trans->flags & SPI_SLAVE_HD_TRANS_DMA_BUFFER_ALIGN_AUTO, ESP_ERR_INVALID_ARG, TAG, "data buffer addr&len not align to %d byte, or not dma_capable", alignment);
591591
byte_len = (byte_len + alignment - 1) & (~(alignment - 1)); // up align to alignment
592592
ESP_LOGD(TAG, "Re-allocate %s buffer of len %ld for DMA", (chan == SPI_SLAVE_CHAN_TX) ? "TX" : "RX", byte_len);
593593
priv_trans->aligned_buffer = heap_caps_aligned_alloc(64, byte_len, MALLOC_CAP_DMA);

components/esp_driver_spi/test_apps/param/main/test_spi_param.c

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1650,6 +1650,7 @@ static void test_master_hd_no_dma(void)
16501650
uint32_t test_trans_len = SOC_SPI_MAXIMUM_BUFFER_SIZE;
16511651
unity_wait_for_signal("Slave ready");
16521652
TEST_ESP_OK(essl_spi_rddma(dev0, master_receive, test_trans_len, -1, 0));
1653+
unity_wait_for_signal("Slave ready");
16531654
TEST_ESP_OK(essl_spi_wrdma(dev0, master_send, test_trans_len, -1, 0));
16541655

16551656
ESP_LOG_BUFFER_HEX("master tx", master_send, test_trans_len);
@@ -1697,11 +1698,12 @@ static void test_slave_hd_no_dma(void)
16971698
.len = test_trans_len,
16981699
.flags = SPI_SLAVE_HD_TRANS_DMA_BUFFER_ALIGN_AUTO,
16991700
};
1700-
unity_send_signal("Slave ready");
17011701
TEST_ESP_OK(spi_slave_hd_queue_trans(TEST_SPI_HOST, SPI_SLAVE_CHAN_TX, &slave_trans, portMAX_DELAY));
1702+
unity_send_signal("Slave ready");
1703+
TEST_ESP_OK(spi_slave_hd_get_trans_res(TEST_SPI_HOST, SPI_SLAVE_CHAN_TX, &ret_trans, portMAX_DELAY));
17021704
slave_trans.data = slave_receive;
17031705
TEST_ESP_OK(spi_slave_hd_queue_trans(TEST_SPI_HOST, SPI_SLAVE_CHAN_RX, &slave_trans, portMAX_DELAY));
1704-
TEST_ESP_OK(spi_slave_hd_get_trans_res(TEST_SPI_HOST, SPI_SLAVE_CHAN_TX, &ret_trans, portMAX_DELAY));
1706+
unity_send_signal("Slave ready");
17051707
TEST_ESP_OK(spi_slave_hd_get_trans_res(TEST_SPI_HOST, SPI_SLAVE_CHAN_RX, &ret_trans, portMAX_DELAY));
17061708

17071709
ESP_LOG_BUFFER_HEX("slave tx", slave_send, test_trans_len);

examples/peripherals/spi_slave/receiver/main/app_main.c

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -100,11 +100,10 @@ void app_main(void)
100100
ret = spi_slave_initialize(RCV_HOST, &buscfg, &slvcfg, SPI_DMA_CH_AUTO);
101101
assert(ret == ESP_OK);
102102

103-
WORD_ALIGNED_ATTR char sendbuf[129] = "";
104-
WORD_ALIGNED_ATTR char recvbuf[129] = "";
105-
memset(recvbuf, 0, 33);
106-
spi_slave_transaction_t t;
107-
memset(&t, 0, sizeof(t));
103+
char *sendbuf = heap_caps_malloc(129, MALLOC_CAP_DMA);
104+
char *recvbuf = heap_caps_malloc(129, MALLOC_CAP_DMA);
105+
assert(sendbuf && recvbuf);
106+
spi_slave_transaction_t t = {0};
108107

109108
while (1) {
110109
//Clear receive buffer, set send buffer to something sane
@@ -128,5 +127,4 @@ void app_main(void)
128127
printf("Received: %s\n", recvbuf);
129128
n++;
130129
}
131-
132130
}

examples/peripherals/spi_slave_hd/append_mode/master/main/app_main.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@
2424
#define GPIO_CS 10
2525

2626
#define HOST_ID SPI2_HOST
27-
#define TRANSACTION_LEN 16
27+
#define TRANSACTION_LEN 64
2828
//The SPI transaction cycles in this example. You may change the cycle. e.g., use the ``sender`` and change it to a infinite loop
2929
#define EXAMPLE_CYCLES 10
3030

examples/peripherals/spi_slave_hd/append_mode/slave/main/app_main.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@
2525

2626
#define HOST_ID SPI2_HOST
2727
#define QUEUE_SIZE 6
28-
#define TRANSACTION_LEN 16
28+
#define TRANSACTION_LEN 64
2929
#define SYNC_REG_FROM_HOST (14 * 4)
3030
#define SYNC_REG_TO_HOST (15 * 4)
3131

@@ -72,7 +72,7 @@ static esp_err_t create_transaction_pool(uint8_t **data_buf, trans_link_t *trans
7272
{
7373
for (int i = 0; i < times; i++) {
7474
//malloc data buffers for transaction
75-
data_buf[i] = heap_caps_calloc(1, TRANSACTION_LEN, MALLOC_CAP_DMA);
75+
data_buf[i] = heap_caps_malloc(TRANSACTION_LEN, MALLOC_CAP_DMA);
7676
if (!data_buf[i]) {
7777
ESP_LOGI("Create pool:", "No enough memory");
7878
return ESP_ERR_NO_MEM;

examples/peripherals/spi_slave_hd/segment_mode/seg_slave/main/app_main.c

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -198,7 +198,9 @@ void sender(void *arg)
198198
data_ready = get_tx_data(send_buf[descriptor_id], send_buf_size, &ready_data_size);
199199
if (data_ready) {
200200
slave_trans[descriptor_id].data = send_buf[descriptor_id];
201-
slave_trans[descriptor_id].len = ready_data_size;
201+
slave_trans[descriptor_id].len = send_buf_size;
202+
//To use dma, data buffer address and trans_len should byte align to hardware requirement, or using following flag for auto deal by driver.
203+
slave_trans[descriptor_id].flags |= SPI_SLAVE_HD_TRANS_DMA_BUFFER_ALIGN_AUTO;
202204
//Due to the `queue_sent_cnt` and `queue_recv_cnt` logic above, we are sure there is space to send data, this will return ESP_OK immediately
203205
ESP_ERROR_CHECK(spi_slave_hd_queue_trans(SLAVE_HOST, SPI_SLAVE_CHAN_TX, &slave_trans[descriptor_id], portMAX_DELAY));
204206
descriptor_id = (descriptor_id + 1) % QUEUE_SIZE; //descriptor_id will be: 0, 1, 2, ..., QUEUE_SIZE, 0, 1, ....
@@ -234,7 +236,7 @@ void receiver(void *arg)
234236
uint8_t *recv_buf[QUEUE_SIZE];
235237
spi_slave_hd_data_t slave_trans[QUEUE_SIZE];
236238
for (int i = 0; i < QUEUE_SIZE; i++) {
237-
recv_buf[i] = heap_caps_calloc(1, recv_buf_size, MALLOC_CAP_DMA);
239+
recv_buf[i] = heap_caps_malloc(recv_buf_size, MALLOC_CAP_DMA);
238240
if (!recv_buf[i]) {
239241
ESP_LOGE(TAG, "No enough memory!");
240242
abort();
@@ -249,6 +251,7 @@ void receiver(void *arg)
249251
for (int i = 0; i < QUEUE_SIZE; i++) {
250252
slave_trans[descriptor_id].data = recv_buf[descriptor_id];
251253
slave_trans[descriptor_id].len = recv_buf_size;
254+
slave_trans[descriptor_id].flags |= SPI_SLAVE_HD_TRANS_DMA_BUFFER_ALIGN_AUTO;
252255
ESP_ERROR_CHECK(spi_slave_hd_queue_trans(SLAVE_HOST, SPI_SLAVE_CHAN_RX, &slave_trans[descriptor_id], portMAX_DELAY));
253256
descriptor_id = (descriptor_id + 1) % QUEUE_SIZE; //descriptor_id will be: 0, 1, 2, ..., QUEUE_SIZE, 0, 1, ....
254257
}
@@ -266,7 +269,6 @@ void receiver(void *arg)
266269
*/
267270
ESP_ERROR_CHECK(spi_slave_hd_get_trans_res(SLAVE_HOST, SPI_SLAVE_CHAN_RX, &ret_trans, portMAX_DELAY));
268271
//Process the received data in your own code. Here we just print it out.
269-
printf("%d bytes are received: \n%s\n", ret_trans->trans_len, ret_trans->data);
270272
memset(ret_trans->data, 0x0, recv_buf_size);
271273

272274
/**
@@ -288,10 +290,10 @@ void app_main(void)
288290
uint8_t init_value[SOC_SPI_MAXIMUM_BUFFER_SIZE] = {0x0};
289291
spi_slave_hd_write_buffer(SLAVE_HOST, 0, init_value, SOC_SPI_MAXIMUM_BUFFER_SIZE);
290292

291-
static uint32_t send_buf_size = 5000;
293+
static uint32_t send_buf_size = 4800;
292294
spi_slave_hd_write_buffer(SLAVE_HOST, SLAVE_MAX_TX_BUF_LEN_REG, (uint8_t *)&send_buf_size, sizeof(send_buf_size));
293295

294-
static uint32_t recv_buf_size = 120;
296+
static uint32_t recv_buf_size = 128;
295297
spi_slave_hd_write_buffer(SLAVE_HOST, SLAVE_MAX_RX_BUF_LEN_REG, (uint8_t *)&recv_buf_size, sizeof(recv_buf_size));
296298

297299
uint32_t slave_ready_flag = SLAVE_READY_FLAG;

0 commit comments

Comments
 (0)