在信号引脚上使用了
*NCS1
*CLK
*NCLK
*DQS0(这个引脚是作为RWDS)
*IO[0:7]
对于XSPI的配置如下:
[C] 纯文本查看 复制代码 void MX_XSPI1_Init(void)
{
/* USER CODE BEGIN XSPI1_Init 0 */
/* USER CODE END XSPI1_Init 0 */
XSPIM_CfgTypeDef sXspiManagerCfg = {0};
XSPI_HyperbusCfgTypeDef sHyperBusCfg = {0};
/* USER CODE BEGIN XSPI1_Init 1 */
/* USER CODE END XSPI1_Init 1 */
hxspi1.Instance = XSPI1;
hxspi1.Init.FifoThresholdByte = 1;
hxspi1.Init.MemoryMode = HAL_XSPI_SINGLE_MEM;
hxspi1.Init.MemoryType = HAL_XSPI_MEMTYPE_HYPERBUS;
hxspi1.Init.MemorySize = HAL_XSPI_SIZE_64MB;
hxspi1.Init.ChipSelectHighTimeCycle = 5;
hxspi1.Init.FreeRunningClock = HAL_XSPI_FREERUNCLK_DISABLE;
hxspi1.Init.ClockMode = HAL_XSPI_CLOCK_MODE_0;
hxspi1.Init.WrapSize = HAL_XSPI_WRAP_NOT_SUPPORTED;
hxspi1.Init.ClockPrescaler = 1;
hxspi1.Init.SampleShifting = HAL_XSPI_SAMPLE_SHIFT_NONE;
hxspi1.Init.DelayHoldQuarterCycle = HAL_XSPI_DHQC_ENABLE;
hxspi1.Init.ChipSelectBoundary = HAL_XSPI_BONDARYOF_NONE;
hxspi1.Init.MaxTran = 0;
hxspi1.Init.Refresh = 0;
hxspi1.Init.MemorySelect = HAL_XSPI_CSSEL_NCS1;
if (HAL_XSPI_Init(&hxspi1) != HAL_OK)
{
Error_Handler();
}
sXspiManagerCfg.nCSOverride = HAL_XSPI_CSSEL_OVR_NCS1;
sXspiManagerCfg.IOPort = HAL_XSPIM_IOPORT_1;
if (HAL_XSPIM_Config(&hxspi1, &sXspiManagerCfg, HAL_XSPI_TIMEOUT_DEFAULT_VALUE) != HAL_OK)
{
Error_Handler();
}
sHyperBusCfg.RWRecoveryTimeCycle = 4;
sHyperBusCfg.AccessTimeCycle = 7;
sHyperBusCfg.WriteZeroLatency = HAL_XSPI_LATENCY_ON_WRITE;
sHyperBusCfg.LatencyMode = HAL_XSPI_VARIABLE_LATENCY;
if (HAL_XSPI_HyperbusCfg(&hxspi1, &sHyperBusCfg, HAL_XSPI_TIMEOUT_DEFAULT_VALUE) != HAL_OK)
{
Error_Handler();
}
/* USER CODE BEGIN XSPI1_Init 2 */
/* USER CODE END XSPI1_Init 2 */
}
以及对于HyperBus的读、写以及内存映射函数如下:
[C] 纯文本查看 复制代码 void W956D8_Read(XSPI_HandleTypeDef *Ctx, uint8_t *pData, uint32_t ReadAddr, uint32_t Size)
{
XSPI_HyperbusCmdTypeDef sCommand;
sCommand.AddressSpace = HAL_XSPI_MEMORY_ADDRESS_SPACE;
sCommand.AddressWidth = HAL_XSPI_ADDRESS_32_BITS;
sCommand.Address = ReadAddr;
sCommand.DQSMode = HAL_XSPI_DQS_ENABLE;
sCommand.DataLength = Size;
sCommand.DataMode = HAL_XSPI_DATA_8_LINES;
if (HAL_XSPI_HyperbusCmd(Ctx, &sCommand, HAL_XSPI_TIMEOUT_DEFAULT_VALUE) != HAL_OK)
{
while(1);
}
HAL_StatusTypeDef ddr_s = HAL_XSPI_Receive(Ctx, pData, HAL_XSPI_TIMEOUT_DEFAULT_VALUE);
if (ddr_s != HAL_OK)
{
while(1);
}
return ;
}
void W956D8_Write(XSPI_HandleTypeDef *Ctx, uint8_t *pData, uint32_t WriteAddr, uint32_t Size)
{
XSPI_HyperbusCmdTypeDef sCommand;
sCommand.AddressSpace = HAL_XSPI_MEMORY_ADDRESS_SPACE;
sCommand.AddressWidth = HAL_XSPI_ADDRESS_32_BITS;
sCommand.Address = WriteAddr;
sCommand.DQSMode = HAL_XSPI_DQS_ENABLE;
sCommand.DataLength = Size;
sCommand.DataMode = HAL_XSPI_DATA_8_LINES;
if (HAL_XSPI_HyperbusCmd(Ctx, &sCommand, HAL_XSPI_TIMEOUT_DEFAULT_VALUE) != HAL_OK)
{
while(1);
}
if (HAL_XSPI_Transmit(Ctx, pData, HAL_XSPI_TIMEOUT_DEFAULT_VALUE) != HAL_OK)
{
while(1);
}
return ;
}
void W956D8_memory_mapped(XSPI_HandleTypeDef *Ctx)
{
XSPI_HyperbusCmdTypeDef sCommand;
XSPI_MemoryMappedTypeDef sMemMappedCfg;
sCommand.AddressSpace = HAL_XSPI_MEMORY_ADDRESS_SPACE;
sCommand.AddressWidth = HAL_XSPI_ADDRESS_32_BITS;
sCommand.Address = 0;
sCommand.DQSMode = HAL_XSPI_DQS_ENABLE;
sCommand.DataMode = HAL_XSPI_DATA_8_LINES;
sCommand.DataLength = 1;
if (HAL_XSPI_HyperbusCmd(Ctx, &sCommand, HAL_XSPI_TIMEOUT_DEFAULT_VALUE) != HAL_OK)
{
while(1);
}
sMemMappedCfg.TimeOutActivation = HAL_XSPI_TIMEOUT_COUNTER_DISABLE;
sMemMappedCfg.TimeoutPeriodClock = 0;
if (HAL_XSPI_MemoryMapped(Ctx, &sMemMappedCfg) != HAL_OK)
{
while(1);
}
return ;
}
最终实现效果如下:
|