打印

*求助*STM32F103VC用FSMC扩展SRAM写错误问题

[复制链接]
5065|21
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
peugeoter|  楼主 | 2013-9-22 11:05 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    100pinSTM32F103VC用FSMC外挂SRAM(IS61LV6416),DM9000A,及SSD1963.
SRAM地址采用74LV273上升沿锁存,FSMC使用地址数据复用模式,经测试时序没发现问题。现在现象为单步调试模式写数据正常,可是一旦全速运行SRAM内写的是下一个数据的地址(测试程序固定写16bit数据0xA5A5),即地址0x63FE0000 内数据为0x0001,0x63FE0002内数据为0x0002,0x63FE0004内数据为0x0003,。。。在连续两个写操作之间人为加延时结果依然如此。降低FSMC频率也无济于事。请高手帮忙分析下哪里有疏漏导致此问题,谢谢。时序见图。

单步操作如下图


连续操作如下


沙发
wrj198504| | 2013-9-22 11:20 | 只看该作者

使用特权

评论回复
板凳
outstanding| | 2013-9-22 13:06 | 只看该作者
什么东东 看不懂

使用特权

评论回复
地板
peugeoter|  楼主 | 2013-9-22 13:09 | 只看该作者
outstanding 发表于 2013-9-22 13:06
什么东东 看不懂

图片是抓的SRAM 片选,锁存,写信号跟DATA0-7的数据,8-15的数据没有抓.请各位帮忙分析一下问题可能出在哪里,多谢

使用特权

评论回复
5
guet_new_man| | 2013-9-22 23:46 | 只看该作者
看时序图貌似没有问题,没太看明白楼主的描述“可是一旦全速运行SRAM内写的是下一个数据的地址(测试程序固定写16bit数据0xA5A5),即地址0x63FE0000 内数据为0x0001,0x63FE0002内数据为0x0002,0x63FE0004内数据为0x0003,。。。”,可否解释一下?

使用特权

