完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
在初始化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个回答
|
|
以下是一些可能的原因和解决方法:
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驱动代码,以解决已知的问题或不兼容问题。 |
|
|
|
只有小组成员才能发言,加入小组>>
168个成员聚集在这个小组
加入小组140 浏览 0 评论
1158 浏览 1 评论
584浏览 6评论
482浏览 5评论
有没有办法在不使用混杂模式的情况下实现Wifi驱动程序接收缓冲区访问中断呢?
467浏览 5评论
466浏览 4评论
441浏览 4评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-25 16:48 , Processed in 0.856109 second(s), Total 82, Slave 65 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号