|
本帖最后由 hpdell 于 2024-6-29 21:39 编辑
请教下, h7 的 qspi 使用 2片 mt25ql256 组合成8bit 的, 貌似读写失败 ?
原理图:
软件配置:
int bsp_qspi_quad_mt25ql256a(void)
{
uint8_t buf[23] = {0}, val;
__QSPI_CLK_ENABLE();
QSPI_Handle.Instance = QUADSPI;
/* 设置时钟速度,QSPI clock = 240MHz / (ClockPrescaler+1) = 120MHz */
QSPI_Handle.Init.ClockPrescaler = 1;
QSPI_Handle.Init.FifoThreshold = 1;
QSPI_Handle.Init.SampleShifting = QSPI_SAMPLE_SHIFTING_HALFCYCLE;
/*Flash大小是2^(FlashSize + 1) = 2^26 = 64MB */
QSPI_Handle.Init.FlashSize = QSPI_FLASH_SIZE; //25;
QSPI_Handle.Init.ChipSelectHighTime = QSPI_CS_HIGH_TIME_6_CYCLE;
QSPI_Handle.Init.ClockMode = QSPI_CLOCK_MODE_0;
/* 启用了双片 , 这里需要启动双片功能 */
QSPI_Handle.Init.DualFlash = QSPI_DUALFLASH_ENABLE;
if (HAL_QSPI_Init(&QSPI_Handle) != HAL_OK) // 这个 HAL_QSPI_MspInit 函数被 HAL_QSPI_Init 所调用
{
return 2;
}
HAL_Delay(50);
}
/**
* @brief This function put QSPI memory in QPI mode (quad I/O).
* @param hqspi: QSPI handle
* @retval None
*/
static QSPI_StaticTypeDef QSPI_EnterMemory_QPI( QSPI_HandleTypeDef *hqspi )
{
int i;
QSPI_CommandTypeDef s_command = {0};
/* Initialize the QPI enable command */
/* QSPI memory is supported to be in SPI mode, so CMD on 1 LINE */
s_command.InstructionMode = QSPI_INSTRUCTION_1_LINE;
s_command.Instruction = ENTER_QUAD_CMD;
s_command.AddressMode = QSPI_ADDRESS_NONE;
s_command.AlternateByteMode = QSPI_ALTERNATE_BYTES_NONE;
s_command.DataMode = QSPI_DATA_NONE;
s_command.DummyCycles = 0;
s_command.DdrMode = QSPI_DDR_MODE_DISABLE;
s_command.DdrHoldHalfCycle = QSPI_DDR_HHC_ANALOG_DELAY;
s_command.SIOOMode = QSPI_SIOO_INST_EVERY_CMD;
/* Send the command */
if (HAL_QSPI_Command(hqspi, &s_command, HAL_QPSI_TIMEOUT_DEFAULT_VALUE) != HAL_OK)
{
return QSPI_ERROR;
}
for(i=0;i<0xfff;i++) {} // 简短延时,等待芯片内部工作稳定,对于 MT25QL256ABA1EW9-0SIT 可以不使用
}
QSPI_StaticTypeDef QSPI_WritePageByte(uint8_t * _pBuf, uint32_t _uiWriteAddr, uint32_t _size)
{
QSPI_StaticTypeDef res;
QSPI_CommandTypeDef sCommand = {0};
if (QSPI_WriteEnable(&QSPI_Handle) != QSPI_OK)
{
return QSPI_ERROR;
}
/* 基本配置 */
sCommand.InstructionMode = QSPI_INSTRUCTION_4_LINES; /* 4线方式发送指令 */
sCommand.AddressSize = QSPI_ADDRESS_32_BITS; /* 32位地址 */
sCommand.AlternateByteMode = QSPI_ALTERNATE_BYTES_NONE; /* 无交替字节 */
sCommand.DdrMode = QSPI_DDR_MODE_DISABLE; /* 不支持DDR */
sCommand.DdrHoldHalfCycle = QSPI_DDR_HHC_ANALOG_DELAY; /* DDR模式,数据输出延迟 */
sCommand.SIOOMode = QSPI_SIOO_INST_ONLY_FIRST_CMD; /* 仅发送一次命令 */
/* 写序列配置 */
sCommand.Instruction = QUAD_IN_FAST_PROG_4_BYTE_ADDR_CMD; /* 32bit地址的4线快速写入命令 */
sCommand.DummyCycles = 0; /* 不需要空周期 */
sCommand.AddressMode = QSPI_ADDRESS_4_LINES; /* 4线地址方式 */
sCommand.DataMode = QSPI_DATA_4_LINES; /* 4线数据方式 */
sCommand.NbData = _size; /* 写数据大小 */
sCommand.Address = _uiWriteAddr; /* 写入地址 */
if (HAL_QSPI_Command(&QSPI_Handle, &sCommand, HAL_QPSI_TIMEOUT_DEFAULT_VALUE) != HAL_OK)
{
return QSPI_ERROR;
}
if (HAL_QSPI_Transmit(&QSPI_Handle, (uint8_t *)_pBuf, HAL_QPSI_TIMEOUT_DEFAULT_VALUE) != HAL_OK)
{
return QSPI_ERROR;
}
res = QSPI_AutoPollingMemReady(&QSPI_Handle);
if (res != QSPI_OK)
{
return res;
}
return QSPI_OK;
}
//----------------------------------------------------------------------------------------------------
目前有几点疑问:
01. 关于 接口是 组成 8bit 的, 单片 qspi 芯片接口是 4bit, mcu 内部是吧一个 8bit 字节的数据自动分成 2组 4bit 进行发送吗 ?
sCommand.AddressMode = QSPI_ADDRESS_4_LINES; /* 4线地址方式 */
sCommand.DataMode = QSPI_DATA_4_LINES; /* 4线数据方式 */
02. mcu 在数据接收时也是自动的吧 2片 qspi 的 4bit 数据进行组合成 8bit 的数据吗 ?
03. 2片 4bit 的32MB 大小的芯片, 组合成 8bit 的 64MB 大小, 那
QSPI_Handle.Init.FlashSize = QSPI_FLASH_SIZE; 这个地方是设置为 32MB 还是 64MB 呢 ???
|
|