乐鑫技术交流
直播中

study875

12年用户 1142经验值
私信 关注
[问答]

eps32-s3使用i8080例程驱动NT35510,8080的16位并口,出现色差的原因?

本人小白一个,使用官方例程驱动NT35510,8080的16位并口,颜色显示不对。而后修改了nt35510的初始化函数(panel_nt35510_init函数),发现8位并口屏幕能正常显示,但是16位并口显示的颜色color_data高低字节相反,最后修改panel_nt35510_draw_bitmap函数,手动进行颜色高低字节交换,16位并口颜色能正常显示,但是这样的话显示的速度又太慢了,请问有什么可以配置有关颜色高低字节交换地方或者修改某些宏实现吗?
初始化就不写上来了,很长.....
以下为修改的panel_nt35510_draw_bitmap函数,使颜色高低字节交换:


  • static esp_err_t panel_nt35510_draw_bitmap(esp_lcd_panel_t *panel, int x_start, int y_start, int x_end, int y_end,
  •                                            const void *color_data)
  • {
  •     nt35510_panel_t *nt35510 = __containerof(panel, nt35510_panel_t, base);
  •     assert((x_start < x_end) && (y_start < y_end) && "start position must be smaller than end position");
  •     esp_lcd_panel_io_handle_t io = nt35510->io;

  •     x_start += nt35510->x_gap;
  •     x_end += nt35510->x_gap;
  •     y_start += nt35510->y_gap;
  •     y_end += nt35510->y_gap;

  •     // define an area of frame memory where MCU can access
  •     ESP_RETURN_ON_ERROR(esp_lcd_panel_io_tx_param(io, (LCD_CMD_CASET << 8) + 0, (uint16_t[) {
  •         (x_start >> 8) & 0xFF,
  •     }, 2), TAG, "io tx param failed");
  •     ESP_RETURN_ON_ERROR(esp_lcd_panel_io_tx_param(io, (LCD_CMD_CASET << 8) + 1, (uint16_t[) {
  •         x_start & 0xFF,
  •     }, 2), TAG, "io tx param failed");
  •     ESP_RETURN_ON_ERROR(esp_lcd_panel_io_tx_param(io, (LCD_CMD_CASET << 8) + 2, (uint16_t[) {
  •         ((x_end - 1) >> 8) & 0xFF,
  •     }, 2), TAG, "io tx param failed");
  •     ESP_RETURN_ON_ERROR(esp_lcd_panel_io_tx_param(io, (LCD_CMD_CASET << 8) + 3, (uint16_t[) {
  •         (x_end - 1) & 0xFF,
  •     }, 2), TAG, "io tx param failed");
  •     ESP_RETURN_ON_ERROR(esp_lcd_panel_io_tx_param(io, (LCD_CMD_RASET << 8) + 0, (uint16_t[) {
  •         (y_start >> 8) & 0xFF,
  •     }, 2), TAG, "io tx param failed");
  •     ESP_RETURN_ON_ERROR(esp_lcd_panel_io_tx_param(io, (LCD_CMD_RASET << 8) + 1, (uint16_t[) {
  •         y_start & 0xFF,
  •     }, 2), TAG, "io tx param failed");
  •     ESP_RETURN_ON_ERROR(esp_lcd_panel_io_tx_param(io, (LCD_CMD_RASET << 8) + 2, (uint16_t[) {
  •         ((y_end - 1) >> 8) & 0xFF,
  •     }, 2), TAG, "io tx param failed");
  •     ESP_RETURN_ON_ERROR(esp_lcd_panel_io_tx_param(io, (LCD_CMD_RASET << 8) + 3, (uint16_t[) {
  •         (y_end - 1) & 0xFF,
  •     }, 2), TAG, "io tx param failed");
  •     // transfer frame buffer
  •     size_t len = (x_end - x_start) * (y_end - y_start) * nt35510->fb_bits_per_pixel / 8;


  • //****************start***************************************************************************************

  •     // 为交换后的数据创建一个新缓冲区
  •     uint16_t *swapped_color_data = malloc(len);
  •     if (!swapped_color_data) {
  •         return ESP_ERR_NO_MEM;
  •     }

  •     // 对颜色数据进行高低字节交换
  •     const uint16_t *src = (const uint16_t *)color_data;
  •     for (size_t i = 0; i < len / 2; i++) { // len / 2 因为 len 是以字节为单位,而我们处理的是 16 位数据
  •         swapped_color_data[i = (src[i >> 8) | (src[i << 8);
  •     }

  •     // 发送交换后的颜色数据
  •     esp_err_t err = esp_lcd_panel_io_tx_color(io, LCD_CMD_RAMWR << 8, swapped_color_data, len);
  •     if (err != ESP_OK) {
  •         free(swapped_color_data);
  •         return err;
  •     }

  •     free(swapped_color_data);

  • //*****************end**************************************************************************************

  •     return ESP_OK;
  • }




回帖(1)

h1654155275.5741

2024-6-27 16:57:14
根据您的描述,您在使用i8080例程驱动NT35510时遇到了色差问题。在16位并口模式下,颜色显示不正确,但在8位并口模式下可以正常显示。您已经尝试修改了`panel_nt35510_draw_bitmap`函数,手动进行颜色高低字节交换,虽然颜色显示正常,但显示速度变慢了。

要解决这个问题,您可以尝试以下方法:

1. 检查NT35510的数据手册,了解其16位并口模式下的数据传输格式。这将帮助您确定是否需要对数据进行字节交换。

2. 在初始化NT35510时,设置正确的颜色格式。您可以在`panel_nt35510_init`函数中检查是否已经设置了正确的颜色格式。如果需要,您可以修改初始化代码以适应16位并口模式。

3. 检查您的硬件连接是否正确。确保i8080和NT35510之间的数据线连接正确,并且没有损坏或接触不良。

4. 优化`panel_nt35510_draw_bitmap`函数。您可以尝试使用更高效的数据传输方法,例如使用DMA(直接内存访问)技术,以提高显示速度。

5. 如果可能的话,尝试使用其他库或驱动程序来驱动NT35510。这可能会提供更好的性能和更简单的配置。

6. 在您的代码中添加一些调试信息,以便更好地了解问题所在。这可以帮助您确定问题是否出在数据传输、初始化设置或其他方面。

总之,要解决这个问题,您需要深入了解NT35510的数据手册,检查硬件连接,优化代码,并尝试使用其他库或驱动程序。希望这些建议能帮助您解决问题。
举报

更多回帖

×
20
完善资料,
赚取积分