评论回复
6
peugeoter|  楼主 | 2013-9-23 08:40 | 只看该作者
本帖最后由 peugeoter 于 2013-9-23 08:43 编辑
guet_new_man 发表于 2013-9-22 23:46
看时序图貌似没有问题,没太看明白楼主的描述“可是一旦全速运行SRAM内写的是下一个数据的地址(测试程序固 ...

谢谢帮忙分析,在主贴里我可能没有描述清楚,Ox63FE0000是STM32内部的byte地址,是这样的:
我写了个对SRAM地址0x0000到0xFFFF循环写入固定数OxA5A5的测试程序(16位操作),在keil中debug,断点设在写操作语句,单步一次一次执行的话(单步操作时序图)写入SRAM内的数据是正确的,若是将断点取消,让程序自己循环写SRAM(连续操作时序图)则写入SRAM的好像为下个地址数据(数据为地址+1),对应关系如下:
ADDR:        DATA:
0x0000      0x0001
0x0001      0x0002
0x0002      0x0003
......      ......
若写操作为32位时(debug单步写操作),第一个word写入为SRAM地址+1,第二个word数据正确,分析不出是哪里引起的。

使用特权

评论回复
7
peugeoter|  楼主 | 2013-9-23 11:42 | 只看该作者
发现了个奇怪的现象,写某个地址后紧接着把数据读出,数据是对的,后来一块读出时数据就变成地址+1了。不同的是连续读时控制SRAM高低字节有效位LB跟UB没有输出了,一直为低,但低电位有效啊。。奇怪。。
程序为
for(addr = 0;addr < 5;addr++)
        {
                RAM[addr] = 0xA5A5;
        temp[0] = RAM[addr];
        }
for(addr = 0; addr< 5; addr++)
        {
        temp[addr] = RAM[addr];
        }

使用特权

评论回复
8
guet_new_man| | 2013-9-23 12:50 | 只看该作者
1. 你举得例子本身存在一点问题:
ADDR:        DATA:
0x0000      0x0001   (数据是16位,地址的移动就需要两个字节了,所以后面的地址0x0001应该是0x0002、0x0002应该是0x0004)
0x0001      0x0002
0x0002      0x0003
......      ......

2. UB、UB为低,说明数据线上整个16位均已经被使能,在读模式下,就是SRAM输出的数据;在写模式下,就是MCU写入的数据。

3. 想看你一下楼主的配置代码,电路上还有一点很奇怪,为什么还多加一片74LV273?一般地,把MCU的fsmc对应的引脚直接与外部SRAM连接即可,锁存本身是WE或者OE上升沿时,SRAM自动锁入伙锁出数据线上的数据。

使用特权

评论回复
9
peugeoter|  楼主 | 2013-9-23 13:07 | 只看该作者
guet_new_man 发表于 2013-9-23 12:50
1. 你举得例子本身存在一点问题:
ADDR:        DATA:
0x0000      0x0001   (数据是16位,地址的移动就需 ...

1.例子里的地址是SRAM芯片(16bit)上的地址,不是byte地址。
2.OK
3.我用的是100pin的芯片,0-15bit分时复用,地址由0-15bit数据线锁存得到。代码没有调用库函数,是直接操作寄存器,稍后贴上

使用特权

评论回复
10
peugeoter|  楼主 | 2013-9-23 13:22 | 只看该作者
FSMC_Bank1->BTCR[0] = 0x00001097;//启用BWTR
FSMC_Bank1->BTCR[1] = 0x00100555;
地址/数据复用,PSRAM存储器类型,16位总线宽度,

使用特权

评论回复
11
peugeoter|  楼主 | 2013-9-23 15:15 | 只看该作者
本帖最后由 peugeoter 于 2013-9-23 15:16 编辑

问题已解决,由地址跳变到写有效时间太短引起。SRAM的SPEC要求此时间Min值为0,若用74lv273上升沿锁存地址,则此时间为负值。当时看用373的话需要将锁存信号反相,以为只需要在写有效正跳变时地址稳定即可,顾选择273做锁存,看来行不通。
当然也有别的解决方法,若对SRAM写耗时不敏感的话,可以在对某个地址进行写操作前先对此地址做读操作一次,使74LV273将地址锁定,再进行写操作时地址将不跳变,达到稳定写入的效果。
经测试用74LV273锁存地址对读操作没有影响。

使用特权

评论回复
12
zeluo| | 2013-9-23 19:02 | 只看该作者
波形时序图   楼主   感觉不错   有意思   

使用特权

评论回复
13
guet_new_man| | 2013-9-23 20:33 | 只看该作者
peugeoter 发表于 2013-9-23 15:15
问题已解决,由地址跳变到写有效时间太短引起。SRAM的SPEC要求此时间Min值为0,若用74lv273上升沿锁存地址 ...

嗯, 这就与单步跟踪时可正确写入数据的效果吻合了。。

使用特权

评论回复
14
luomh98| | 2013-9-25 21:36 | 只看该作者
楼主用的100pin芯片的详细型号是什么?包括版本号
3年前曾为100pin芯片的FSMC复用问题折腾够呛,也曾用分析仪仔细分析过时序,尝试过各种FSMC的配置,都没有解决,当时认为可能是个BUG,而放弃了使用100pin芯片的FSMC外扩SRAM

使用特权

评论回复
15
luomh98| | 2013-9-25 21:41 | 只看该作者
我的问题贴见https://bbs.21ic.com/forum.php?mo ... 13636&epclose=1
楼主能贴出你的芯片配置程序吗?看看到底是老版本芯片的硬件BUG,还是我的配置程序没写对

使用特权

评论回复
16
peugeoter|  楼主 | 2013-9-26 16:38 | 只看该作者
luomh98 发表于 2013-9-25 21:36
楼主用的100pin芯片的详细型号是什么?包括版本号
3年前曾为100pin芯片的FSMC复用问题折腾够呛,也曾用分析 ...

芯片型号为:STM32F103VCT6,版本的话我不知道在哪里看啊。配置的话我直接操作的寄存器,没有用官方的库,你照着SPEC看一下吧。
void FSMC_Config(void)
{
FSMC_Bank1->BTCR[0] = 0x00001097;//启用BWTR
FSMC_Bank1->BTCR[1] = 0x00100311;
FSMC_Bank1->BTCR[2] = 0x000050D9;///EXT mod enable
FSMC_Bank1->BTCR[3] = 0x20100311;
FSMC_Bank1E ->BWTR[2] = 0x20100311;
}
片选1挂了一颗SRAM,片选2挂的DM9000A和SSD1963,采用地址A16 A17 A18做D/C跟两个芯片的片选

使用特权

评论回复
17
peugeoter|  楼主 | 2013-9-26 16:39 | 只看该作者
luomh98 发表于 2013-9-25 21:41
我的问题贴见https://bbs.21ic.com/forum.php?mod=viewthread&tid=213636&epclose=1
楼主能贴出你的芯片配置 ...

您这个帖子我打不开啊,提示没有结贴权限,呵呵

使用特权

评论回复
18
peugeoter|  楼主 | 2013-9-26 17:04 | 只看该作者
luomh98 发表于 2013-9-25 21:41
我的问题贴见https://bbs.21ic.com/forum.php?mod=viewthread&tid=213636&epclose=1
楼主能贴出你的芯片配置 ...

打开您的帖子了,我看你FSMC配置的为 扩展模式使能,用的B模式。
SPEC上说明用复用模式的话扩展模式不能打开。我的实际测试也是打开扩展模式后波形就不对了(忘记是nadv信号消失,还是nadv信号还在,而地址不输出了)。若您还有硬件环境的话可以这样配置实验一下。

使用特权

评论回复
19
luomh98| | 2013-9-26 20:16 | 只看该作者
谢谢,抽时间再琢磨一下

使用特权

评论回复
20
ic12580| | 2013-10-22 08:32 | 只看该作者
支持一下。DM9000EP很老的

使用特权

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

本版积分规则

2

主题

50

帖子

1

粉丝