本帖最后由 mouse 于 2019-8-6 11:26 编辑
楼主好!
我在smt32f446re 单片机上使用IPS6404时碰到问题,QSPI只支持2 LINE 方式,没有4 LINE,所以将QSPI设置工作在1 LINE模式,现在能正常读写IPS6404数据,但是有个问题,在连续读数据的时候,中间会有停顿。例如:读50字节,读到4微秒左右时,会停顿2us左右,然出来4个字节,再停顿2us,再出来4字节,再停顿2us , 如此循环。不知道什么原因导致的。
单片机主时钟180Mhz,IPS6404 clock为90Mhz。
代码参照楼主发的代码,连续读函数如下:
App_StatusStructType QSPI_PSRAM_ReadPage(QSPI_HandleTypeDef *hQspi,uint8_t *pData,uint32_t FirstAddr, uint32_t BufSize)
{
QSPI_CommandTypeDef sCommand;
/* Reading Sequence ------------------------------------------------ */
sCommand.Instruction = FAST_READ_CMD; //0x0B
sCommand.InstructionMode = QSPI_INSTRUCTION_1_LINE;
sCommand.AddressMode = QSPI_ADDRESS_1_LINE; //
sCommand.AddressSize = QSPI_ADDRESS_24_BITS;
sCommand.Address = FirstAddr;
sCommand.AlternateByteMode = QSPI_ALTERNATE_BYTES_NONE;
sCommand.DataMode = QSPI_DATA_1_LINE;
sCommand.NbData = BufSize; //ID Size
sCommand.DummyCycles = DUMMY_CLOCK_CYCLES_READ;
sCommand.DdrMode = QSPI_DDR_MODE_DISABLE;
sCommand.DdrHoldHalfCycle = QSPI_DDR_HHC_ANALOG_DELAY;
sCommand.SIOOMode = QSPI_SIOO_INST_EVERY_CMD;
if (HAL_QSPI_Command(hQspi, &sCommand, HAL_QPSI_TIMEOUT_DEFAULT_VALUE) != HAL_OK)
{
return ERROR_QSPI_PSRAM_READ;
}
if (HAL_QSPI_Receive(hQspi, pData, HAL_QPSI_TIMEOUT_DEFAULT_VALUE) != HAL_OK)
{
return ERROR_QSPI_PSRAM_READ;
}
return OK;
}
QSPI初始:
void MX_QUADSPI_Init(void)
{
hqspi.Instance = QUADSPI;
hqspi.Init.ClockPrescaler = 2-1;
hqspi.Init.FifoThreshold = 4;
hqspi.Init.SampleShifting = QSPI_SAMPLE_SHIFTING_NONE;
hqspi.Init.FlashSize = 23-1;
hqspi.Init.ChipSelectHighTime = QSPI_CS_HIGH_TIME_2_CYCLE;
hqspi.Init.ClockMode = QSPI_CLOCK_MODE_0;
hqspi.Init.FlashID = QSPI_FLASH_ID_1;
hqspi.Init.DualFlash = QSPI_DUALFLASH_DISABLE;
if (HAL_QSPI_Init(&hqspi) != HAL_OK)
{
Error_Handler();
}
}
抓取的波形,黄色是clock,另一颜色是CS (请忽略CS信号中的低电平的示波器串扰,单独量CS信号是没问题的)。
谢谢!
|