配置成psram模式, 读写模式B, 写数据可以, 当运行读数据时候, 就出现fsmc总线没有反应, 不知还有哪些设置影响 fsmc的配置.
可以确认,外部连线电路都正常,用i/0模拟总线方式, 可以读写,tft驱动都正常,
不知道哪位大大有解决方法,不胜感激,
tft fsmc
cs ne1(pd7)
RS A16
wr wr
rd rd
d0-d15 d0-d15
命令地址 0x60020000
数据地址 0x60000000
fsmc 配置
FSMC_NORSRAMInitTypeDef FSMC_NORSRAMInitStructure;
FSMC_NORSRAMTimingInitTypeDef p;
/* FSMC_Bank1_NORSRAM1 timing configuration */
p.FSMC_AddressSetupTime = 15; /*地址建立时间期限*/
p.FSMC_AddressHoldTime = 15; /*地址的持续时间*/
p.FSMC_DataSetupTime = 100; /*设定数据时间期限*/
p.FSMC_BusTurnAroundDuration = 0; /*总线转向时间*/
p.FSMC_CLKDivision = 2; /*CLK时钟输出信号的HCLK周期数表示时间???*/
p.FSMC_DataLatency = 1; /*指定在获得第一个数据前的时钟周期*/
p.FSMC_AccessMode = FSMC_AccessMode_B;
FSMC_NORSRAMInitStructure.FSMC_Bank = FSMC_Bank1_NORSRAM1; /*指定的FSMC块*/
FSMC_NORSRAMInitStructure.FSMC_DataAddressMux = FSMC_DataAddressMux_Disable; /*地址和数据值不复用的数据总线*/
FSMC_NORSRAMInitStructure.FSMC_MemoryType = FSMC_MemoryType_PSRAM; /*外部存储器的类型*/
FSMC_NORSRAMInitStructure.FSMC_MemoryDataWidth = FSMC_MemoryDataWidth_16b; /*数据宽度*/
FSMC_NORSRAMInitStructure.FSMC_BurstAccessMode = FSMC_BurstAccessMode_Disable; /* 禁用突发访问模式*/
FSMC_NORSRAMInitStructure.FSMC_WaitSignalPolarity = FSMC_WaitSignalPolarity_Low;/*指定等待信号的极性*/
FSMC_NORSRAMInitStructure.FSMC_WrapMode = FSMC_WrapMode_Disable; /*Enables or disables the Wrapped burst access mode for Flash*/
FSMC_NORSRAMInitStructure.FSMC_WaitSignalActive = FSMC_WaitSignalActive_BeforeWaitState;
FSMC_NORSRAMInitStructure.FSMC_WriteOperation = FSMC_WriteOperation_Enable; /*启用指定的FSMC的写操作*/
FSMC_NORSRAMInitStructure.FSMC_WaitSignal = FSMC_WaitSignal_Disable;
FSMC_NORSRAMInitStructure.FSMC_ExtendedMode = FSMC_ExtendedMode_Disable; /*扩展模式*/
FSMC_NORSRAMInitStructure.FSMC_WriteBurst = FSMC_WriteBurst_Disable; /*禁用写突发操作*/
FSMC_NORSRAMInitStructure.FSMC_ReadWriteTimingStruct = &p;
FSMC_NORSRAMInitStructure.FSMC_WriteTimingStruct = &p;
FSMC_NORSRAMInit(&FSMC_NORSRAMInitStructure);
/* Enable FSMC Bank1_SRAM Bank */
FSMC_NORSRAMCmd(FSMC_Bank1_NORSRAM1, ENABLE);
有多个思路可以考虑。
1.看看库是不是太老了
2.不用库,而直接操作寄存器,我经常这么做。
3.FSMC用到的GPIO时钟 是否打开? 相关的引脚(特别要检查/RD或者说 /OE)设置了AF功能吗?
4.“只能配置成 psram模式, 如果配置其他模式,就会出现 fsmc总线没反应情况(当配置成sram,nor模式, 运行到FSMC_NORSRAMInit(&FSMC_NORSRAMInitStructure); ,就出现没有响应”
这是不正常的症状,说明有潜在的问题。 配置成sram模式,以此为突破口,把潜在的问题解决掉。
十分感谢ijk, 现在终于读写正常了, 我把调试步骤写下来,
1. 当设置为psram模式,可以正常,其他模式不正常,经分析, 是初始化问题,具体什么问题,分析完之后,我总结
2. 设置一些参数之后, sram,nor模式正常写了,但读不正常,也是初始化问题
3. 经过楼上 ijk的提醒, 我仔细研究了一下 datasheet, 经过仿真跟踪,发现 fsmc的 faccen(bit6) 是0, datasheet表示此 bit 不用管
因为我设置为模式A, 扩展模式使能, 是模式A,不是模式1,当我手动把faccen 设置成 1, 运行下去, 奇迹出现了,发现可以读了, 一时之间感觉天地都对我在笑
困扰了我近2个星期的问题终于拨开云雾了, 我看了下库函数,发现没有设置faccen的参数第一感觉,ST库函数有bug,被我发现了,是不是可以向ST那边要些奖励(偷笑), 后来想想不对,那么多人用fsmc,为什么就我发现问题,其他人都没发现, 我的代码也是参考别人成功应用的,不应该有问题, 那么是什么问题导致FSMC不能读, 翻了库函数里面关于norsram初始化部分,看到一个函数FSMC_NORSRAMStructInit, 突然感觉来灵感了,感觉找到问题点了,因为我定义了初始化的变量,可能有部分参数没有初始化,设置参数时候,出现错误参数,按照这个思路, 我把程序增加了 FSMC_NORSRAMStructInit 调用, 定义完变量之后,就调用这个函数然后其他保持不变, 奇迹出现了, 发现一切正常了, 即使 faccen一直为0, 也能读了,我更改模式b,调节了读写时间参数, 都能正常工作,
最后的结论就是, 初始化出问题了, 虽然问题解决了, 但是我奇怪很多例程都没调用FSMC_NORSRAMStructInit也能正常工作, 不知道是什么原因.
我用的编译器 iar 6.30,
如果有类似的问题的人, 有问题了,首先从寄存器入手, 看看寄存器的数值是不是你所需要的,
非常感谢ijk给的思路, 解决了问题!
下边贴出来FSMC初始化部分
//===============================================
FSMC_NORSRAMInitTypeDef FSMC_NORSRAMInitStructure;
FSMC_NORSRAMTimingInitTypeDef p;
FSMC_NORSRAMInitStructure.FSMC_ReadWriteTimingStruct = &p;
FSMC_NORSRAMInitStructure.FSMC_WriteTimingStruct = &p;
FSMC_NORSRAMStructInit(&FSMC_NORSRAMInitStructure);
/* FSMC_Bank1_NORSRAM1 timing configuration */
p.FSMC_AddressSetupTime = 0; /*地址建立时间期限*/
p.FSMC_AddressHoldTime = 0; /*地址的持续时间*/
p.FSMC_DataSetupTime = 2; /*设定数据时间期限*/
p.FSMC_BusTurnAroundDuration = 0; /*总线转向时间*/
p.FSMC_CLKDivision = 0; /*CLK时钟输出信号的HCLK周期数表示时间???*/
p.FSMC_DataLatency = 0; /*指定在获得第一个数据前的时钟周期*/
p.FSMC_AccessMode = FSMC_AccessMode_A;
FSMC_NORSRAMInitStructure.FSMC_Bank = FSMC_Bank1_NORSRAM1; /*指定的FSMC块*/
FSMC_NORSRAMInitStructure.FSMC_DataAddressMux = FSMC_DataAddressMux_Disable; /*地址和数据值不复用的数据总线*/
FSMC_NORSRAMInitStructure.FSMC_MemoryType = FSMC_MemoryType_SRAM; /*外部存储器的类型*/
FSMC_NORSRAMInitStructure.FSMC_MemoryDataWidth = FSMC_MemoryDataWidth_16b; /*数据宽度*/
FSMC_NORSRAMInitStructure.FSMC_BurstAccessMode = FSMC_BurstAccessMode_Disable; /*禁用突发访问模式*/
FSMC_NORSRAMInitStructure.FSMC_WaitSignalPolarity = FSMC_WaitSignalPolarity_Low;/*指定等待信号的极性*/
FSMC_NORSRAMInitStructure.FSMC_WrapMode = FSMC_WrapMode_Disable; /*Enables or disables the Wrapped burst access mode for Flash*/
FSMC_NORSRAMInitStructure.FSMC_WaitSignalActive = FSMC_WaitSignalActive_BeforeWaitState;
FSMC_NORSRAMInitStructure.FSMC_WriteOperation = FSMC_WriteOperation_Enable; /*启用指定的FSMC块的写操作*/
FSMC_NORSRAMInitStructure.FSMC_WaitSignal = FSMC_WaitSignal_Disable;
FSMC_NORSRAMInitStructure.FSMC_ExtendedMode = FSMC_ExtendedMode_Enable; /*扩展模式*/
FSMC_NORSRAMInitStructure.FSMC_WriteBurst = FSMC_WriteBurst_Disable; /*禁用写突发操作*/
FSMC_NORSRAMInitStructure.FSMC_ReadWriteTimingStruct = &p;
FSMC_NORSRAMInitStructure.FSMC_WriteTimingStruct = &p;
FSMC_NORSRAMInit(&FSMC_NORSRAMInitStructure);
/* Enable FSMC Bank1_SRAM Bank */
FSMC_NORSRAMCmd(FSMC_Bank1_NORSRAM1, ENABLE);
//======================================================