硬汉嵌入式论坛

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

sdram问题

[复制链接]

8

主题

36

回帖

60

积分

初级会员

积分
60
发表于 2016-7-26 15:55:07 | 显示全部楼层 |阅读模式
在V6的板子上,我调试好了sdram,然后我自己画了一块电路板,调试sdram时发现很奇怪的问题。
系统时钟我配置成168MHz,sdram时钟我配置成2分频,也就是84MHz。
sdram芯片我用的是W9825G6JH-6,配置如下


FMC_SDRAM_InitStruct.SDBank=FMC_SDRAM_BANK2;                                                        
FMC_SDRAM_InitStruct.ColumnBitsNumber=FMC_SDRAM_COLUMN_BITS_NUM_9;            
FMC_SDRAM_InitStruct.RowBitsNumber=FMC_SDRAM_ROW_BITS_NUM_13;                        
FMC_SDRAM_InitStruct.MemoryDataWidth=FMC_SDRAM_MEM_BUS_WIDTH_16;               
FMC_SDRAM_InitStruct.InternalBankNumber=FMC_SDRAM_INTERN_BANKS_NUM_4;        
FMC_SDRAM_InitStruct.CASLatency=FMC_SDRAM_CAS_LATENCY_2;                                
FMC_SDRAM_InitStruct.WriteProtection=FMC_SDRAM_WRITE_PROTECTION_DISABLE;
FMC_SDRAM_InitStruct.SDClockPeriod=FMC_SDRAM_CLOCK_PERIOD_2;                        
FMC_SDRAM_InitStruct.ReadBurst=FMC_SDRAM_RBURST_ENABLE;                                    
FMC_SDRAM_InitStruct.ReadPipeDelay=FMC_SDRAM_RPIPE_DELAY_1;                           
FMC_SDRAM_Init(FMC_SDRAM_DEVICE,&FMC_SDRAM_InitStruct);

FMC_SDRAM_Timing.LoadToActiveDelay=2;            
FMC_SDRAM_Timing.ExitSelfRefreshDelay=7;   
FMC_SDRAM_Timing.SelfRefreshTime=4;               
FMC_SDRAM_Timing.RowCycleDelay=7;                    
FMC_SDRAM_Timing.WriteRecoveryTime=2;            
FMC_SDRAM_Timing.RPDelay=2;                                
FMC_SDRAM_Timing.RCDDelay=2;                           
FMC_SDRAM_Timing_Init(FMC_SDRAM_DEVICE,&FMC_SDRAM_Timing,FMC_SDRAM_BANK2);

GPIO口的速率可以配置成以下几种:

#define  GPIO_SPEED_FREQ_LOW                 ((uint32_t)0x00000000)      /*!< IO works at 2 MHz, please refer to the product datasheet */
#define  GPIO_SPEED_FREQ_MEDIUM           ((uint32_t)0x00000001)      /*!< range 12,5 MHz to 50 MHz, please refer to the product datasheet */
#define  GPIO_SPEED_FREQ_HIGH                ((uint32_t)0x00000002)      /*!< range 25 MHz to 100 MHz, please refer to the product datasheet  */
#define  GPIO_SPEED_FREQ_VERY_HIGH     ((uint32_t)0x00000003)      /*!< range 50 MHz to 200 MHz, please refer to the product datasheet  */

当我把FMC的IO速率按V6的板子配置成
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
读写测试会出错,本来应该写入的数据没写进去(查看存储区还是原来的数据,新数据没写入),本来要读出来的没读出来(查看存储区数据是对的,读出来的数据不对,再读一次又对了)
感觉应该是时序不稳造成的,但是我的pcb画线都有等长了,又感觉不太像。为了验证,我就把时钟频率降低,sdram时钟频率降低,等等方法都试了一遍,还是 一样的问题,很奇怪。


后来有一次把IO口配置成
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_MEDIUM;
读写测试都正常了,至今还是不明白为什么会这样(希望有人为我解答下),按理应该设置快一点的速率不是更好吗。

