硬汉嵌入式论坛

 找回密码
 立即注册
查看: 701|回复: 10
收起左侧

[STM32H7] STM32H7S7 XSPI与HyperRAM(W956D8MBYA5I)通信

[复制链接]

10

主题

50

回帖

80

积分

初级会员

积分
80
发表于 2025-2-9 23:16:56 | 显示全部楼层 |阅读模式
在信号引脚上使用了
  *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 ;
}


最终实现效果如下:
11.png
回复

使用道具 举报

10

主题

50

回帖

80

积分

初级会员

积分
80
 楼主| 发表于 2025-2-10 19:37:00 | 显示全部楼层
hpdell 发表于 2025-2-10 11:07
这个读写速度怎么样 ?

我测试了 读速度为 285MB/S 写速度为 296MB/S (在时钟150MHz下) 。这款新品最高是200MHz 我测试最高使用166MHz 再高读出来的数据就不对了,这里保守一点用了 150MHz。
回复

使用道具 举报

10

主题

50

回帖

80

积分

初级会员

积分
80
 楼主| 发表于 2025-2-11 09:06:32 | 显示全部楼层
本帖最后由 jet1999 于 2025-2-11 09:13 编辑

PCB layout 我做的也不是很好。主要是遵守了 单端阻抗50欧、信号线等长、线间距3W原则、以及一些过孔旁边主要放置地孔回流。 电路板是六层板( S G S P G S ) ,大部分线都放置在顶层,只有 NCS 和 CLK以及NCLK 放置在第三层。

顶层

顶层

第三层

第三层
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115434
QQ
发表于 2025-2-10 06:17:52 | 显示全部楼层
谢谢分享。
回复

使用道具 举报

6

主题

231

回帖

249

积分

高级会员

积分
249
发表于 2025-2-10 08:45:41 | 显示全部楼层
谢谢分享,刚好这个RAM芯片在LC商城也有货。
回复

使用道具 举报

10

主题

50

回帖

80

积分

初级会员

积分
80
 楼主| 发表于 2025-2-10 09:03:05 | 显示全部楼层
fxyc87 发表于 2025-2-10 08:45
谢谢分享,刚好这个RAM芯片在LC商城也有货。

哈哈 我就是jlc打板的 除了 主控芯片 jlc没有 别的物料都是从jlc选的
回复

使用道具 举报

677

主题

3460

回帖

5516

积分

论坛元老

积分
5516
发表于 2025-2-10 11:07:45 | 显示全部楼层
这个读写速度怎么样 ?
回复

使用道具 举报

10

主题

50

回帖

80

积分

初级会员

积分
80
 楼主| 发表于 2025-2-10 11:44:11 | 显示全部楼层
hpdell 发表于 2025-2-10 11:07
这个读写速度怎么样 ?

不好意思 最近开学了 还没时间测 有时间我会测一下 回复您
回复

使用道具 举报

6

主题

231

回帖

249

积分

高级会员

积分
249
发表于 2025-2-10 20:58:43 | 显示全部楼层
jet1999 发表于 2025-2-10 19:37
我测试了 读速度为 285MB/S 写速度为 296MB/S (在时钟150MHz下) 。这款新品最高是200MHz 我测试最高使用 ...

150M已经很快了,方便的话发个PCB布局,我学习下。
我上次的STM32H723在30M的时候波形已经不成样子了,可能是芯片布的太远了。
回复

使用道具 举报

10

主题

50

回帖

80

积分

初级会员

积分
80
 楼主| 发表于 2025-2-11 00:06:14 来自手机 | 显示全部楼层
fxyc87 发表于 2025-2-10 20:58
150M已经很快了,方便的话发个PCB布局,我学习下。
我上次的STM32H723在30M的时候波形已经不成样子了, ...

不好意思才看到消息 明天吧
回复

使用道具 举报

0

主题

1

回帖

1

积分

新手上路

积分
1
发表于 2025-4-18 15:52:27 | 显示全部楼层
主函数里面怎么调用的,是不是用了地址映射函数,读写那两个函数就不能用,我进去debug,跑到HyperRAM部分直接给我踢出来了断开连接
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2025-4-26 02:05 , Processed in 0.294719 second(s), 30 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表