硬汉嵌入式论坛

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

STM32FCC29读取SRAM错误

[复制链接]

3

主题

22

回帖

31

积分

新手上路

积分
31
发表于 2019-7-27 14:53:43 | 显示全部楼层 |阅读模式
我使用STM32F429读取一个专用协议芯片,这个芯片接口类似于SRAM,使用FMC接口读取数据,现在发现读取时10次数据就会大概有一次错误,错误现象是,地址增加后和上一个地址读取的数据相同,我使用的是16bit的数据位宽,比如60000000这个地址存储的是0x12345678,错误的时候读取的是0x12341234,每次的错误现象都一样。这个会是什么问题。再有429的FMC的WAIT信号怎么才能起作用,在读取SRAM的时候。我的外部专用芯片连接了这个管脚,但是感觉没有起作用,会是这个问题吗??谢谢指教
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115667
QQ
发表于 2019-7-27 18:17:03 | 显示全部楼层
驱动并口NOR用到WAIT信号。

你当前这种情况的话,适当调整下FMC时序看看
回复

使用道具 举报

3

主题

22

回帖

31

积分

新手上路

积分
31
 楼主| 发表于 2019-7-27 21:30:50 | 显示全部楼层
我调整了时序,但是一直也没有得到一个满意的结果,总是会有错误,这个现象会是硬件问题吗?我感觉还是软件哪块没配置对吧
回复

使用道具 举报

3

主题

22

回帖

31

积分

新手上路

积分
31
 楼主| 发表于 2019-7-27 21:32:07 | 显示全部楼层
