Page 1 of 1

ESP32S3 3Wire SPI 9bit,请教Transaction interval如何优化?

Posted: Tue Jul 12, 2022 3:07 am
by lisongzehn
遇到的问题:
应用于LCD显示,向LCD传输360x360个16bit数据。 每个16bit数据扩展成18bit(9+9)数据,通过3Wire SPI 传输。
按目前的理解,受限于数据编码(无法在连续的8bit中进行数据编码),只能每18bit或者27bit执行一次发送事务。
在一次发送事务中,Transaction interval大约占了94.5%(20MHz SCLK见下图)。

请问Transaction interval是否可以优化? 如何优化?

Transaction interval说明.jpg
Transaction interval说明.jpg (132.36 KiB) Viewed 2247 times

1、SPI配置
  1. void SPI_3Wire_Interface_Init(  esp_err_t* ret, \
  2.                                 spi_device_handle_t* spi, \
  3.                                 spi_bus_config_t* buscfg, \
  4.                                 spi_device_interface_config_t* devcfg)
  5. {
  6.     buscfg->miso_io_num=-1;
  7.     buscfg->mosi_io_num=PIN_NUM_SPI_3WIRE_SDA_IO;
  8.     buscfg->sclk_io_num=PIN_NUM_SPI_3WIRE_SCLK_O;
  9.     buscfg->quadwp_io_num=-1;
  10.     buscfg->quadhd_io_num=-1;
  11.     //buscfg.data4_io_num=-1;
  12.     //buscfg.data5_io_num=-1;
  13.     //buscfg.data6_io_num=-1;
  14.     //buscfg.data7_io_num=-1;
  15.     buscfg->max_transfer_sz=xSPI_Max_transfer_size;
  16.     buscfg->flags=SPICOMMON_BUSFLAG_DUAL;  
  17.     //buscfg.intr_flags=;  
  18.  
  19.     devcfg->command_bits=1;
  20.     //devcfg.address_bits=24;
  21.     //devcfg.dummy_bits=;
  22.     devcfg->mode=xSPI_CPOL_CPHA_mode;   //CPOL, CPHA   
  23.     //devcfg.duty_cycle_pos;   
  24.     //devcfg.cs_ena_pretrans;
  25.     //devcfg.cs_ena_posttrans;
  26.     devcfg->clock_speed_hz=xSPI_Clock_Speed_For_DM_Initial;        
  27.     //devcfg.input_delay_ns=;
  28.     //devcfg->spics_io_num=PIN_NUM_SPI_4WIRE_2_CS_O;   
  29.     devcfg->flags=SPI_DEVICE_3WIRE | SPI_DEVICE_HALFDUPLEX;
  30.     devcfg->queue_size=7;                          
  31.     //*devcfg.pre_cb=RS_transfer_callback;  //D/C(RS)处理
  32.     //devcfg.post_cb=;
  33.  
  34.     //Initialize the SPI bus
  35.     *ret=spi_bus_initialize(LCD_HOST, buscfg, SPI_DMA_CH_AUTO);  
  36.     ESP_ERROR_CHECK(*ret);
  37.     //Attach the LCD to the SPI bus
  38.     *ret=spi_bus_add_device(LCD_HOST, devcfg, spi);
  39.     ESP_ERROR_CHECK(*ret);
  40. }
2、发送事务
  1. void DM_Display_Color(uint16_t u16Color)
  2. {
  3.     uint32_t i,j= 0;
  4.     uint32_t u32TxBuffer = 0;
  5.     uint32_t u32temp = 0;
  6.     //uint16_t u16Color = 0xF800;   //16bit 565 红色
  7.  
  8.     u32temp = (1 << 17) | (1 << 8) | ((u16Color & 0xFF00) << 1) | ((u16Color & 0x00FF) << 1);   //增加D/Cx标识位
  9.     u32TxBuffer = SPI_SWAP_DATA_TX(u32temp,18);
  10.  
  11.  
  12.     ICNA3310_write_1R4D(0x2A, 0x00, 0x00, 0x01, 0x67);  // paritial update
  13.     ICNA3310_write_1R4D(0x2B, 0x00, 0x00, 0x01, 0x67);  // partial update
  14.     ICNA3310_write_1R0D(0x2C);
  15.  
  16.     devcfg.command_bits=0;   
  17.     ret=spi_bus_add_device(LCD_HOST, &devcfg, &spi);
  18.     ESP_ERROR_CHECK(ret);
  19.  
  20.     DM_CS(0);
  21.  
  22.     for(i=0; i<360; i++)
  23.     {
  24.         for(j=0; j<360; j++)
  25.     {
  26.             //发送data
  27.             memset(&sendcfg, 0, sizeof(sendcfg));  
  28.             sendcfg.length = 18;  
  29.         sendcfg.tx_buffer = &u32TxBuffer;          
  30.             ret=spi_device_polling_transmit(spi, &sendcfg);        
  31.             assert(ret==ESP_OK);  
  32.     }
  33.                
  34.     }  
  35.  
  36.     DM_CS(1);  
  37.  
  38. }

Re: ESP32S3 3Wire SPI 9bit,请教Transaction interval如何优化?

Posted: Sat Nov 19, 2022 2:44 am
by sapoiuyt
你好,我最近在驱动3线的SPI TFT屏也遇到了驱动问题,请问可以分享一下驱动文件吗?