作者: JBB0523(彬彬有礼)
示例芯片:TMS320C6416
EMIF,即ExternalMemoryInterFace ,中文译为外部存储器接口。
EMIF可谓是困扰了我很久的一个接口。当然,相比于SPI,UART,I2C等总线协议来说,EMIF相对来说复杂一些……
========================两个问题============================
切不说EMIF怎么去用,单就表面的两个问题就能让人思考好久,但仍不得其解:
1)6416*有EMIFA和EMIFB两个EMIF接口,但有一个问题,为什么EMIFA的地址总线是从AEA3到AEA22共20位,EMIFB的地址总线是从BEA1到BEA20共20位,按理来说这种总线都是从0开始的呀,这到底是怎么回事?
2)TI文档《TMS320C6414, TMS320C6415, TMS320C6416 FIXED-POINT DIGITAL SIGNAL PROCESSORS(SPRS146N)》中的表3部分如下所示:
在表3中可以看到,对于EMIFB的每个CE片选空间,共有64MB的寻址空间;对于EMIFA的每个CE片选空间,共有256MB的寻址空间。
但是,请注意问题1中的提到了无论对于EMIFA还是EMIFB均只有20根地址线,我们可以计算一下,2^20=1M的寻址空间,这64MB和256MB到底是指什么呢?
对于高手来说当然弄懂也许是小问题,但对于初次接触这类问题的初学者来说,也许琢磨很久也弄不明白,我就是后者!
========================问题的答案============================
为了解释以下问题,首先明确一个单位度量:字节=8bit,半字=16bit,字=32bit,双字=64bit
解答问题1:
我们再次来理一理EMIF接口:
EMIFA有AEA3~AEA22共20根地址线和AED0~AED63共64根数据线,也就是说数据总结是“双字”的,再注意一下表3中有关寻址范围的单位是BYTES,一个双字等于八个字节,而如果寻址八个字节则需要3位地址线。嗯,这就对了,EMIFA的地址总线无低三位,其实是因为它的数据总线是64位的缘故,即数据总线对数据的操作是以八个字节为单位的,所以根本没必要再包含低三位的地址线了……
同理,对于EMIFB,数据总线为16位,即数据总线对数据的操作是以半字为单位的,所以根本没必要包含最低位地址线了……
当然,虽然EMIFA有64位数据线,我们可以选择使用EMIFA的低32位,或者是低16位,或者是低8位;EMIFB有16位数据线,我们可以只选择使用它的低八位;
以EMIFB使用16位数据总线为例,我们要在DSP中使用EMIFB时,访问的地址是偶数,比如0,2,4等等,再具体点说吧,使用EMIFB的CE2片选的地址范围,我们可以这样在CCS中编程使用EMIFB接口:
*(short int *)(0x68000000)= 0x11;
(short int *)(0x68000000)是将0x68000000强制类型转换成short int型的指针类型,即得到指向地址0x68000000的指针,而地址0x68000000中存是一个16bit的数据(其实是和0x68000001合在一起了吧);
*(short int *)(0x68000000)则是取出地址0x68000000中存储的值;
那么这时EMIFB的地址总线上是什么情况呢?访问地址0,当然20位地址总线都是0了;但若是*(short int *)(0x68000002)呢?注意,这时地址总线是1而不是2,因为地址总线是从BEA1开始的,而不是BEA0!
这时自然就出现了第2个问题,下面我们来解答。
解答问题2:
首先看一个TI官方文档:《TMS320C6000 DSP External Memory Interface(EMIF) Reference Guide【SPRU266E】》,这个文档一开始就讲了很多存储器类型,本来是讲EMIF接口的,讲存储器干吗?
下面看表4-3
注意表中的第一列是memory type,即存储器类型,共有三种,异步静态RAM(ASRAM),可编程同步存储器,同步动态RAM(SDRAM)
然后再注意第三列是maximum addressable bytes per CE space,即每CE片选空间最大可寻址字节数,其中对于前两种类型的存储器都是对应相同的,但对于SDRAM来说则变为了前面两者的32倍!
再看表4-3,对于memory witdth为16和64的请况,我们可以很容易作出如下计算:
20根地址线,寻址范围为2^20=1M;对于EMIFA来说,他的数据总线为双字(8bytes),则它的寻址字节数为1M*8bytes=8MBytes;对于EMIFB来说,它的数据总线为半字(2bytes),则它的寻址范围为1M*2bytes=2MBytes。
这与表中是吻合的,但是对于64位数据总线中的256MB的寻址范转和16位数据总线中的64MB的寻址范围是怎么回事呢?
在此不过多说了,只是提一句吧,对于SDRAM来说,它是分行地址和列地址的,即对其进行访问时分行和列之分,如果行地址有10位,列地址有16位,那么相当于寻址范围为2^10 * 2^16 = 2^26 = 64M。
看到这个计算明白了吧……
我们可以得出如下结论:
EMIFA的每个CE片选空间相对于SDRAM来说寻址范围256MB,而相对于其它类型的memory为8MB;EMIFB的每个CE片选空间相对于SDRAM来说寻址范围64MB,而相对于其它类型的memory为2MB。
这里注意一下单位,如果仅就地址总线的寻址范围来说,它的范围就是多少个地址,只有配以数据总线后才能说它的寻址范围为多少字节;比如说仅就20位的地址总线来说它的寻址范围就是1M=2^20个,但如果配上8位的数据总线则寻址范围为1MB,如果是16位的数据总线则寻址范围为2MB,64位数据总线则是8MB……
注:我也是琢磨了好久才琢磨出来了这么一个结果,文中内容都是一些个人理解,只供参考,不作为答案!
参考文献:
1)《TMS320C6414, TMS320C6415, TMS320C6416 FIXED-POINT DIGITAL SIGNAL PROCESSORS(SPRS146N)》
2)《TMS320C6000 DSP External Memory Interface(EMIF) Reference Guide(SPRU266E)》
3)http://www.hellodsp.com/bbs/forum.php?mod=viewthread&tid=990&highlight=EMIF
4)http://www.hellodsp.com/bbs/forum.php?mod=viewthread&tid=22775&highlight=EMIF