硬汉嵌入式论坛

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

[有问必答] 如何计算DM9000A的V5开发板FSMC时序?

[复制链接]

5

主题

81

回帖

96

积分

初级会员

积分
96
发表于 2023-7-22 15:58:49 | 显示全部楼层 |阅读模式

硬汉哥,看了https://www.armbbs.cn/forum.php?mod=viewthread&tid=14092https://www.armbbs.cn/forum.php? ... FSMC%2B%CA%B1%D0%F2
1、还是没有看懂,能否讲解一下DM9000A的这几个时序参数是怎么计算出来的,感谢。或者大概标注一下时序图里,哪段是地址建立时间,哪段是地址保持时间,哪段是数据建立时间,哪段是数据保持时间,哪段是两次连续数据之间的时间间隔?
2、想问一下为什么DM9000手册中的读写时序的时间参数(ns时间)不一样,但最后初始化的时候,还是设置了读写时序一样(if (HAL_SRAM_Init(&hsram, &SRAM_Timing, &SRAM_Timing) != HAL_OK))?





[C] 纯文本查看 复制代码
/*
*********************************************************************************************************
*	函数名: DM9K_FSMCConfig
*	参  数: 无
*	返  回: 无
*	功  能: 配置FSMC并口访问时序
*********************************************************************************************************
*/
static void DM9K_FSMCConfig(void)
{
	/* 
	   TFT-LCD,OLED和AD7606公用一个FSMC配置,如果都开启,请以FSMC速度最慢的为准。
	   从而保证所有外设都可以正常工作。
	*/
	SRAM_HandleTypeDef hsram = {0};
	FMC_NORSRAM_TimingTypeDef SRAM_Timing = {0};
		
	hsram.Instance  = FMC_NORSRAM_DEVICE;
	hsram.Extended  = FMC_NORSRAM_EXTENDED_DEVICE;
	
    /* FMC使用的HCLK,主频168MHz,1个FMC时钟周期就是5.95ns */
	SRAM_Timing.AddressSetupTime       = 3;  /* 3*5.95ns=17.85ns,地址建立时间,范围0 -15个FMC时钟周期个数 */
	SRAM_Timing.AddressHoldTime        = 0;  /* 地址保持时间,配置为模式A时,用不到此参数 范围1 -15个时钟周期个数 */
	SRAM_Timing.DataSetupTime          = 6;  /* 6*5.95ns=35.7ns,数据保持时间,范围1 -255个时钟周期个数 */
	SRAM_Timing.BusTurnAroundDuration  = 8;  /* 两次连续数据之间的时间间隔,范围1 -15个时钟周期个数 */
	SRAM_Timing.CLKDivision            = 0;  /* 此配置用不到这个参数 */
	SRAM_Timing.DataLatency            = 0;  /* 此配置用不到这个参数 */
	SRAM_Timing.AccessMode             = FSMC_ACCESS_MODE_A; /* 配置为模式A */

	hsram.Init.NSBank             = FSMC_NORSRAM_BANK3;              /* 使用的BANK4,即使用的片选FSMC_NE4 */
	hsram.Init.DataAddressMux     = FSMC_DATA_ADDRESS_MUX_DISABLE;   /* 禁止地址数据复用 */
	hsram.Init.MemoryType         = FSMC_MEMORY_TYPE_SRAM;           /* 存储器类型SRAM */
	hsram.Init.MemoryDataWidth    = FSMC_NORSRAM_MEM_BUS_WIDTH_16;	 /* 16位总线宽度 */
	hsram.Init.BurstAccessMode    = FSMC_BURST_ACCESS_MODE_DISABLE;  /* 关闭突发模式 */
	hsram.Init.WaitSignalPolarity = FSMC_WAIT_SIGNAL_POLARITY_LOW;   /* 用于设置等待信号的极性,关闭突发模式,此参数无效 */
	hsram.Init.WaitSignalActive   = FSMC_WAIT_TIMING_BEFORE_WS;      /* 关闭突发模式,此参数无效 */
	hsram.Init.WriteOperation     = FSMC_WRITE_OPERATION_ENABLE;     /* 用于使能或者禁止写保护 */
	hsram.Init.WaitSignal         = FSMC_WAIT_SIGNAL_DISABLE;        /* 关闭突发模式,此参数无效 */
	hsram.Init.ExtendedMode       = FSMC_EXTENDED_MODE_DISABLE;      /* 禁止扩展模式 */
	hsram.Init.AsynchronousWait   = FSMC_ASYNCHRONOUS_WAIT_DISABLE;  /* 用于异步传输期间,使能或者禁止等待信号,这里选择关闭 */
	hsram.Init.WriteBurst         = FSMC_WRITE_BURST_DISABLE;        /* 禁止写突发 */
	hsram.Init.ContinuousClock    = FSMC_CONTINUOUS_CLOCK_SYNC_ONLY; /* 仅同步模式才做时钟输出 */
    hsram.Init.WriteFifo          = FSMC_WRITE_FIFO_ENABLE;          /* 使能写FIFO */

	/* 初始化SRAM控制器 */
	if (HAL_SRAM_Init(&hsram, &SRAM_Timing, &SRAM_Timing) != HAL_OK)
	{
		/* 初始化错误 */
		Error_Handler(__FILE__, __LINE__);
	}	
}

回复

使用道具 举报

5

主题

81

回帖

96

积分

初级会员

积分
96
 楼主| 发表于 2023-7-22 16:00:10 | 显示全部楼层
补充DM9000A附件手册

DM9000A.pdf

463.99 KB, 下载次数: 10

回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106760
QQ
发表于 2023-7-23 00:29:13 | 显示全部楼层
流型 发表于 2023-7-22 16:00
补充DM9000A附件手册

DM9000手册末尾时序图修改而来的,实际应用里面做了微调。
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-5 05:00 , Processed in 0.394443 second(s), 29 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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