硬汉哥,看了https://www.armbbs.cn/forum.php?mod=viewthread&tid=14092和https://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__);
}
}
|