打印

STM32驱动外扩sram

[复制链接]
3779|13
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
lskybs|  楼主 | 2013-5-22 12:07 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
  最近刚接触到sram,用的是256K*16bits的,芯片为ZET6,根据ST公司提供的关于FSMC的库文件,然后自己copy了一下,但是读出的数据和写进去的数据不一样,读出的数据比写进去的数据大了0x000c,由于是16位的数据,所以以字为最小单位,现在都不知道问题在哪里,希望各位根据自己的经验帮忙分下一下问题可能出在什么地方,板子我用万用表测了,没问题!
   另外请教一下,sram是不是和eeprom寻址读数不太一样,并不是将其分为多少页,每页多少字节来操作的?!然后256K*16bits的sram需要18根地址线进行寻址,在STM32中,为什么不管数据多少位,FSMC_A[0]始终应该连到外部存储器的地址线A[0]?

FSMC的配置代码如下,基本上都是根据库提供的,希望大家帮我看下配置是否有问题,谢谢:
void FSMC_sram_Device_Init(void)
{
FSMC_NORSRAMInitTypeDef  FSMC_NORSRAMInitStructure;                   //定义结构体用来设置FSMC的相关信息
FSMC_NORSRAMTimingInitTypeDef        SRAM_TimingInitStructure;      //定义读写模式相关时间的初始化的结构体,可以通过STM32参考手册查得相关信息

SRAM_TimingInitStructure.FSMC_AddressSetupTime = 5;
  SRAM_TimingInitStructure.FSMC_AddressHoldTime = 5;
  SRAM_TimingInitStructure.FSMC_DataSetupTime = 2;
  SRAM_TimingInitStructure.FSMC_BusTurnAroundDuration = 0;
  SRAM_TimingInitStructure.FSMC_CLKDivision = 0;
  SRAM_TimingInitStructure.FSMC_DataLatency = 0;
  SRAM_TimingInitStructure.FSMC_AccessMode = FSMC_AccessMode_A;

  FSMC_NORSRAMInitStructure.FSMC_Bank = FSMC_Bank1_NORSRAM3;
  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;
  FSMC_NORSRAMInitStructure.FSMC_WaitSignalActive = FSMC_WaitSignalActive_BeforeWaitState;
  FSMC_NORSRAMInitStructure.FSMC_WriteOperation = FSMC_WriteOperation_Enable;
  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 = &SRAM_TimingInitStructure;
  FSMC_NORSRAMInitStructure.FSMC_WriteTimingStruct = &SRAM_TimingInitStructure;

  FSMC_NORSRAMInit(&FSMC_NORSRAMInitStructure);
  FSMC_NORSRAMCmd(FSMC_Bank1_NORSRAM3, ENABLE);
}
沙发
IJK| | 2013-5-22 14:08 | 只看该作者
读出的数据和写进去的数据不一样,是常见的1种情况。
首先,可以把读写时序调慢,即FSMC_xxxTime 可以改为原来的2~10倍。
其次,应该用数字示波器来看 控制线、地址线和数据线的波形

使用特权

评论回复
板凳
mmuuss586| | 2013-5-22 15:01 | 只看该作者

支持楼上。

使用特权

评论回复
地板
JD21IC| | 2013-5-22 16:05 | 只看该作者
16位模式时,物理的A0是逻辑的A1。不知道LZ注意这个了么?

使用特权

评论回复
5
香水城| | 2013-5-22 17:14 | 只看该作者
JD21IC 发表于 2013-5-22 16:05
16位模式时,物理的A0是逻辑的A1。不知道LZ注意这个了么?

引用4楼的话,同时回答LZ的问题“为什么不管数据多少位,FSMC_A[0]始终应该连到外部存储器的地址线A[0]?”
当你外面连着一块16位数据宽度的SRAM时,只需要在寄存器中FSMC_BCRx的MWID位域中进行设置,FSMC就会自动把内部的地址右移一位,因此从外部引脚来看,还是MCU的地址0接SRAM的地址0脚;千万不要自作多情的把MCU的地址1接到SRAM的地址0,而把MCU的地址0空在那里。






Picture1.png (37.47 KB )

内部地址位移

内部地址位移

使用特权

评论回复
6
cjhk| | 2013-5-22 19:07 | 只看该作者
楼主   顶一个   不错哦   很好  有时间需要好好看看   

使用特权

评论回复
7
lskybs|  楼主 | 2013-5-22 22:40 | 只看该作者
香水城 发表于 2013-5-22 17:14
引用4楼的话,同时回答LZ的问题“为什么不管数据多少位,FSMC_A[0]始终应该连到外部存储器的地址线A[0]? ...

香水给力,这个懂了。但是问题好像没有得到解决!

使用特权

评论回复
8
lskybs|  楼主 | 2013-5-22 22:46 | 只看该作者
IJK 发表于 2013-5-22 14:08
读出的数据和写进去的数据不一样,是常见的1种情况。
首先,可以把读写时序调慢,即FSMC_xxxTime 可以改为 ...

谢谢你的回答,按照你说的方法我也试过了,但是结果是一样的,在读sram数据的时候,高8位没有任何问题,就是低8位存在这样的情况,我想这和NBL0有没有太大的关系,我没有用示波器去看控制端的信号,我还想问一下,你说的用示波器去看,是不是看数据写入和读出状态所要建立的时间?还是其他的?

使用特权

评论回复
9
reille| | 2013-5-22 23:41 | 只看该作者
我调试的时候,

SRAM_TimingInitStructure.FSMC_AddressSetupTime = 5;
  SRAM_TimingInitStructure.FSMC_AddressHoldTime = 5;
  SRAM_TimingInitStructure.FSMC_DataSetupTime = 2;

这几个参数影响最大!

使用特权

评论回复
10
IJK| | 2013-5-23 09:51 | 只看该作者
在读sram数据的时候,高8位没有任何问题,就是低8位存在这样的情况,这和NBL0应该有关系。
NBL0、1是低电平有效,只读低8位时仅NBL0输出低,只读高8位时仅NBL1输出低,同时读低和高8位时NBL0、1都输出低

使用特权

评论回复
11
lskybs|  楼主 | 2013-5-23 10:10 | 只看该作者
reille 发表于 2013-5-22 23:41
我调试的时候,

SRAM_TimingInitStructure.FSMC_AddressSetupTime = 5;

我之前一直觉得主频高了,然后就把分频系数改小了,同时把你说的这几个参数全部设为最大值,但是没有什么改变。

使用特权

评论回复
12
香水城| | 2013-5-23 11:39 | 只看该作者
首先,例程拷贝过来要看一下是否符合自己的连接,比如你所连的SRAM访问模式是否是ModeA(FSMC_AccessMode_A),而不是Mode1?

其次,当读写数据不如预期,很有必要连上示波器看波形:数据低8位有问题么,就挂D0~D7,然后地址线挂个两三根,所有控制线都要挂。然后,分别做一次写16位数据的操作和读16位数据的操作,把波形贴上来看。

使用特权

评论回复
13
reille| | 2013-5-23 14:58 | 只看该作者
香水城 发表于 2013-5-23 11:39
首先,例程拷贝过来要看一下是否符合自己的连接,比如你所连的SRAM访问模式是否是ModeA(FSMC_AccessMode_A ...

这应该要逻辑分析仪方便了

使用特权

评论回复
14
hawksabre| | 2013-5-23 20:19 | 只看该作者
还是版主给力   不错   需要顶一个

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

6

主题

25

帖子

0

粉丝