OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 6722|回复: 3

stm32f407ZGT6 FSMC驱动外部SRAM(XM8A51216)写入数据异常(一个数据会往两个地址写入)

[复制链接]

80

主题

268

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
441
金钱
441
注册时间
2014-8-11
在线时间
84 小时
发表于 2021-7-13 14:19:36 | 显示全部楼层 |阅读模式
50金钱
本帖最后由 战舰水手 于 2021-7-13 14:19 编辑

外部SRAM引脚驱动

外部SRAM引脚驱动


上图为外部SRAM引脚驱动图,地址线A0-A18是对应连接(正点原子例程不是对应连接)
主控芯片:stm32f407ZGT6
HAL库版本:  version V1.4.2    @date    10-November-2015(正点原子STM32F429的提供的HAL库版本)
  1. //SRAM驱动
  2. void SRAM_Init(void)
  3. {        
  4.         GPIO_InitTypeDef GPIO_Initure;
  5.         FSMC_NORSRAM_TimingTypeDef FSMC_ReadWriteTim;
  6.         
  7.         XmRamInit();                //XMRAM 20191024
  8.         delay_us(100);
  9.    
  10.     __HAL_RCC_FSMC_CLK_ENABLE();//使能时钟
  11.     __HAL_RCC_GPIOD_CLK_ENABLE();
  12.     __HAL_RCC_GPIOE_CLK_ENABLE();
  13.     __HAL_RCC_GPIOF_CLK_ENABLE();
  14.     __HAL_RCC_GPIOG_CLK_ENABLE();
  15.    
  16.     //引脚配置
  17.         //PD0,1,4,5,8~15
  18.     GPIO_Initure.Pin=GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_8|\
  19.                                          GPIO_PIN_9|GPIO_PIN_10|GPIO_PIN_11|GPIO_PIN_12|GPIO_PIN_13|\
  20.                                          GPIO_PIN_14|GPIO_PIN_15;              
  21.         GPIO_Initure.Mode=GPIO_MODE_AF_PP;
  22.     GPIO_Initure.Pull==GPIO_PULLUP;
  23.     GPIO_Initure.Speed=GPIO_SPEED_HIGH;
  24.     GPIO_Initure.Alternate=GPIO_AF12_FSMC; //复用为FSMC
  25.         HAL_GPIO_Init(GPIOD,&GPIO_Initure);            
  26.    
  27.         //PE0,1,7~15
  28.     GPIO_Initure.Pin=GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_7|GPIO_PIN_8|GPIO_PIN_9|\
  29.                                          GPIO_PIN_10| GPIO_PIN_11|GPIO_PIN_12|GPIO_PIN_13|GPIO_PIN_14|\
  30.                                          GPIO_PIN_15;              
  31.     HAL_GPIO_Init(GPIOE,&GPIO_Initure);   
  32.    
  33.         //PF0~5,12~15
  34.     GPIO_Initure.Pin=GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3|GPIO_PIN_4|\
  35.                                          GPIO_PIN_5|GPIO_PIN_12|<font color="Red">GPIO_PIN_13</font>|GPIO_PIN_14|GPIO_PIN_15;              
  36.     HAL_GPIO_Init(GPIOF,&GPIO_Initure);     
  37.    
  38.         //PG0~5,10
  39.     GPIO_Initure.Pin=GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3|GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_10;              
  40.     HAL_GPIO_Init(GPIOG,&GPIO_Initure);
  41.                
  42.         //HAL_GPIO_WritePin(GPIOG,GPIO_PIN_10,GPIO_PIN_SET);
  43.         
  44.         SRAM_Handler.Instance=FSMC_NORSRAM_DEVICE;               
  45.         SRAM_Handler.Extended=FSMC_NORSRAM_EXTENDED_DEVICE;   
  46.    
  47.         SRAM_Handler.Init.NSBank=FSMC_NORSRA;
  48.         SRAM_Handler.Init.DataAddressMux=FSMC_DATA_ADDRESS_MUX_DISABLE;
  49.         SRAM_Handler.Init.MemoryType=FSMC_MEMORY_TYPE_SRAM;                                   //SRAM
  50.         SRAM_Handler.Init.MemoryDataWidth=FSMC_NORSRAM_MEM_BUS_WIDTH_16;//16位
  51.         SRAM_Handler.Init.BurstAccessMode=FSMC_BURST_ACCESS_MODE_DISABLE;
  52.         SRAM_Handler.Init.WaitSignalPolarity=FSMC_WAIT_SIGNAL_POLARITY_LOW;
  53.         SRAM_Handler.Init.WrapMode = FSMC_WRAP_MODE_DISABLE;
  54.         SRAM_Handler.Init.WaitSignalActive=FSMC_WAIT_TIMING_BEFORE_WS;
  55.         SRAM_Handler.Init.WriteOperation=FSMC_WRITE_OPERATION_ENABLE;
  56.         SRAM_Handler.Init.WaitSignal=FSMC_WAIT_SIGNAL_DISABLE;
  57.         SRAM_Handler.Init.ExtendedMode=FSMC_EXTENDED_MODE_DISABLE;
  58.         SRAM_Handler.Init.AsynchronousWait=FSMC_ASYNCHRONOUS_WAIT_DISABLE;
  59.         SRAM_Handler.Init.WriteBurst=FSMC_WRITE_BURS;
  60.         //SRAM_Handler.Init.ContinuousClock=FSMC_CONTINUOUS_CLOCK_SYNC_ASYNC;<font color="Red">//我用的HAL库版本不支持该参数,所以注释掉了</font>
  61.    
  62.         //FMC
  63.         FSMC_ReadWriteTim.AddressSetupTime=0x00;
  64.         FSMC_ReadWriteTim.AddressHoldTime=0x00;
  65.         FSMC_ReadWriteTim.DataSetupTime=0x08;                        //数据保持时间
  66.         FSMC_ReadWriteTim.BusTurnAroundDuration=0X00;
  67.         FSMC_ReadWriteTim.CLKDivision=0x00;
  68.         FSMC_ReadWriteTim.DataLatency=0x00;
  69.         FSMC_ReadWriteTim.AccessMode=FSMC_ACCESS_MODE_A;
  70.         HAL_SRAM_Init(&SRAM_Handler,&FSMC_ReadWriteTim,&FSMC_ReadWriteTim);        

  71. }


  72. void FSMC_SRAM_WriteBuffer(u8 *pBuffer,u32 WriteAddr,u32 n)
  73. {
  74.         for(;n!=0;n--)
  75.         {
  76.                 *(vu8*)(Bank1_SRAM3_ADDR+WriteAddr)=*pBuffer;
  77.                 WriteAddr++;
  78.                 pBuffer++;
  79.         }
  80. }


  81. void FSMC_SRAM_ReadBuffer(u8 *pBuffer,u32 ReadAddr,u32 n)
  82. {
  83.         for(;n!=0;n--)
  84.         {
  85.                 *pBuffer++=*(vu8*)(Bank1_SRAM3_ADDR+ReadAddr);
  86.                 ReadAddr++;
  87.         }
  88. }