在使用sdram中,后来又发现了一个问题。
在我用sdram作为存储区跑emwin的时候,当我定义的存储区大于1M时,就会出现HardFault_Handler错误,不超过又正常使用。
但读写测试整块sdram又是正常,读写数据都是对的,这个还没找到问题所在,只能暂时使用着。
sdram使用的很郁闷,希望有人帮我解决下这个sdram的问题。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107101
QQ
发表于 2016-7-27 10:09:45 | 显示全部楼层
这个是HAL库里面的速度配置方式么? #define  GPIO_SPEED_FREQ_VERY_HIGH   

emWin不能使用外部SDRAM作为emWin动态内存,多半是因为通信不稳定,确定是否焊接好了,焊接不好也容易出现这个问题。
回复

使用道具 举报

8

主题

36

回帖

60

积分

初级会员

积分
60
 楼主| 发表于 2016-7-27 14:25:18 | 显示全部楼层

回 eric2013 的帖子

eric2013:这个是HAL库里面的速度配置方式么? #define  GPIO_SPEED_FREQ_VERY_HIGH    

emWin不能使用外部SDRAM作为emWin动态内存,多半是因为通信不稳定,确定是否焊接好了,焊接不好也容易出现这个问题。 (2016-07-27 10:09) 
是的,是hal库里面的配置。
焊接应该是没问题的,我配置成GPIO_SPEED_FREQ_MEDIUM的时候,读写测试整块sdram,是正常工作的。只是配置成其余的都不行。
HAL库里面GPIO配置速度的代码如下:
/* Check the Speed parameter */
assert_param(IS_GPIO_SPEED(GPIO_Init->Speed));

/* Configure the IO Speed */
temp = GPIOx->OSPEEDR;
temp &= ~(GPIO_OSPEEDER_OSPEEDR0 << (position * 2));
temp |= (GPIO_Init->Speed << (position * 2));
GPIOx->OSPEEDR = temp;

V6板子FMC口的速度配置为
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

配置源码为
/* Check Speed mode parameters */
assert_param(IS_GPIO_SPEED(GPIO_InitStruct->GPIO_Speed));

/* Speed mode configuration */
GPIOx->OSPEEDR &= ~(GPIO_OSPEEDER_OSPEEDR0 << (pinpos * 2));
GPIOx->OSPEEDR |= ((uint32_t)(GPIO_InitStruct->GPIO_Speed) << (pinpos * 2));

两种的配置代码是一样的

#define  GPIO_SPEED_FREQ_LOW              ((uint32_t)0x00000000)      /*!< IO works at 2 MHz, please refer to the product datasheet */
#define  GPIO_SPEED_FREQ_MEDIUM           ((uint32_t)0x00000001)      /*!< range 12,5 MHz to 50 MHz, please refer to the product datasheet */
#define  GPIO_SPEED_FREQ_HIGH             ((uint32_t)0x00000002)      /*!< range 25 MHz to 100 MHz, please refer to the product datasheet  */
#define  GPIO_SPEED_FREQ_VERY_HIGH        ((uint32_t)0x00000003)      /*!< range 50 MHz to 200 MHz, please refer to the product datasheet  */

typedef enum
{
  GPIO_Low_Speed     = 0x00, /*!< Low speed    */
  GPIO_Medium_Speed  = 0x01, /*!< Medium speed */
  GPIO_Fast_Speed    = 0x02, /*!< Fast speed   */
  GPIO_High_Speed    = 0x03  /*!< High speed   */
}GPIOSpeed_TypeDef;

/* Add legacy definition */
#define  GPIO_Speed_2MHz    GPIO_Low_Speed   
#define  GPIO_Speed_25MHz   GPIO_Medium_Speed
#define  GPIO_Speed_50MHz   GPIO_Fast_Speed
#define  GPIO_Speed_100MHz  GPIO_High_Speed  

两者在定义上也是一样的
回复

使用道具 举报

8

主题

36

回帖

60

积分

初级会员

积分
60
 楼主| 发表于 2016-7-28 12:13:44 | 显示全部楼层
今天把V6板子SDRAM的程序弄了过来,做了下测试,测试代码如下
#include "stm32f4xx.h"

/* FMC SDRAM Memory Width */
/* #define SDRAM_MEMORY_WIDTH   FMC_SDMemory_Width_8b  */
#define SDRAM_MEMORY_WIDTH    FMC_SDMemory_Width_16b
//#define SDRAM_MEMORY_WIDTH    FMC_SDMemory_Width_32b  /* Default configuration used with LCD */

