发新帖我要提问
12
返回列表
打印

FMSC 16位 模式地址线问题

[复制链接]
楼主: trihook
手机看帖
扫描二维码
随时随地手机跟帖
21
大家好,我是LZ的同事
简单来说
1)ASIC只能对偶地址进行字读,不能字节读
2)ASIC的外部地址是按8位寻址的,字读的数据是由2个地址的数据组成的,连续读的偏移量应该为2(第一次2000->第二次2002)
3)MPU的外部地址是按16位寻址的,连续读的偏移量为1(第一次2000->第二次2001)
4)由2)和3)可得,第二次读的是ASIC的2001,由1)可知,不能对奇地址进行字读,出现问题
kaedewang 发表于 2010-11-3 17:14


我不是很明白你的描述,能否按照我在15楼的表示方式,列出几个例子说明?

关于19楼的说明,我有疑问:
2)ASIC的外部地址是什么?与STM32什么关系?
“字读的数据是由2个地址的数据组成的”,这里每个地址的寻址范围是多少?1个字节还是2个字节?
3)MPU是什么?与STM32什么关系?
“MPU的外部地址是按16位寻址的”,每次读操作,读出几个字节?1个字节还是2个字节?

使用特权

评论回复
22
kaedewang| | 2010-11-3 17:31 | 只看该作者
你已经配置了FSMC_MemoryDataWidth_16b,也就是说每次操作(读写)外部存储器都是以16位进行的,下面我以几个例子(不考虑地址高位)说明STM32是如何操作的,看看与你看到的是否一致:

1)对地址0x0002读16位数据0x4321 ...
香水城 发表于 2010-11-3 14:29

这样做的话,在第一步就会有问题,因为我们的ASIC是不支持对奇地址进行读操作的

使用特权

评论回复
23
香水城| | 2010-11-3 17:37 | 只看该作者
这样做的话,在第一步就会有问题,因为我们的ASIC是不支持对奇地址进行读操作的
kaedewang 发表于 2010-11-3 17:31


这是否意味着,你的ASIC的AD0在作为地址时,始终应该为"0"? 如果是这样,当AD[0] = 0、AD[1] = 1、AD[15:2] = 0时,即输入地址为0x0002时,读的时候读出几个字节?写的时候写入几个字节?

使用特权

评论回复
24
huatong| | 2010-11-3 18:01 | 只看该作者
我的意思是在地址数据复用模式下, 我用16位宽度访问的时候就有问题了。
如下图:
STM32内部    STM32外部    连接的ASIC
HADDR[ 1] --- AD[ 0] ------AD[0]
HADDR[ 2] --- AD[ 1] ------AD[1]
-
-
HADDR[16] --- AD[ ...
trihook 发表于 2010-11-3 10:16


有些不同的看法,你的程序要 0x0002地址的数据,你就直接告诉STM32要0x0002的地址的数据,
STM32会在地址引脚上输出0x0001(因为STM32内部右移了一位),如果这时你只要8位的数据,
它就返回 D0-D7 的数据给你.如果你要高8位的数据(相当于是0x0003的地址),它就会将D8-D15的数据返回给你.
所以我看不到0x0004的这个地址是怎样来的,如果你要0x0004的地址的数据,STM32的地址引脚上会出现0x0002,
这时相当于是要取出0x0004/0x0005这个地址的2个8位数据,或者是0x0004地址上的一个16位数据.

这是我的个人观点.

使用特权

评论回复
25
kaedewang| | 2010-11-3 18:13 | 只看该作者
本帖最后由 kaedewang 于 2010-11-3 18:16 编辑

这是否意味着,你的ASIC的AD0在作为地址时,始终应该为"0"? 如果是这样,当AD[0] = 0、AD[1] = 1、AD[15:2] = 0时,即输入地址为0x0002时,读的时候读出几个字节?

2个字节(0x0002的数据和0x0003的数据)

写的时候写入几个字节?

可1个字节可2个字节(有WRLZ和WRHZ)

使用特权

评论回复
26
kaedewang| | 2010-11-3 18:16 | 只看该作者
回答21楼
2)ASIC的外部地址是什么?与STM32什么关系?

ASIC外部地址=STM32 AD

“字读的数据是由2个地址的数据组成的”,这里每个地址的寻址范围是多少?1个字节还是2个字节?

1个字节

3)MPU是什么?与STM32什么关系?

MPU=STM32

“MPU的外部地址是按16位寻址的”,每次读操作,读出几个字节?1个字节还是2个字节?

2个字节

使用特权

评论回复
27
kaedewang| | 2010-11-3 18:17 | 只看该作者
ASIC 可以工作在16模式下。
但每个地址 对应数据是 1byte

>>那么你把这个ASIC配置成8bit模式好了。你的memory每个地址对应1个字节;STM32的FSMC也不会给你进行地址移位了。 ...
lut1lut 发表于 2010-11-3 17:26