复制代码

测试
    check_buf=(u8*)mymalloc(SRAMIN,200);//申请内部内存,申请到的内存首地址为0x680EFF20

    data_buf=(u8*)mymalloc(SRAMEX,200);//申请外部内存
    for(temp=0;temp<200;temp++)//向data_buf写入200个字节
    {
        data_buf[temp]=temp;
    }
    FSMC_SRAM_ReadBuffer(check_buf,(u32)data_buf-Bank1_SRAM3_ADDR,200);//读出外部内存对应地址的50个数据

单步调试跟踪data_buf

外部内存数据调试

外部内存数据调试

for循环内向外部内存地址0x680EFF20开始写入0x00 0x01 0x02.....,单步调试发现往0x680EFF20写入0x00时0x680EFFA0也会写入0x00,往0x680EFF21写入0x01时0x680EFFA1也会写入0x01...,
也就是一个数据会往两个地址写
这两个首地址的关系:0x680EFFA0-0x680EFF20=0x80(1000 0000B)

这时候我怀疑是地址线有问题(因为数据写入的值是对的,调用FSMC_SRAM_ReadBuffer发现读出的数据也是对的)
之后我把FSMC中对地址线A7(PF13,1000 0000B(A7:A0)两个首地址(0x680EFFA0、0x680EFF20)的差值正好对应)的初始化屏蔽了,发现结果与调试结果一致,说明主控芯片对外部SRAM地址A7的控制出现了异常
我测量了下物理连接没啥问题,走线和其它地址线都是平行走线
我跑了下ALIENTEK 探索者 STM32F407 开发板的外部SRAM实验发现结果也是一样的
是不是这个国产存储芯片XM8A51216不良(从正点原子淘宝买的)
另外FSMC初始化中 XmRamInit()是直接白嫖原子的

期间我还怀疑是读写时序有点问题,于是在FSMC初始化中我将 FSMC_ReadWriteTim.DataSetupTime参数设置成0x06 0x08 0x0a,发现都是一样的,但是设置的值过大或过小就不行了
整体来看外部SRAM是可以工作的,申请内存,地址分配,数据写入和读出都可以,只是一个数据会往两个地址写


有人遇到过这样的问题 ?








最佳答案

查看完整内容[请看2#楼]

换了个XM8A51216就好了
我是一只菜鸟,但我会大鹏展翅
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

80

主题

268

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
441
金钱
441
注册时间
2014-8-11
在线时间
84 小时
 楼主| 发表于 2021-7-13 14:19:37 | 显示全部楼层
正点原子 发表于 2021-7-14 02:34
你可以换个IS62WV51216,试试看,正常应该是不会有问题的

换了个XM8A51216就好了
我是一只菜鸟,但我会大鹏展翅
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165377
金钱
165377
注册时间
2010-12-1
在线时间
2111 小时
发表于 2021-7-14 02:34:32 | 显示全部楼层
你可以换个IS62WV51216,试试看,正常应该是不会有问题的
回复

使用道具 举报

0

主题

32

帖子

0

精华

初级会员

Rank: 2

积分
69
金钱
69
注册时间
2021-7-12
在线时间
7 小时
发表于 2021-7-18 09:36:59 | 显示全部楼层
是有点怪的 可以换个IS62WV51216,试试看。
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-2-27 11:19

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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