FMC_NORSRAM_TimingTypeDef Timing;

  /** Perform the SRAM1 memory initialization sequence
  */
  hsram1.Instance = FMC_NORSRAM_DEVICE;
  hsram1.Extended = FMC_NORSRAM_EXTENDED_DEVICE;
  /* hsram1.Init */
  hsram1.Init.NSBank = FMC_NORSRAM_BANK1;
  hsram1.Init.DataAddressMux = FMC_DATA_ADDRESS_MUX_DISABLE;//1رÕμØÖ·êy¾Y¸′óÃ
  hsram1.Init.MemoryType = FMC_MEMORY_TYPE_SRAM;
  hsram1.Init.MemoryDataWidth = FMC_NORSRAM_MEM_BUS_WIDTH_16;
  
        hsram1.Init.BurstAccessMode = FMC_BURST_ACCESS_MODE_DISABLE; // 1رÕBurstÄ£ê½
  hsram1.Init.WaitSignalPolarity = FMC_WAIT_SIGNAL_POLARITY_LOW;//μè′yDÅoÅóÅÏè¼¶£¬Ö»óDÔúburstÄ£ê½ÏÂóDóÃ
  hsram1.Init.WrapMode = FMC_WRAP_MODE_DISABLE; //μè′yDÅoÅéèÖã¬Ö»óDÔúburstÄ£ê½2ÅÆe×÷óÃ
  hsram1.Init.WaitSignalActive = FMC_WAIT_TIMING_BEFORE_WS;  
  
        hsram1.Init.WriteOperation = FMC_WRITE_OPERATION_ENABLE;
        hsram1.Init.WaitSignal = FMC_WAIT_SIGNAL_DISABLE;
  
        hsram1.Init.ExtendedMode = FMC_EXTENDED_MODE_DISABLE;
  hsram1.Init.AsynchronousWait = FMC_ASYNCHRONOUS_WAIT_ENABLE;//êÇ·ñê1Äüòì2½′«êäμè′yDÅoÅ
  hsram1.Init.WriteBurst = FMC_WRITE_BURST_DISABLE;
  hsram1.Init.ContinuousClock = FMC_CONTINUOUS_CLOCK_SYNC_ONLY;
  hsram1.Init.PageSize = FMC_PAGE_SIZE_NONE;
  /* Timing */
  Timing.AddressSetupTime = 15;//15 //μØÖ·½¨á¢ê±¼äÎa16¸öHCLK  1/180=5.5nsx16=88ns
  Timing.AddressHoldTime = 15;//15//μØÖ·±£3Ö걼䣬ģê½AûóDóÃμ½
  Timing.DataSetupTime = 40;//255 //êy¾Y±£3Öê±¼ä 60*5.5=330ns
  Timing.BusTurnAroundDuration = 15;//15
  Timing.CLKDivision = 2;//16
  Timing.DataLatency = 2;//17
  Timing.AccessMode = FMC_ACCESS_MODE_A;
  /* ExtTiming */

  if (HAL_SRAM_Init(&hsram1, &Timing, NULL) != HAL_OK)
  {
    Error_Handler( );
  }
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115667
QQ
发表于 2019-7-28 00:49:51 | 显示全部楼层
lyhawk2007 发表于 2019-7-27 21:32
FMC_NORSRAM_TimingTypeDef Timing;

  /** Perform the SRAM1 memory initialization sequence

方便的话,把你这部分的接线图和GPIO的配置发下。
回复

使用道具 举报

3

主题

22

回帖

31

积分

新手上路

积分
31
 楼主| 发表于 2019-7-28 14:06:02 | 显示全部楼层
static void HAL_FMC_MspInit(void){
  /* USER CODE BEGIN FMC_MspInit 0 */

  /* USER CODE END FMC_MspInit 0 */
  GPIO_InitTypeDef GPIO_InitStruct;
  if (FMC_Initialized) {
    return;
  }
  FMC_Initialized = 1;
  /* Peripheral clock enable */
  __HAL_RCC_FMC_CLK_ENABLE();
  
  /** FMC GPIO Configuration  
  PF0   ------> FMC_A0
  PF1   ------> FMC_A1
  PF2   ------> FMC_A2
  PF3   ------> FMC_A3
  PF4   ------> FMC_A4
  PF5   ------> FMC_A5
  PF12   ------> FMC_A6
  PF13   ------> FMC_A7
  PF14   ------> FMC_A8
  PF15   ------> FMC_A9
  PG0   ------> FMC_A10
  PG1   ------> FMC_A11
  PE7   ------> FMC_D4
  PE8   ------> FMC_D5
  PE9   ------> FMC_D6
  PE10   ------> FMC_D7
  PE11   ------> FMC_D8
  PE12   ------> FMC_D9
  PE13   ------> FMC_D10
  PE14   ------> FMC_D11
  PE15   ------> FMC_D12
  PD8   ------> FMC_D13
  PD9   ------> FMC_D14
  PD10   ------> FMC_D15
  PD11   ------> FMC_A16
  PD12   ------> FMC_A17
  PD13   ------> FMC_A18
  PD14   ------> FMC_D0
  PD15   ------> FMC_D1
  PG2   ------> FMC_A12
  PG3   ------> FMC_A13
  PG4   ------> FMC_A14
  PG5   ------> FMC_A15
  PD0   ------> FMC_D2
  PD1   ------> FMC_D3
  PD4   ------> FMC_NOE
  PD5   ------> FMC_NWE
  PD6   ------> FMC_NWAIT
  PD7   ------> FMC_NE1
  PG9   ------> FMC_NE2
  PE0   ------> FMC_NBL0
  PE1   ------> FMC_NBL1
  */
  GPIO_InitStruct.Pin = GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3
                          |GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_12|GPIO_PIN_13
                          |GPIO_PIN_14|GPIO_PIN_15;
  GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
  GPIO_InitStruct.Pull = GPIO_NOPULL;
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
  GPIO_InitStruct.Alternate = GPIO_AF12_FMC;
  HAL_GPIO_Init(GPIOF, &GPIO_InitStruct);

  GPIO_InitStruct.Pin = GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3
                          |GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_9;
  GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
  GPIO_InitStruct.Pull = GPIO_NOPULL;
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
  GPIO_InitStruct.Alternate = GPIO_AF12_FMC;
  HAL_GPIO_Init(GPIOG, &GPIO_InitStruct);

  GPIO_InitStruct.Pin = GPIO_PIN_7|GPIO_PIN_8|GPIO_PIN_9|GPIO_PIN_10
                          |GPIO_PIN_11|GPIO_PIN_12|GPIO_PIN_13|GPIO_PIN_14
                          |GPIO_PIN_15|GPIO_PIN_0|GPIO_PIN_1;
  GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
  GPIO_InitStruct.Pull = GPIO_NOPULL;
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
  GPIO_InitStruct.Alternate = GPIO_AF12_FMC;
  HAL_GPIO_Init(GPIOE, &GPIO_InitStruct);

  GPIO_InitStruct.Pin = GPIO_PIN_8|GPIO_PIN_9|GPIO_PIN_10|GPIO_PIN_11
                          |GPIO_PIN_12|GPIO_PIN_13|GPIO_PIN_14|GPIO_PIN_15
                          |GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_4|GPIO_PIN_5
                          |GPIO_PIN_7|GPIO_PIN_6;
  GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
  GPIO_InitStruct.Pull = GPIO_NOPULL;
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
  GPIO_InitStruct.Alternate = GPIO_AF12_FMC;
  HAL_GPIO_Init(GPIOD, &GPIO_InitStruct);

  /* USER CODE BEGIN FMC_MspInit 1 */

  /* USER CODE END FMC_MspInit 1 */
}
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115667
QQ
发表于 2019-7-29 07:59:20 | 显示全部楼层
降低GPIO的速度等级试试。
回复

使用道具 举报

3

主题

22

回帖

31

积分

新手上路

积分
31
 楼主| 发表于 2019-7-29 10:10:25 | 显示全部楼层
本帖最后由 lyhawk2007 于 2019-7-29 10:11 编辑

file:///C:/Users/Administrator/Desktop/%E5%BE%AE%E4%BF%A1%E5%9B%BE%E7%89%87_20190729093548.jpg

时序图

时序图
回复

使用道具 举报

3

主题

22

回帖

31

积分

新手上路

积分
31
 楼主| 发表于 2019-7-29 10:14:57 | 显示全部楼层
通过波形分析,我发现错误的时候,是WAIT信号没处理,类似SRAM的芯片有一个RADY管脚,图中的D4信号,D0信号XRD,D1信号XWR,D2信号是片选NE1,D3信号片选NE2,D4信号是XRDY,D5信号是数据的D4位
回复

使用道具 举报

3

主题

22

回帖

31

积分

新手上路

积分
31
 楼主| 发表于 2019-7-29 10:16:16 | 显示全部楼层
如何让STM32在RDY信号没准备好时,增加读取延时,我感觉我配置的异步等待信号似乎没好用
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-5-10 23:47 , Processed in 0.503771 second(s), 27 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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