/* FMC SDRAM Memory clock period */
#define SDCLOCK_PERIOD    FMC_SDClock_Period_2        /* Default configuration used with LCD */
/* #define SDCLOCK_PERIOD    FMC_SDClock_Period_3 */

/* SDRAM3¬ê± */
#define SDRAM_TIMEOUT     ((uint32_t)0xFFFF)

/* FMC SDRAM Mode definition register defines */
#define SDRAM_MODEREG_BURST_LENGTH_1             ((uint16_t)0x0000)
#define SDRAM_MODEREG_BURST_LENGTH_2             ((uint16_t)0x0001)
#define SDRAM_MODEREG_BURST_LENGTH_4             ((uint16_t)0x0002)
#define SDRAM_MODEREG_BURST_LENGTH_8             ((uint16_t)0x0004)
#define SDRAM_MODEREG_BURST_TYPE_SEQUENTIAL      ((uint16_t)0x0000)
#define SDRAM_MODEREG_BURST_TYPE_INTERLEAVED     ((uint16_t)0x0008)
#define SDRAM_MODEREG_CAS_LATENCY_2              ((uint16_t)0x0020)
#define SDRAM_MODEREG_CAS_LATENCY_3              ((uint16_t)0x0030)
#define SDRAM_MODEREG_OPERATING_MODE_STANDARD    ((uint16_t)0x0000)
#define SDRAM_MODEREG_WRITEBURST_MODE_PROGRAMMED ((uint16_t)0x0000)
#define SDRAM_MODEREG_WRITEBURST_MODE_SINGLE     ((uint16_t)0x0200)

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);

    /* 1«12μÄ GPIO éèÖà */
    GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_AF;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_25MHz;//GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
    GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_NOPULL;
   
    /* ÅäÖÃ GPIOB */
    GPIO_PinAFConfig(GPIOB, GPIO_PinSource5, GPIO_AF_FMC);
    GPIO_PinAFConfig(GPIOB, GPIO_PinSource6, GPIO_AF_FMC);
   
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5  |GPIO_Pin_6;
    GPIO_Init(GPIOB, &GPIO_InitStructure);

    /* ÅäÖÃ GPIOC */
    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);
}

