乐鑫技术交流
直播中

一曲作罢

9年用户 806经验值
擅长:可编程逻辑 电源/新能源 MEMS/传感技术
私信 关注
[问答]

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

遇到的问题:
       应用于LCD显示,向LCD传输360x360个16bit数据。 每个16bit数据扩展成18bit(9+9)数据,通过3Wire SPI 传输。
按目前的理解,受限于数据编码(无法在连续的8bit中进行数据编码),只能每18bit或者27bit执行一次发送事务。
在一次发送事务中,Transaction interval大约占了94.5%(20MHz SCLK见下图)。
请问Transaction interval是否可以优化? 如何优化?
                                                                                                                                                
1、SPI配置

  • void SPI_3Wire_Interface_Init(  esp_err_t* ret,
  •                                 spi_device_handle_t* spi,
  •                                 spi_bus_config_t* buscfg,
  •                                 spi_device_interface_config_t* devcfg)
  • {
  •     buscfg->miso_io_num=-1;
  •     buscfg->mosi_io_num=PIN_NUM_SPI_3WIRE_SDA_IO;
  •     buscfg->sclk_io_num=PIN_NUM_SPI_3WIRE_SCLK_O;
  •     buscfg->quadwp_io_num=-1;
  •     buscfg->quadhd_io_num=-1;
  •     //buscfg.data4_io_num=-1;
  •     //buscfg.data5_io_num=-1;
  •     //buscfg.data6_io_num=-1;
  •     //buscfg.data7_io_num=-1;
  •     buscfg->max_transfer_sz=xSPI_Max_transfer_size;
  •     buscfg->flags=SPICOMMON_BUSFLAG_DUAL;
  •     //buscfg.intr_flags=;   

  •     devcfg->command_bits=1;
  •     //devcfg.address_bits=24;
  •     //devcfg.dummy_bits=;
  •     devcfg->mode=xSPI_CPOL_CPHA_mode;   //CPOL, CPHA   
  •     //devcfg.duty_cycle_pos;   
  •     //devcfg.cs_ena_pretrans;
  •     //devcfg.cs_ena_posttrans;
  •     devcfg->clock_speed_hz=xSPI_Clock_Speed_For_DM_Initial;
  •     //devcfg.input_delay_ns=;
  •     //devcfg->spics_io_num=PIN_NUM_SPI_4WIRE_2_CS_O;   
  •     devcfg->flags=SPI_DEVICE_3WIRE | SPI_DEVICE_HALFDUPLEX;
  •     devcfg->queue_size=7;
  •     //*devcfg.pre_cb=RS_transfer_callback;  //D/C(RS)处理
  •     //devcfg.post_cb=;

  •     //Initialize the SPI bus
  •     *ret=spi_bus_initialize(LCD_HOST, buscfg, SPI_DMA_CH_AUTO);
  •     ESP_ERROR_CHECK(*ret);
  •     //Attach the LCD to the SPI bus
  •     *ret=spi_bus_add_device(LCD_HOST, devcfg, spi);
  •     ESP_ERROR_CHECK(*ret);
  • }


  • void DM_Display_Color(uint16_t u16Color)
  • {
  •     uint32_t i,j= 0;
  •     uint32_t u32TxBuffer = 0;
  •     uint32_t u32temp = 0;
  •     //uint16_t u16Color = 0xF800;   //16bit 565 红色

  •     u32temp = (1 << 17) | (1 << 8) | ((u16Color & 0xFF00) << 1) | ((u16Color & 0x00FF) << 1);   //增加D/Cx标识位
  •     u32TxBuffer = SPI_SWAP_DATA_TX(u32temp,18);


  •     ICNA3310_write_1R4D(0x2A, 0x00, 0x00, 0x01, 0x67);  // paritial update
  •     ICNA3310_write_1R4D(0x2B, 0x00, 0x00, 0x01, 0x67);  // partial update
  •     ICNA3310_write_1R0D(0x2C);

  •     devcfg.command_bits=0;
  •     ret=spi_bus_add_device(LCD_HOST, &devcfg, &spi);
  •     ESP_ERROR_CHECK(ret);

  •     DM_CS(0);

  •     for(i=0; i<360; i++)
  •     {
  •         for(j=0; j<360; j++)
  •     {
  •             //发送data
  •             memset(&sendcfg, 0, sizeof(sendcfg));
  •             sendcfg.length = 18;
  •         sendcfg.tx_buffer = &u32TxBuffer;
  •             ret=spi_device_polling_transmit(spi, &sendcfg);
  •             assert(ret==ESP_OK);
  •     }

  •     }

  •     DM_CS(1);

  • }



回帖(1)

王磊

2024-6-13 17:27:13
Transaction interval(事务间隔)是指在SPI通信中,两个连续事务之间的时间间隔。在您的情况下,由于数据编码的限制,每个事务只能传输18bit或27bit数据。要优化Transaction interval,我们可以尝试以下方法:

1. **提高时钟频率**:提高SPI时钟频率(SCLK)可以减少每个事务所需的时间,从而减少事务间隔。但是,这可能会受到硬件和通信协议的限制。

2. **减少事务间隔时间**:检查SPI控制器的配置,看看是否有可能减少事务间隔时间。这可能需要调整SPI控制器的寄存器设置。

3. **使用DMA(Direct Memory Access)**:使用DMA可以减少CPU在数据传输过程中的干预,从而提高数据传输效率。这可以减少事务间隔时间,因为DMA可以在不需要CPU干预的情况下自动处理数据传输。

4. **优化数据编码**:尝试寻找一种更高效的数据编码方法,以便在每个事务中传输更多的数据。这可能需要对现有的数据编码方法进行修改或寻找新的编码方案。

5. **使用双缓冲技术**:通过使用双缓冲技术,可以在一个缓冲区进行数据传输的同时,另一个缓冲区进行数据处理。这样,在事务间隔期间,CPU可以处理另一个缓冲区的数据,从而减少事务间隔时间。

6. **调整事务大小**:如果可能的话,尝试调整事务大小,以便在每个事务中传输更多的数据。这可能需要修改SPI通信协议或硬件设计。

7. **软件优化**:优化软件算法,减少在事务间隔期间的CPU计算和等待时间。这可以通过减少循环、条件判断和函数调用等方法实现。

请注意,这些优化方法可能需要对硬件和软件进行调整,因此在实施之前,请确保与硬件供应商和开发团队进行充分沟通。
举报

更多回帖

×
20
完善资料,
赚取积分