打印
[STM32F4]

SM32f429ZI通过FSMC读写SDRAM失败,求指教!

[复制链接]
1880|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
wjroy11|  楼主 | 2017-12-14 19:32 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
使用SM32f429ZI芯片,通过FSMC读写32M的SDRAM(IS42S16160J),测试读写失败。

每次擦除和写入的数据在memory窗口看都只有第一行显示,后面全是FF。感觉memory是不可信的。

执行全片擦除(全片写入0x00)后结果如下图:

而且发现擦除任意一个byte,在memory就会显示第一行全是0x00,然后其他行全是FF

执行全片写入后结果如下图:


跟擦除一样,写入任意一个字节,都会在第一行显示该字节,其他行为FF。

所以觉得memory窗口显示不可信,使用软件去校验写入数据。将写入数据读出来,再与写入的对比,结果第一个字节就对不上。

下面是读写数据的代码:

    while(1)
    {
                /*********************** 8-bits AHB transaction test ************************/   
                /* Erase SDRAM memory */
                for (counter = 0x00; counter < IS42S16160J_SIZE*2; counter++)
                {
                        *(__IO uint8_t*) (SDRAM_BANK_ADDR + counter) = (uint8_t)0x0;
                }
               
                /* Write data value to all SDRAM memory */
                for (counter = 0; counter < IS42S16160J_SIZE*2; counter++)
                {
                        *(__IO uint8_t*) (SDRAM_BANK_ADDR + counter) = (uint8_t)(ubWritedata_8b + counter);
                }
               
                /* Read back SDRAM memory and check content correctness*/
                counter = 0;
                uwReadwritestatus = 0;
                while ((counter < IS42S16160J_SIZE) && (uwReadwritestatus == 0))
                {
                        ubReaddata_8b = *(__IO uint8_t*)(SDRAM_BANK_ADDR + counter);
                        if ( ubReaddata_8b != (uint8_t)(ubWritedata_8b + counter))
                        {
                                uwReadwritestatus = 1;                                               
                        }
                        counter++;
                }


沙发
wjroy11|  楼主 | 2017-12-14 19:32 | 只看该作者
SDRAM配置代码:

void bsp_InitExtSDRAM(void)
{
    FMC_SDRAMInitTypeDef  FMC_SDRAMInitStructure;
    FMC_SDRAMTimingInitTypeDef  FMC_SDRAMTimingInitStructure;

    /* GPIO configuration for FMC SDRAM bank */
    SDRAM_GPIOConfig();

    /* Enable FMC clock */
    RCC_AHB3PeriphClockCmd(RCC_AHB3Periph_FMC, ENABLE);

    /* FMC Configuration ---------------------------------------------------------*/
    /* FMC SDRAM Bank configuration */
    /* Timing configuration for 90 Mhz of SD clock frequency (168Mhz/2) */
    /* TMRD: 2 Clock cycles */
    FMC_SDRAMTimingInitStructure.FMC_LoadToActiveDelay    = 2;
    /* TXSR: min=70ns (7x11.11ns) (6x11.9ns)*/
    FMC_SDRAMTimingInitStructure.FMC_ExitSelfRefreshDelay = 6;//7;
    /* TRAS: min=42ns (4x11.11ns) max=120k (ns) 37ns(4x11.9ns) */
    FMC_SDRAMTimingInitStructure.FMC_SelfRefreshTime      = 4;
    /* TRC:  min=70 (7x11.11ns) 60ns (6x11.9ns)*/
    FMC_SDRAMTimingInitStructure.FMC_RowCycleDelay        = 6;//7;
    /* TWR:  min=1+ 7ns (1+1x11.11ns) */
    FMC_SDRAMTimingInitStructure.FMC_WriteRecoveryTime    = 2;
    /* TRP:  20ns => 2x11.11ns 15ns (2x11.9ns)*/
    FMC_SDRAMTimingInitStructure.FMC_RPDelay              = 2;
    /* TRCD: 20ns => 2x11.11ns 15ns (2x11.9ns)*/
    FMC_SDRAMTimingInitStructure.FMC_RCDDelay             = 2;

    /* FMC SDRAM control configuration */
    FMC_SDRAMInitStructure.FMC_Bank               = FMC_Bank1_SDRAM; //FMC_Bank2_SDRAM;
    /* Row addressing: [7:0] */
    FMC_SDRAMInitStructure.FMC_ColumnBitsNumber   = FMC_ColumnBits_Number_9b;
    /* Column addressing: [10:0] --> [11:0], _12b = 16M,  _11b = 8M */
    FMC_SDRAMInitStructure.FMC_RowBitsNumber      = FMC_RowBits_Number_13b;      
    FMC_SDRAMInitStructure.FMC_SDMemoryDataWidth  = SDRAM_MEMORY_WIDTH;
    FMC_SDRAMInitStructure.FMC_InternalBankNumber = FMC_InternalBank_Number_4;
    /* CL: Cas Latency = 3 clock cycles */
    FMC_SDRAMInitStructure.FMC_CASLatency         = FMC_CAS_Latency_3;            
    FMC_SDRAMInitStructure.FMC_WriteProtection    = FMC_Write_Protection_Disable;
    FMC_SDRAMInitStructure.FMC_SDClockPeriod      = SDCLOCK_PERIOD;
    FMC_SDRAMInitStructure.FMC_ReadBurst          = FMC_Read_Burst_Disable;//FMC_Read_Burst_Enable;//
    FMC_SDRAMInitStructure.FMC_ReadPipeDelay      = FMC_ReadPipe_Delay_1;//FMC_ReadPipe_Delay_0;//
    FMC_SDRAMInitStructure.FMC_SDRAMTimingStruct  = &FMC_SDRAMTimingInitStructure;

    /* FMC SDRAM bank initialization */
    FMC_SDRAMInit(&FMC_SDRAMInitStructure);

    /* FMC SDRAM device initialization sequence */
    SDRAM_InitSequence();
}

使用特权

评论回复
板凳
wjroy11|  楼主 | 2017-12-14 19:33 | 只看该作者
SDRAM_InitSequence函数:

static void SDRAM_InitSequence(void)
{
    FMC_SDRAMCommandTypeDef FMC_SDRAMCommandStructure;
    uint32_t tmpr = 0;
    uint32_t timeout = SDRAM_TIMEOUT;

    /* Step 3 --------------------------------------------------------------------*/
    /* Configure a clock configuration enable command */
    FMC_SDRAMCommandStructure.FMC_CommandMode = FMC_Command_Mode_CLK_Enabled;
    FMC_SDRAMCommandStructure.FMC_CommandTarget = FMC_Command_Target_bank1;
    FMC_SDRAMCommandStructure.FMC_AutoRefreshNumber = 1;
    FMC_SDRAMCommandStructure.FMC_ModeRegisterDefinition = 0;
    /* Wait until the SDRAM controller is ready */
    while((FMC_GetFlagStatus(FMC_Bank1_SDRAM, FMC_FLAG_Busy) != RESET) && (timeout > 0))
    {
        timeout--;
    }
    /* Send the command */
    FMC_SDRAMCmdConfig(&FMC_SDRAMCommandStructure);

    /* Step 4 --------------------------------------------------------------------*/
    /* Insert 100 ms delay */
    bsp_DelayMS(100);

    /* Step 5 --------------------------------------------------------------------*/
    /* Configure a PALL (precharge all) command */
    FMC_SDRAMCommandStructure.FMC_CommandMode = FMC_Command_Mode_PALL;
    FMC_SDRAMCommandStructure.FMC_CommandTarget = FMC_Command_Target_bank1;
    FMC_SDRAMCommandStructure.FMC_AutoRefreshNumber = 1;
    FMC_SDRAMCommandStructure.FMC_ModeRegisterDefinition = 0;

    /* Wait until the SDRAM controller is ready */
    timeout = SDRAM_TIMEOUT;
    while((FMC_GetFlagStatus(FMC_Bank1_SDRAM, FMC_FLAG_Busy) != RESET) && (timeout > 0))
    {
        timeout--;
    }
    /* Send the command */
    FMC_SDRAMCmdConfig(&FMC_SDRAMCommandStructure);

    /* Step 6 --------------------------------------------------------------------*/
    /* Configure a Auto-Refresh command */
    FMC_SDRAMCommandStructure.FMC_CommandMode = FMC_Command_Mode_AutoRefresh;
    FMC_SDRAMCommandStructure.FMC_CommandTarget = FMC_Command_Target_bank1;
    FMC_SDRAMCommandStructure.FMC_AutoRefreshNumber = 8;
    FMC_SDRAMCommandStructure.FMC_ModeRegisterDefinition = 0;

    /* Wait until the SDRAM controller is ready */
    timeout = SDRAM_TIMEOUT;
    while((FMC_GetFlagStatus(FMC_Bank1_SDRAM, FMC_FLAG_Busy) != RESET) && (timeout > 0))
    {
        timeout--;
    }
    /* Send the command */
    FMC_SDRAMCmdConfig(&FMC_SDRAMCommandStructure);
       
    /* Wait until the SDRAM controller is ready */
    timeout = SDRAM_TIMEOUT;
    while((FMC_GetFlagStatus(FMC_Bank1_SDRAM, FMC_FLAG_Busy) != RESET) && (timeout > 0))
    {
        timeout--;
    }
    /* Step 7 --------------------------------------------------------------------*/
    /* Program the external memory mode register */
    tmpr = (uint32_t)SDRAM_MODEREG_BURST_LENGTH_1    |   //2******************************???*****
               SDRAM_MODEREG_BURST_TYPE_SEQUENTIAL   |
               SDRAM_MODEREG_CAS_LATENCY_3           |
               SDRAM_MODEREG_OPERATING_MODE_STANDARD |
               SDRAM_MODEREG_WRITEBURST_MODE_SINGLE;

    /* Configure a load Mode register command*/
    FMC_SDRAMCommandStructure.FMC_CommandMode = FMC_Command_Mode_LoadMode;
    FMC_SDRAMCommandStructure.FMC_CommandTarget = FMC_Command_Target_bank1;
    FMC_SDRAMCommandStructure.FMC_AutoRefreshNumber = 1;
    FMC_SDRAMCommandStructure.FMC_ModeRegisterDefinition = tmpr;

    /* Wait until the SDRAM controller is ready */
    timeout = SDRAM_TIMEOUT;
    while((FMC_GetFlagStatus(FMC_Bank1_SDRAM, FMC_FLAG_Busy) != RESET) && (timeout > 0))
    {
        timeout--;
    }
    /* Send the command */
    FMC_SDRAMCmdConfig(&FMC_SDRAMCommandStructure);

    /* Step 8 --------------------------------------------------------------------*/

    /* Set the refresh rate counter */
    /* (15.62 us x Freq) - 20 */
    /* Set the device refresh counter */
    //FMC_SetRefreshCount(1385);
    //168000000Hz/2 * 0.064s / 8192 = 656 è?600
    FMC_SetRefreshCount(980);

    /* Wait until the SDRAM controller is ready */
    timeout = SDRAM_TIMEOUT;
    while((FMC_GetFlagStatus(FMC_Bank1_SDRAM, FMC_FLAG_Busy) != RESET) && (timeout > 0))
    {
        timeout--;
    }
}

使用特权

评论回复
地板
wjroy11|  楼主 | 2017-12-14 19:36 | 只看该作者
本帖最后由 wjroy11 于 2017-12-14 19:38 编辑

使用的BANK1,行列13*9,芯片的各项配置是根据主频对照手册算的,不知道是否哪里配置还有问题,请教调试过SDRAM的大侠指导!谢谢。

使用特权

评论回复
5
香水城| | 2017-12-14 20:56 | 只看该作者
除了这些时序参数外,那些控制或数据地址管脚的配置也检查核对下。

使用特权

评论回复
评分
参与人数 1威望 +3 收起 理由
wjroy11 + 3 很给力!确实引脚问题。感谢
6
wjroy11|  楼主 | 2017-12-15 09:22 | 只看该作者
香水城 发表于 2017-12-14 20:56
除了这些时序参数外,那些控制或数据地址管脚的配置也检查核对下。

管脚配置在这里,对照原理图一一比对了,没发现哪里不对

static void SDRAM_GPIOConfig(void)
{
    GPIO_InitTypeDef GPIO_InitStructure;

    /* Enable GPIOs clock */
    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB | RCC_AHB1Periph_GPIOC | RCC_AHB1Periph_GPIOD | RCC_AHB1Periph_GPIOE |
                         RCC_AHB1Periph_GPIOF | RCC_AHB1Periph_GPIOG, ENABLE);
        /*-- GPIOs Configuration -----------------------------------------------------*/
        /*
         +-------------------+--------------------+--------------------+--------------------+
         +                       SDRAM pins assignment                                      +
         +-------------------+--------------------+--------------------+--------------------+
         | PD0  <-> FMC_D2   | PE0  <-> FMC_NBL0  | PF0  <-> FMC_A0    | PG0 <-> FMC_A10    |
         | PD1  <-> FMC_D3   | PE1  <-> FMC_NBL1  | PF1  <-> FMC_A1    | PG1 <-> FMC_A11    |PG2 <-> FMC_A12  
         | PD8  <-> FMC_D13  | PE7  <-> FMC_D4    | PF2  <-> FMC_A2    | PG4 <-> FMC_BA0    |
         | PD9  <-> FMC_D14  | PE8  <-> FMC_D5    | PF3  <-> FMC_A3    | PG5 <-> FMC_BA1    |
         | PD10 <-> FMC_D15  | PE9  <-> FMC_D6    | PF4  <-> FMC_A4    | PG8 <-> FC_SDCLK   |
         | PD14 <-> FMC_D0   | PE10 <-> FMC_D7    | PF5  <-> FMC_A5    | PG15 <-> FMC_NCAS  |
         | PD15 <-> FMC_D1   | PE11 <-> FMC_D8    | PF11 <-> FC_NRAS   |--------------------+
         +-------------------| PE12 <-> FMC_D9    | PF12 <-> FMC_A6    |
                             | PE13 <-> FMC_D10   | PF13 <-> FMC_A7    |
                             | PE14 <-> FMC_D11   | PF14 <-> FMC_A8    |
                             | PE15 <-> FMC_D12   | PF15 <-> FMC_A9    |
         +-------------------+--------------------+--------------------+
         | PC0 <-> FMC_SDNWE |
         | PC2 <-> FMC_SDNE0 |
         | PC3 <-> FMC_SDCKE0|
         +-------------------+
        */
    /* 1?12μ? GPIO éè?? */
    GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_AF;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
    GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_NOPULL;
   
    /* ???? GPIOB */


    /* ???? GPIOC */
        /* PC0 is SDNWE        */
    GPIO_PinAFConfig(GPIOC, GPIO_PinSource0, GPIO_AF_FMC);
   
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
    GPIO_Init(GPIOC, &GPIO_InitStructure);
   
    /* ???? GPIOD */
    GPIO_PinAFConfig(GPIOD, GPIO_PinSource0, GPIO_AF_FMC);
    GPIO_PinAFConfig(GPIOD, GPIO_PinSource1, GPIO_AF_FMC);
    GPIO_PinAFConfig(GPIOD, GPIO_PinSource8, GPIO_AF_FMC);
    GPIO_PinAFConfig(GPIOD, GPIO_PinSource9, GPIO_AF_FMC);
    GPIO_PinAFConfig(GPIOD, GPIO_PinSource10, GPIO_AF_FMC);
    GPIO_PinAFConfig(GPIOD, GPIO_PinSource14, GPIO_AF_FMC);
    GPIO_PinAFConfig(GPIOD, GPIO_PinSource15, GPIO_AF_FMC);
   
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0  |GPIO_Pin_1  |GPIO_Pin_8 |GPIO_Pin_9 |
                                  GPIO_Pin_10 |GPIO_Pin_14 |GPIO_Pin_15;

    GPIO_Init(GPIOD, &GPIO_InitStructure);

    /* ???? GPIOE */
    GPIO_PinAFConfig(GPIOE, GPIO_PinSource0 , GPIO_AF_FMC);
    GPIO_PinAFConfig(GPIOE, GPIO_PinSource1 , GPIO_AF_FMC);
    GPIO_PinAFConfig(GPIOE, GPIO_PinSource7 , GPIO_AF_FMC);
    GPIO_PinAFConfig(GPIOE, GPIO_PinSource8 , GPIO_AF_FMC);
    GPIO_PinAFConfig(GPIOE, GPIO_PinSource9 , GPIO_AF_FMC);
    GPIO_PinAFConfig(GPIOE, GPIO_PinSource10 , GPIO_AF_FMC);
    GPIO_PinAFConfig(GPIOE, GPIO_PinSource11 , GPIO_AF_FMC);
    GPIO_PinAFConfig(GPIOE, GPIO_PinSource12 , GPIO_AF_FMC);
    GPIO_PinAFConfig(GPIOE, GPIO_PinSource13 , GPIO_AF_FMC);
    GPIO_PinAFConfig(GPIOE, GPIO_PinSource14 , GPIO_AF_FMC);
    GPIO_PinAFConfig(GPIOE, GPIO_PinSource15 , GPIO_AF_FMC);

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0  | GPIO_Pin_1  | 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_Init(GPIOE, &GPIO_InitStructure);

    /* ???? GPIOF */
    GPIO_PinAFConfig(GPIOF, GPIO_PinSource0 , GPIO_AF_FMC);
    GPIO_PinAFConfig(GPIOF, GPIO_PinSource1 , GPIO_AF_FMC);
    GPIO_PinAFConfig(GPIOF, GPIO_PinSource2 , GPIO_AF_FMC);
    GPIO_PinAFConfig(GPIOF, GPIO_PinSource3 , GPIO_AF_FMC);
    GPIO_PinAFConfig(GPIOF, GPIO_PinSource4 , GPIO_AF_FMC);
    GPIO_PinAFConfig(GPIOF, GPIO_PinSource5 , GPIO_AF_FMC);
    GPIO_PinAFConfig(GPIOF, GPIO_PinSource11 , GPIO_AF_FMC);
    GPIO_PinAFConfig(GPIOF, GPIO_PinSource12 , GPIO_AF_FMC);
    GPIO_PinAFConfig(GPIOF, GPIO_PinSource13 , GPIO_AF_FMC);
    GPIO_PinAFConfig(GPIOF, GPIO_PinSource14 , GPIO_AF_FMC);
    GPIO_PinAFConfig(GPIOF, GPIO_PinSource15 , GPIO_AF_FMC);

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0  | GPIO_Pin_1  | GPIO_Pin_2  | GPIO_Pin_3  |
                                GPIO_Pin_4  | GPIO_Pin_5  | GPIO_Pin_11 | GPIO_Pin_12 |
                                GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15;

    GPIO_Init(GPIOF, &GPIO_InitStructure);

    /* ???? GPIOG */
    GPIO_PinAFConfig(GPIOG, GPIO_PinSource0 , GPIO_AF_FMC);
    GPIO_PinAFConfig(GPIOG, GPIO_PinSource1 , GPIO_AF_FMC);
    GPIO_PinAFConfig(GPIOG, GPIO_PinSource2 , GPIO_AF_FMC);        
    GPIO_PinAFConfig(GPIOG, GPIO_PinSource4 , GPIO_AF_FMC);
    GPIO_PinAFConfig(GPIOG, GPIO_PinSource5 , GPIO_AF_FMC);
    GPIO_PinAFConfig(GPIOG, GPIO_PinSource8 , GPIO_AF_FMC);
    GPIO_PinAFConfig(GPIOG, GPIO_PinSource15 , GPIO_AF_FMC);


    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 |GPIO_Pin_1 | GPIO_Pin_2 |GPIO_Pin_4 |GPIO_Pin_5 |
                                GPIO_Pin_8 | GPIO_Pin_15;

    GPIO_Init(GPIOG, &GPIO_InitStructure);
}

使用特权

评论回复
7
wjroy11|  楼主 | 2017-12-15 16:22 | 只看该作者
找到问题了,粗心大意,引脚配置错了...

使用特权

评论回复
8
香水城| | 2017-12-15 17:05 | 只看该作者
wjroy11 发表于 2017-12-15 16:22
找到问题了,粗心大意,引脚配置错了...

要配置的参数太多,出错乃人之常情。

这些配置旁人 最多给以提醒。

使用特权

评论回复
9
wjroy11|  楼主 | 2017-12-16 15:50 | 只看该作者
香水城 发表于 2017-12-15 17:05
要配置的参数太多,出错乃人之常情。

这些配置旁人 最多给以提醒。

嗯,是的,还是要细心,遇到问题慢慢找,到论坛就是找一个思路。谢谢版主。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

10

主题

59

帖子

0

粉丝