void bsp_DelayMS(uint32_t s)
{
    uint32_t i;
    while(s--)
    {
        for(i=0;i<168000;i++);
    }

}

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_bank2;
    FMC_SDRAMCommandStructure.FMC_AutoRefreshNumber = 1;
    FMC_SDRAMCommandStructure.FMC_ModeRegisterDefinition = 0;
    /* Wait until the SDRAM controller is ready */
    while((FMC_GetFlagStatus(FMC_Bank2_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_bank2;
    FMC_SDRAMCommandStructure.FMC_AutoRefreshNumber = 1;
    FMC_SDRAMCommandStructure.FMC_ModeRegisterDefinition = 0;

    /* Wait until the SDRAM controller is ready */
    timeout = SDRAM_TIMEOUT;
    while((FMC_GetFlagStatus(FMC_Bank2_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_bank2;
    FMC_SDRAMCommandStructure.FMC_AutoRefreshNumber = 8;
    FMC_SDRAMCommandStructure.FMC_ModeRegisterDefinition = 0;

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

    /* Step 7 --------------------------------------------------------------------*/
    /* Program the external memory mode register */
    tmpr = (uint32_t)SDRAM_MODEREG_BURST_LENGTH_1          |
               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_bank2;
    FMC_SDRAMCommandStructure.FMC_AutoRefreshNumber = 1;
    FMC_SDRAMCommandStructure.FMC_ModeRegisterDefinition = tmpr;

    /* Wait until the SDRAM controller is ready */
    timeout = SDRAM_TIMEOUT;
    while((FMC_GetFlagStatus(FMC_Bank2_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(600);

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

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 (180Mhz/2) */
    /* TMRD: 2 Clock cycles */
    FMC_SDRAMTimingInitStructure.FMC_LoadToActiveDelay    = 2;
    /* TXSR: min=70ns (7x11.11ns) */
    FMC_SDRAMTimingInitStructure.FMC_ExitSelfRefreshDelay = 7;
    /* TRAS: min=42ns (4x11.11ns) max=120k (ns) */
    FMC_SDRAMTimingInitStructure.FMC_SelfRefreshTime      = 4;
    /* TRC:  min=70 (7x11.11ns) */
    FMC_SDRAMTimingInitStructure.FMC_RowCycleDelay        = 7;
    /* TWR:  min=1+ 7ns (1+1x11.11ns) */
    FMC_SDRAMTimingInitStructure.FMC_WriteRecoveryTime    = 2;
    /* TRP:  20ns => 2x11.11ns */
    FMC_SDRAMTimingInitStructure.FMC_RPDelay              = 2;
    /* TRCD: 20ns => 2x11.11ns */
    FMC_SDRAMTimingInitStructure.FMC_RCDDelay             = 2;

    /* FMC SDRAM control configuration */
    FMC_SDRAMInitStructure.FMC_Bank               = FMC_Bank2_SDRAM; //FMC_Bank1_SDRAM;
    /* Row addressing: [7:0] */
    FMC_SDRAMInitStructure.FMC_ColumnBitsNumber   = FMC_ColumnBits_Number_9b; //FMC_ColumnBits_Number_8b;
    /* Column addressing: [10:0] --> [11:0], _12b = 16M,  _11b = 8M */
    FMC_SDRAMInitStructure.FMC_RowBitsNumber      = FMC_RowBits_Number_13b; //FMC_RowBits_Number_12b;        
    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_CAS_Latency_2 2»DD */
    FMC_SDRAMInitStructure.FMC_WriteProtection    = FMC_Write_Protection_Disable;
    FMC_SDRAMInitStructure.FMC_SDClockPeriod      = SDCLOCK_PERIOD;
    FMC_SDRAMInitStructure.FMC_ReadBurst          = FMC_Read_Burst_Disable;
    FMC_SDRAMInitStructure.FMC_ReadPipeDelay      = FMC_ReadPipe_Delay_1;
    FMC_SDRAMInitStructure.FMC_SDRAMTimingStruct  = &FMC_SDRAMTimingInitStructure;

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

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

int main(void)
{
    uint8_t *pbuf=(uint8_t *)0xD0000000;
    uint32_t i,j,data,count=0;
    uint32_t count1=0x8000;
    uint32_t count2=1024;

    SystemCoreClockUpdate();
    bsp_InitExtSDRAM();
   
    while(1)
    {
        for(i=0;i<count1;i++)
        {
            for(j=0;j<count2;j++)
            {
                *(pbuf+i*count2+j)=0;
            }
        }
        
        for(i=0;i<count1;i++)
        {
            for(j=0;j<count2;j++)
            {
                data=*(pbuf+i*count2+j);
                if(data!=0)
                {
                    data=0;
                }
            }
        }
        
        for(i=0x0000;i<count1;i++)
        {
            for(j=0;j<count2;j++)
            {
                *(pbuf+i*count2+j)=(i+j)&0xff;
            }
        }
            
        for(i=0x0000;i<count1;i++)
        {
            for(j=0;j<count2;j++)
            {
                data=*(pbuf+i*count2+j);
                if(data!=((i+j)&0xff))
                {
                    data=0;
                }
            }
        }
        
        if(count<100)
            count++;
        else
            count=0;
    }
}

测试问题还是在GPIO口速率的配置上,在这一句
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_25MHz;//GPIO_Speed_50MHz;
当配置成25M,读写测试正常,当配置从50M读写测试就出现错误,很奇怪。
为什么配置低了反而正常呢
回复

使用道具 举报

4

主题

65

回帖

77

积分

初级会员

积分
77
发表于 2016-7-28 16:19:16 | 显示全部楼层
高速率出错,难道布线不过关?
回复

使用道具 举报

8

主题

36

回帖

60

积分

初级会员

积分
60
 楼主| 发表于 2016-7-29 08:52:26 | 显示全部楼层

回 luodewei 的帖子

luodewei:高速率出错,难道布线不过关? (2016-07-28 16:19) 
SDRAM的总线速率都是一样的84MHz,配置成25M读写正常,配置成50M读写就不行了。布线都有用等长布线了。
回复

使用道具 举报

8

主题

36

回帖

60

积分

初级会员

积分
60
 楼主| 发表于 2016-7-29 09:05:12 | 显示全部楼层
这个是原理图中SDRAM部分,从整个图中复制出的,版主,请帮忙分析下可能出现问题的地方,我都实验一下。

原理图.zip

35 KB, 下载次数: 130

原理图

回复

使用道具 举报

4

主题

65

回帖

77

积分

初级会员

积分
77
发表于 2016-7-29 10:24:59 | 显示全部楼层
这种情况我一般乱试,反正也没头绪。比如换块一样的板子,结果是否一样?换别的厂家的SDRAM试试看,反正封装都一样,不断验证排除,也许问题就找到了
回复

使用道具 举报

8

主题

36

回帖

60

积分

初级会员

积分
60
 楼主| 发表于 2016-7-29 11:17:50 | 显示全部楼层

回 luodewei 的帖子

luodewei:这种情况我一般乱试,反正也没头绪。比如换块一样的板子,结果是否一样?换别的厂家的SDRAM试试看,反正封装都一样,不断验证排除,也许问题就找到了 (2016-07-29 10:24) 
这两个方法都试过了
回复

使用道具 举报

610

主题

3063

回帖

4913

积分

至尊会员

积分
4913
发表于 2016-7-29 15:50:23 | 显示全部楼层

回 365497604 的帖子

365497604:这两个方法都试过了 (2016-07-29 11:17) 
是不是你布线的sdram的时钟线没有做好保护,从而造成信号干扰 ????

貌似高速的时钟线需要做好屏蔽保护才可以的,等长一方面,时钟线屏蔽保护是另外一方面,这两个需要同时兼备才行
回复

使用道具 举报

610

主题

3063

回帖

4913

积分

至尊会员

积分
4913
发表于 2016-7-29 15:50:35 | 显示全部楼层

回 365497604 的帖子

365497604:

这两个方法都试过了
是不是你布线的sdram的时钟线没有做好保护,从而造成信号干扰 ????

貌似高速的时钟线需要做好屏蔽保护才可以的,等长一方面,时钟线屏蔽保护是另外一方面,这两个需要同时兼备才行
回复

使用道具 举报

4

主题

65

回帖

77

积分

初级会员

积分
77
发表于 2016-7-29 15:59:10 | 显示全部楼层
我的板子布线都没怎么讲究,没等长,也没什么时钟线保护,都没什么问题呢
楼主要注意,是不是程序内别的地方配置了与SDRAM同样的管脚导致冲突?
回复

使用道具 举报

8

主题

36

回帖

60

积分

初级会员

积分
60
 楼主| 发表于 2016-8-1 11:27:29 | 显示全部楼层

回 luodewei 的帖子

luodewei:我的板子布线都没怎么讲究,没等长,也没什么时钟线保护,都没什么问题呢
楼主要注意,是不是程序内别的地方配置了与SDRAM同样的管脚导致冲突? (2016-07-29 15:59) 
就单一的测试sdram其余功能都没做,管脚也就配置了SDRAM的,你可以看下测试程序,就测试sdram。
回复

使用道具 举报

8

主题

36

回帖

60

积分

初级会员

积分
60
 楼主| 发表于 2016-8-1 13:13:33 | 显示全部楼层
问题还没找到,继续努力中。
回复

使用道具 举报

8

主题

36

回帖

60

积分

初级会员

积分
60
 楼主| 发表于 2016-8-1 14:05:55 | 显示全部楼层
现在排查到GPIO_InitStructure.GPIO_Speed = GPIO_Speed_25MHz;//GPIO_Speed_50MHz;这句配置是对SDCLK管脚有影响,其余管脚配置25M和50M都没关系,SDCLK只要配置50M就出错。
回复

使用道具 举报

32

主题

97

回帖

193

积分

初级会员

积分
193
发表于 2016-8-1 14:28:18 | 显示全部楼层
我现在也遇到这种问题,读写SDRAM是正常的,但做为emwin内存时,emwin运行不稳定
回复

使用道具 举报

32

主题

97

回帖

193

积分

初级会员

积分
193
发表于 2016-8-1 14:29:33 | 显示全部楼层
对了,你做的双面板,还是四层板,现在这几家做429开发板的都做成四层板,我的板子是双面板
回复

使用道具 举报

8

主题

36

回帖

60

积分

初级会员

积分
60
 楼主| 发表于 2016-8-2 14:34:16 | 显示全部楼层

回 beyondabcd 的帖子

beyondabcd:我现在也遇到这种问题,读写SDRAM是正常的,但做为emwin内存时,emwin运行不稳定 (2016-08-01 14:28) 
做emwin内存不要定义超过1M,你改改试试看。
回复

使用道具 举报

8

主题

36

回帖

60

积分

初级会员

积分
60
 楼主| 发表于 2016-8-2 14:35:52 | 显示全部楼层

回 beyondabcd 的帖子

beyondabcd:对了,你做的双面板,还是四层板,现在这几家做429开发板的都做成四层板,我的板子是双面板 (2016-08-01 14:29) 
我做的也是双面板
回复

使用道具 举报

4

主题

65

回帖

77

积分

初级会员

积分
77
发表于 2016-8-3 09:40:02 | 显示全部楼层

回 365497604 的帖子

365497604:就单一的测试sdram其余功能都没做,管脚也就配置了SDRAM的,你可以看下测试程序,就测试sdram。 (2016-08-01 11:27) 
我的是四层板,还以为你的也是四层板.........。你的双面板可能布线上要更加小心,看样子是时钟线布的不过关呀
回复

使用道具 举报

610

主题

3063

回帖

4913

积分

至尊会员

积分
4913
发表于 2016-10-6 16:06:12 | 显示全部楼层
你好,请问 你的问题解决了没有啊 ??
回复

使用道具 举报

8

主题

36

回帖

60

积分

初级会员

积分
60
 楼主| 发表于 2016-10-11 10:40:12 | 显示全部楼层

回 hpdell 的帖子

hpdell:你好,请问 你的问题解决了没有啊 ?? (2016-10-06 16:06) 
问题找到了,把sdclk管脚pcb连线切断,然后找个导线在外部连接,就恢复正常使用。
现在我又再布了一个板子,这两天在调试,SDRAM没什么问题,VGA显示部分还在调。
回复

使用道具 举报

8

主题

36

回帖

60

积分

初级会员

积分
60
 楼主| 发表于 2016-10-11 10:41:23 | 显示全部楼层
这个问题找了很久,谢谢大家帮忙。[s:142]
回复

使用道具 举报

2

主题

17

回帖

23

积分

新手上路

积分
23
发表于 2016-10-15 11:54:21 | 显示全部楼层
恭喜恭喜~
处理这些问题最伤神了。
回复

使用道具 举报

610

主题

3063

回帖

4913

积分

至尊会员

积分
4913
发表于 2016-10-26 10:42:26 | 显示全部楼层

回 365497604 的帖子

365497604:问题找到了,把sdclk管脚pcb连线切断,然后找个导线在外部连接,就恢复正常使用。
现在我又再布了一个板子,这两天在调试,SDRAM没什么问题,VGA显示部分还在调。 (2016-10-11 10:40)
重新布线你的 sdclk 是怎么处理的啊 ??,

我现在自己也搞了个板子,io口的速度配置为最高不行(配置为低或者中也都不行),配置为  高可以,估计我的跟你的问题差不多啊 ??
回复

使用道具 举报

12

主题

134

回帖

170

积分

初级会员

积分
170
发表于 2016-11-9 20:32:54 | 显示全部楼层
谢谢分享,学习了。。
回复

使用道具 举报

8

主题

36

回帖

60

积分

初级会员

积分
60
 楼主| 发表于 2016-11-22 21:23:35 | 显示全部楼层

回 hpdell 的帖子

hpdell:重新布线你的 sdclk 是怎么处理的啊 ??,

我现在自己也搞了个板子,io口的速度配置为最高不行(配置为低或者中也都不行),配置为  高可以,估计我的跟你的问题差不多啊 ??
 (2016-10-26 10:42) 
重新布的板子 SDCLK这个信号用圈地保护下,其余没多大改变。
回复

使用道具 举报

28

主题

130

回帖

214

积分

高级会员

积分
214
发表于 2022-3-18 23:36:30 | 显示全部楼层
我也怀疑我做的板子SDRAM布线有问题
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-18 08:14 , Processed in 0.337200 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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