F429,FMC 复用模式挂载SRAM,数据写入有问题,波形如下,地址保持时间、地址建立时间、数据建立时间如何调整?

2019-07-20 10:30发布

int FpgaFmcInit(void)
{   
    SRAM_HandleTypeDef FPGA_SRAM_Handler;      
                FMC_NORSRAM_TimingTypeDef FPGA_FMC_ReadWriteTim;   

    FPGA_SRAM_Handler.Instance=FMC_NORSRAM_DEVICE; //BANK1   
    FPGA_SRAM_Handler.Extended=FMC_NORSRAM_EXTENDED_DEVICE; //选择 BWTR  未用到
       
                FPGA_SRAM_Handler.Init.NSBank=FMC_NORSRAM_BANK1;     //使用NE1--PD7
    FPGA_SRAM_Handler.Init.DataAddressMux=FMC_DATA_ADDRESS_MUX_ENABLE;  ////////复用数据线  复用的话  仅在 NOR和 PSRAM存储器有效        
    FPGA_SRAM_Handler.Init.MemoryType=FMC_MEMORY_TYPE_NOR;              ///////////不能为SRAM  否则 地址总线不能复用
    FPGA_SRAM_Handler.Init.MemoryDataWidth=FMC_NORSRAM_MEM_BUS_WIDTH_16; //16位数据宽度


    FPGA_SRAM_Handler.Init.WriteOperation=FMC_WRITE_OPERATION_ENABLE;    //存储器写使能   //初始化为1
    FPGA_SRAM_Handler.Init.WaitSignal=FMC_WAIT_SIGNAL_ENABLE;           //等待使能位     //初始化为1      
// FPGA_SRAM_Handler.Init.WriteFifo = FMC_WRITE_FIFO_DISABLE;          //FIFO禁止     
    FPGA_SRAM_Handler.Init.ExtendedMode=FMC_EXTENDED_MODE_DISABLE;        //读写使用相同的时序      
    FPGA_SRAM_Handler.Init.WriteBurst=FMC_WRITE_BURST_DISABLE;           //禁止突发写   
    FPGA_SRAM_Handler.Init.PageSize = FMC_PAGE_SIZE_NONE;           //现需页大小,默认0   


/***不是很重要的数据****/   
    FPGA_SRAM_Handler.Init.BurstAccessMode=FMC_BURST_ACCESS_MODE_DISABLE; //是否使能突发访问,仅对同步突发存储器有效,此处未用  默认 禁止  
    FPGA_SRAM_Handler.Init.WaitSignalPolarity=FMC_WAIT_SIGNAL_POLARITY_LOW;//等待信号的极性,仅在突发模式访问下有用
    FPGA_SRAM_Handler.Init.WaitSignalActive=FMC_WAIT_TIMING_BEFORE_WS;   //存储器是在等待周期之前的一个时钟周期还是等待周期期间使能NWAIT   
    FPGA_SRAM_Handler.Init.AsynchronousWait=FMC_ASYNCHRONOUS_WAIT_DISABLE;//是否使能异步传输期间的等待信号(默认值)
    FPGA_SRAM_Handler.Init.ContinuousClock=FMC_CONTINUOUS_CLOCK_SYNC_ONLY;      //连续时钟使能关闭
/*******/

    //FSMC读时序控制寄存器
    FPGA_FMC_ReadWriteTim.DataSetupTime=24;       //数据保存时间(DATAST)为85个HCLK        =4.6*85=391ns
    FPGA_FMC_ReadWriteTim.AddressHoldTime=9;
    FPGA_FMC_ReadWriteTim.AddressSetupTime=6;    //地址建立时间(ADDSET)为17个HCLK 1/216M=4.6ns*17=78ns  
    FPGA_FMC_ReadWriteTim.AccessMode=FMC_ACCESS_MODE_A;     //模式A
/******************FMC写时序控制寄存器, 读写使用不同时序时才有效,此时无效*************/  
    HAL_SRAM_Init(&FPGA_SRAM_Handler,&FPGA_FMC_ReadWriteTim,&FPGA_FMC_ReadWriteTim);               
    delay_ms(50); // delay 50 ms
        return 0;
}

//FMC的SRAM底层驱动,时钟使能,引脚分配
//此函数会被HAL_SRAM_Init()调用
//hsram:SRAM句柄
void HAL_SRAM_MspInit(SRAM_HandleTypeDef *hsram)
{   
    GPIO_InitTypeDef GPIO_Initure;       
        __HAL_RCC_FMC_CLK_ENABLE();                                //使能FMC时钟   

/**********************fpga的sram****************************/  
        __HAL_RCC_GPIOB_CLK_ENABLE();                        //使能GPIOB时钟
        __HAL_RCC_GPIOD_CLK_ENABLE();                        //使能GPIOD时钟
        __HAL_RCC_GPIOE_CLK_ENABLE();                        //使能GPIOE时钟            

        GPIO_Initure.Mode=GPIO_MODE_AF_PP;                 //复用
        GPIO_Initure.Pull=GPIO_PULLUP;                        //上拉
        GPIO_Initure.Speed=GPIO_SPEED_HIGH;                //高速
        GPIO_Initure.Alternate=GPIO_AF12_FMC;        //复用为FMC

        //初始化PB7
        GPIO_Initure.Pin=GPIO_PIN_7;   
        HAL_GPIO_Init(GPIOB,&GPIO_Initure);   


        //初始化PD0,1,3,4,5,6,7,8,9,10,11,12,13,14,15
        GPIO_Initure.Pin=GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_3|GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6|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;   
        HAL_GPIO_Init(GPIOD,&GPIO_Initure);   


        //初始化PE0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15
        GPIO_Initure.Pin=GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3|GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6|
                                                                                        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;
        HAL_GPIO_Init(GPIOE,&GPIO_Initure);

}

WR的波形怎样调整参数,才能让它向右移动

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
3条回答
浪尖上打禅
2019-07-20 14:20
本帖最后由 浪尖上打禅 于 2017-12-1 20:03 编辑

下图中每个单位刻度为10ns,可能是因为哪些配置不对CS片选信号出现了短暂的高电平,导致数据操作错误
参数为20,15,15时候的波形如下
20-15-15.png
FPGA_FMC_ReadWriteTim.DataSetupTime=20;   
    FPGA_FMC_ReadWriteTim.AddressHoldTime=15;
    FPGA_FMC_ReadWriteTim.AddressSetupTime=15;   
    FPGA_FMC_ReadWriteTim.AccessMode=FMC_ACCESS_MODE_A;   

参数为24,9,6时候的波形如下
24-9-6.png
FPGA_FMC_ReadWriteTim.DataSetupTime=24;   
    FPGA_FMC_ReadWriteTim.AddressHoldTime=9;
    FPGA_FMC_ReadWriteTim.AddressSetupTime=6;   
    FPGA_FMC_ReadWriteTim.AccessMode=FMC_ACCESS_MODE_A;   

参数为24,9,15时候的波形如下
24-9-15.png
FPGA_FMC_ReadWriteTim.DataSetupTime=24;   
    FPGA_FMC_ReadWriteTim.AddressHoldTime=9;
    FPGA_FMC_ReadWriteTim.AddressSetupTime=15;   
    FPGA_FMC_ReadWriteTim.AccessMode=FMC_ACCESS_MODE_A;   

一周热门 更多>