乐鑫技术交流
直播中

CDCNKA

8年用户 1240经验值
擅长:385288
私信 关注
[问答]

在初始化ST7789并口驱动时,一直卡死了在了队列接收中怎么解决?

在初始化ST7789并口驱动时,一直卡死了在了队列接收中:ESP_LOGI("i2s_write_data","xQueueReceive start1") 和ESP_LOGI("i2s_write_data","xQueueReceive end1")之间的  xQueueReceive(i2s_lcd_obj->event_queue, (void *)&event, portMAX_DELAY)中
代码如下:
static void i2s_write_data(i2s_lcd_obj_t *i2s_lcd_obj, uint8_t *data, size_t len)
{
    int event  = 0;
    int x = 0, y = 0, left = 0, cnt = 0;
    if (len <= 0) {
        ESP_LOGE(TAG, "wrong len!");
        return;
    }
    lcd_dma_set_int(i2s_lcd_obj);
    uint32_t half_buffer_size = i2s_lcd_obj->dma_half_buffer_size;
    cnt = len / half_buffer_size;
    // Start signal
    xQueueSend(i2s_lcd_obj->event_queue, &event, 0);
    // Process a complete piece of data, ping-pong operation
    for (x = 0; x < cnt; x++) {
        uint8_t *out = (uint8_t*)i2s_lcd_obj->dma[(x % 2) * i2s_lcd_obj->dma_half_node_cnt].buf;
        uint8_t *in = data;
        if (i2s_lcd_obj->swap_data) {
            uint8_t *out1 = out + 1;
            uint8_t *in1 = in + 1;
            for (y = 0; y < half_buffer_size;) {
                out1[y] = in[y];
                out[y] = in1[y];
                y += 2;
                out1[y] = in[y];
                out[y] = in1[y];
                y += 2;
            }
        } else {
            memcpy(out, in, half_buffer_size);
        }
        data += half_buffer_size;
        xQueueReceive(i2s_lcd_obj->event_queue, (void *)&event, portMAX_DELAY);
        lcd_i2s_start(i2s_lcd_obj->i2s_dev, ((uint32_t)&i2s_lcd_obj->dma[(x % 2) * i2s_lcd_obj->dma_half_node_cnt]) & 0xfffff, half_buffer_size);
    }
    left = len % half_buffer_size;
    // Process remaining incomplete segment data
    if (left) {
        uint8_t *out = (uint8_t*)i2s_lcd_obj->dma[(x % 2) * i2s_lcd_obj->dma_half_node_cnt].buf;
        uint8_t *in  = data;
        cnt = left - left % 2;
        if (cnt) {
            if (i2s_lcd_obj->swap_data) {
                for (y = 0; y < cnt; y+=2) {
                    out[y+1] = in[y+0];
                    out[y+0] = in[y+1];
                }
            } else {
                memcpy(out, in, cnt);
            }
        }

        if (left % 2) {
            out[cnt] = in[cnt];
        }
        lcd_dma_set_left(i2s_lcd_obj, x, left);
        xQueueReceive(i2s_lcd_obj->event_queue, (void *)&event, portMAX_DELAY);
        lcd_i2s_start(i2s_lcd_obj->i2s_dev, ((uint32_t)&i2s_lcd_obj->dma[(x % 2) * i2s_lcd_obj->dma_half_node_cnt]) & 0xfffff, left);
    }

    ESP_LOGI("i2s_write_data","xQueueReceive start1");
    xQueueReceive(i2s_lcd_obj->event_queue, (void *)&event, portMAX_DELAY);
    ESP_LOGI("i2s_write_data","xQueueReceive end1");
}

有没有遇到这种情况的啊?
               

回帖(1)

刘超

2024-6-27 16:56:01
以下是一些可能的原因和解决方法:

1. **检查队列创建**:确保在初始化ST7789驱动之前,队列已经被正确创建。如果队列没有正确创建,`xQueueReceive`可能会失败。

   ```c
   xQueueHandle event_queue = xQueueCreate(10, sizeof(int));
   ```

2. **检查队列是否已满**:如果队列已满,`xQueueReceive`将无法接收新事件。确保队列有足够的空间来接收新事件。

3. **检查事件发送**:确保在`i2s_write_data`函数之前,事件已经被发送到队列。如果事件没有被发送,`xQueueReceive`将无法接收任何事件。

   ```c
   xQueueSend(event_queue, (void *)&event, portMAX_DELAY);
   ```

4. **检查ESP_LOGI日志**:如果日志没有显示"xQueueReceive start1"和"xQueueReceive end1",这可能意味着代码在执行到`xQueueReceive`之前就遇到了问题。检查前面的代码,确保没有错误或异常。

5. **使用断点调试**:在`xQueueReceive`之前和之后设置断点,检查程序是否在预期的位置停止。这将帮助您确定问题所在。

6. **检查I2S配置**:确保I2S配置正确,包括波特率、数据位、时钟位等。错误的I2S配置可能导致数据传输失败。

7. **检查硬件连接**:确保ST7789显示屏与ESP32之间的硬件连接正确,包括数据线、时钟线和电源线。

8. **检查电源供应**:确保ST7789显示屏的电源供应稳定,电压和电流符合要求。

9. **更新驱动代码**:如果可能,尝试使用更新版本的ST7789驱动代码,以解决已知的问题或不兼容问题。


举报

更多回帖

发帖
×
20
完善资料,
赚取积分