ASIC固定为16bit模式,但是是按1个字节寻址的

使用特权

评论回复
28
kaedewang| | 2010-11-3 18:31 | 只看该作者
不知道这样说明,能不能理解

使用特权

评论回复
29
香水城| | 2010-11-3 18:32 | 只看该作者
我在23楼的这个问题“这是否意味着,你的ASIC的AD0在作为地址时,始终应该为"0"?”,在25楼得到了肯定的回答。

因此可以说,STM32不能直接无缝地与你的ASCI连接,以连续的地址访问ASCI中的数据,只能把地址右移一位后以16位或8位方式访问,而不能用32位方式访问。在STM32内部,USB专用的RAM区也是不能用32位的方式访问的。

使用特权

评论回复
30
香水城| | 2010-11-3 18:35 | 只看该作者
谢谢28楼的图,这进一步确认了我在29楼的结论是正确的,即在STM32上不能用32位的方式访问你的ASCI器件。

使用特权

评论回复
31
kaedewang| | 2010-11-3 18:36 | 只看该作者
我在23楼的这个问题“这是否意味着,你的ASIC的AD0在作为地址时,始终应该为"0"?”,在25楼得到了肯定的回答。

因此可以说,STM32不能直接无缝地与你的ASCI连接,以连续的地址访问ASCI中的数据,只能把地址右移一 ...
香水城 发表于 2010-11-3 18:32


多谢,看来还是不行啊,其实只要在16位操作的时候ADDR不用自动移位就可以解决问题了

使用特权

评论回复
32
香水城| | 2010-11-3 18:49 | 只看该作者
多谢,看来还是不行啊,其实只要在16位操作的时候ADDR不用自动移位就可以解决问题了
kaedewang 发表于 2010-11-3 18:36


STM32在对16位操作的时候,其实是考虑到访问外部SRAM或NOR时,地址最低位始终都是"0",为了能够不浪费这条地址线,所以采取了自动移位ADDR再输出的设计,谁曾想在你这里出问题了,:lol

没办法,你只能凑合凑合了,:L

使用特权

评论回复
33
kaedewang| | 2010-11-3 20:06 | 只看该作者
如果有一个寄存器可以选择开启或关闭移位功能,就更人性化了

使用特权

评论回复
34
trihook|  楼主 | 2010-11-3 21:13 | 只看该作者
如果有一个寄存器可以选择开启或关闭移位功能,就更人性化了
kaedewang 发表于 2010-11-3 20:06


i think so.
这样就是万能了,连啥都可以

使用特权

评论回复
35
香水城| | 2010-11-4 08:35 | 只看该作者
可以研究研究,:handshake

使用特权

评论回复
36
香水城| | 2010-11-4 17:40 | 只看该作者
本帖最后由 香水城 于 2010-11-4 17:41 编辑
所以才问,是否可以把内部自动移位地址的这个给关闭。
在地址数据线非复用模式下是没问题的。
但是在地址数据线复用模式下就出问题了。我没办法错位地址连接,因为AD0的D0是不能错位的。 ...
trihook 发表于 2010-11-3 10:38


我很好奇,为什么6楼说“在地址数据线非复用模式下是没问题的。”?要知道,STM32输出的地址信号,在复用模式与非复用模式时都是自动错位的。

请问,你的硬件信号是怎么接的?

使用特权

评论回复
37
trihook|  楼主 | 2010-11-5 08:22 | 只看该作者
我很好奇,为什么6楼说“在地址数据线非复用模式下是没问题的。”?要知道,STM32输出的地址信号,在复用模式与非复用模式时都是自动错位的。

请问,你的硬件信号是怎么接的? ...
香水城 发表于 2010-11-4 17:40

如果是16位非复用模式的
STM32内部    STM32外部    连接的ASIC
HADDR[ 1] --- A[ 0] ------  A[1]
HADDR[ 2] --- A[ 1] ------A[2]
硬件上再做一次错位

使用特权

评论回复
38
香水城| | 2010-11-5 08:41 | 只看该作者
如果是16位非复用模式的
STM32内部    STM32外部    连接的ASIC
HADDR[ 1] --- A[ 0] ------  A[1]
HADDR[ 2] --- A[ 1] ------A[2]
硬件上再做一次错位
trihook 发表于 2010-11-5 08:22


难道你的ASIC没有A[0],或者是把A[0]接地了?

使用特权

评论回复
39
trihook|  楼主 | 2010-11-5 11:39 | 只看该作者
本帖最后由 trihook 于 2010-11-5 11:42 编辑

对的 A【0】 接地 ,这样就ok了。大家地址都对齐了。
但地址数据复用的情况就不能这么干了, 因为数据也会跟着错位。

使用特权

评论回复
40
helezh| | 2013-6-19 07:47 | 只看该作者
:)

使用特权

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

本版积分规则