搜索
bottom↓
回复: 28

xintf所在的区域是物理片内存储?地址和on-Chip Memory一起编址?

[复制链接]

出0入0汤圆

发表于 2015-4-8 11:29:04 | 显示全部楼层 |阅读模式
小白学的是DSP28335,对xintf有点不解:1.xintf所在的区域是物理片内存储?如果是物理存储,何必扩展RAM或者Flash?如果不是,图中又说:xintf接口与CPU某个存储空间相对应。2.地址和on-Chip Memory一起编址?图中编出的地址正好错开(图不清楚,麻烦看看28335的数据手册)
其实对xintf访问外设的过程也有点不清楚,是不是这样的?假如用Zone6外扩RAM(256k*16):首先接线 /XZCS6--/CS,XRD--OE,XWE0--WE,XA[19:0]--A[19:0],XD[15:0]--D[15:0];然后init_xintf()(用于配置时序和ram通信);接着在cmd文件中,声明一段存储空间给Zone6(这里给的地址是和on-Chip Memory统一编址的)(片内空间不一定实实在在存在,直接映射到外部ram中了,所以当访问超过256k,就会出现错误);这样就可以实现访问外部ram就像是访问片内ram了,当访问Zone6时,/XZCS6会自动拉低。。以上是个人猜测,不知对不对

谢谢指导

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

阿莫论坛20周年了!感谢大家的支持与爱护!!

月入3000的是反美的。收入3万是亲美的。收入30万是移民美国的。收入300万是取得绿卡后回国,教唆那些3000来反美的!

出0入0汤圆

发表于 2015-4-8 19:53:00 | 显示全部楼层
猜测基本正确。
补充下,CMD 文件可以声明你外扩的大小,也可以不声明,这只影响变量编译时产生的地址可不可以覆盖到这个空间,覆盖多少(也就是你扩展 1M,但cmd可以只声明 512K或更小)。当然你在cmd 的声明也影响C运行时申请内存时分配不分配这块空间。
还有,如果片内内存够正常程序跑用的,不建议将扩展 ram 声明进入 cmd 文件  ——  这样做,可能导致运行时使用外部 ram,而关键代码如运行在外部 ram 里是没有内部 ram快的。我好久没用dsp 了,还有块片内空间,双口 ram 或是 cache,运行速度最快(也就是说,你甚至 cmd 文件里面连 其他内部 ram 都不使用,仅使用那个最高速的部分,当然这要你代码够用才行)。

外部 ram 比较慢,具体怎么慢的现在有点想不起来了,楼主可以自己查查;如果 cmd 不声明的空间,是不能直接申请,也不能被编译器使用的,但是你可以通过自己定义的指针访问,这也比较灵活 —— 这时可以肯定只有自己代码会引用这个空间,编译产生的代码不会在这个空间里。同样的,如果外扩 CPLD/FPGA 等,也不用(最好是不要)声明在 cmd 里面,直接通过指针访问即可。

还有,硬件连接时,数据线不需要一一对应,但是地址线最好一一对应,具体可能跟分页刷新等有关(外扩静态 ram 应该不需要一一对应),这点需要楼主自己确认。

出0入0汤圆

 楼主| 发表于 2015-4-9 10:13:43 | 显示全部楼层
alcohol 发表于 2015-4-8 19:53
猜测基本正确。
补充下,CMD 文件可以声明你外扩的大小,也可以不声明,这只影响变量编译时产生的地址可不 ...

有一个很专业的理解:xintf这是一个映射关系    也就是对这些映射空间操作   对应着对外部扩展存储器的操作从硬件角度出发   对XINTF对应的zone地址操作   相应的CS会拉低  外扩的存储区就会被选中   
外扩的需要一定的等待周期,所以会慢点。如图
关于指针访问,不是很理解。是不是这样的?如果编写了cmd,cpu分配地址时,就会单独的分配出来,不会被其他程序或数据占有;如果用指针,则不能完全确定,要看其他程序分配好空间没,若没分配好,则编译器可能就会用上指针指向的那一块区域。
还有小疑问,看了一个例程:
Uint16    *ExRamStart = (Uint16 *)0x100000;
InitXintf16Gpio();
然后就可以*(ExRamStart + 0x040000) = 0x5555;   这样操作外扩了,但是还没有初始化xintf的时序啊,怎么可以访问呢?(看了对应的存储区,是被改写了)

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2015-4-9 10:28:57 | 显示全部楼层
1.xintf所指向的存储区域为片外存储,也就是xintf的地址所指向的存储空间一定是片外的。跟片内无关,也和物理不物理的无关。另什么叫物理片内存储?要存储就得有Ram或者flash等物理芯片或者片内相应硬件。所以我觉得还是片内存储和片外存储更清晰。

2.我觉得楼主还没有理解存储空间与存储地址的关系,想必指针什么的也不熟?这个明白了,关于存储地址的问题自然明了。

关于这些:


其实对xintf访问外设的过程也有点不清楚,是不是这样的?假如用Zone6外扩RAM(256k*16):首先接线 /XZCS6--/CS,XRD--OE,XWE0--WE,XA[19:0]--A[19:0],XD[15:0]--D[15:0];然后init_xintf()(用于配置时序和ram通信);接着在cmd文件中,声明一段存储空间给Zone6(这里给的地址是和on-Chip Memory统一编址的)(片内空间不一定实实在在存在,直接映射到外部ram中了,所以当访问超过256k,就会出现错误);这样就可以实现访问外部ram就像是访问片内ram了,当访问Zone6时,/XZCS6会自动拉低。。以上是个人猜测,不知对不对

我的理解是这样的。

1.你不管是访问片内存储还是片外存储,都要在CMD文件内声明,然后再使用。

2.地址线序最好顺序连接(比如SRAM等大容量存储),也可以接某几根(比如一些可以挂在Xintf口的外设比如DM9000),但是数据线必须顺序连接(或接8根或接16根)。28335只能接外部SRAM或Flassh,不能接DRAM,所以必须顺序连接,要不然数据就错位了。

3.Zone6有1M个地址,也就对应1Mx16的存储空间。怎么访问超过256K就溢出了内?

4.你不用总是纠结片内还是片外存储。都是存储,地址不一样而已(虽然访问速度也不一样)。

5.当你访问到的地址实在Zone6的范围内,CS6自动拉低,无需牵挂。

出0入0汤圆

发表于 2015-4-9 10:29:58 | 显示全部楼层
alcohol 发表于 2015-4-8 19:53
猜测基本正确。
补充下,CMD 文件可以声明你外扩的大小,也可以不声明,这只影响变量编译时产生的地址可不 ...

数据线需要一一对应,28335的xintf口不能接Dram,也不存在分页刷新等问题。

出0入0汤圆

发表于 2015-4-9 10:35:25 | 显示全部楼层
lofky 发表于 2015-4-9 10:13
有一个很专业的理解:xintf这是一个映射关系    也就是对这些映射空间操作   对应着对外部扩展存储器的操 ...

你说没有初始化xintf,我觉得是你程序没看全。

另指针的问题。。。谷歌一下会理解的更深吧。

出0入0汤圆

 楼主| 发表于 2015-4-9 14:48:28 | 显示全部楼层
siyeb 发表于 2015-4-9 10:28
1.xintf所指向的存储区域为片外存储,也就是xintf的地址所指向的存储空间一定是片外的。跟片内无关,也和物 ...

关于上面的1.2.:小白确实对存储空间与存储地址的关系不大理解。因为看到cmd文件将Zone和其他区域一起编址,如图,所以产生了是否存在实实在在的这样的一个xintf存储区的疑问。。现在的理解是,这个地址直接映射到了外扩。
关于下面的3.:因为外扩是256k的RAM,所以我故意访问超过256k的大小的地方,结果出现了异常现象

出0入0汤圆

 楼主| 发表于 2015-4-9 14:56:46 | 显示全部楼层
siyeb 发表于 2015-4-9 10:35
你说没有初始化xintf,我觉得是你程序没看全。

另指针的问题。。。谷歌一下会理解的更深吧。 ...

程序是这样的,结果是这样

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

 楼主| 发表于 2015-4-9 14:57:47 | 显示全部楼层
lofky 发表于 2015-4-9 14:48
关于上面的1.2.:小白确实对存储空间与存储地址的关系不大理解。因为看到cmd文件将Zone和其他区域一起编 ...

cmd文件。。。。。。。。。。。。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

 楼主| 发表于 2015-4-9 15:00:33 | 显示全部楼层
lofky 发表于 2015-4-9 14:56
程序是这样的,结果是这样

Zone区域可能改了,但是没有初始化xintf,结果是对的

出0入0汤圆

发表于 2015-4-9 16:32:59 | 显示全部楼层
lofky 发表于 2015-4-9 15:00
Zone区域可能改了,但是没有初始化xintf,结果是对的

程序里的确没有调用配置xintf寄存器,这个我还真没试过,也有可能没有初始化全部按默认值走的吧。但是调用了IO配置,你要是把io配置也取消了肯定就不行了,有条件可以把寄存器初始化调用一下,看看结果有何不同。

出0入0汤圆

发表于 2015-4-9 16:34:39 | 显示全部楼层
lofky 发表于 2015-4-9 14:48
关于上面的1.2.:小白确实对存储空间与存储地址的关系不大理解。因为看到cmd文件将Zone和其他区域一起编 ...

如果片外挂的是256k的sram,你访问超过256k则不是xintf访问异常,是数据异常吧?也就是读出来的书根本不对,很随机~

出0入0汤圆

发表于 2015-4-9 16:42:20 | 显示全部楼层
lofky 发表于 2015-4-9 15:00
Zone区域可能改了,但是没有初始化xintf,结果是对的

压缩包里的cmd和你截图的不一样。

程序运行完了从0x1000000开始的内容应该是从0递增的啊,你这个都是5555,难道是第一个for完成哪里打的断点么。

出0入0汤圆

 楼主| 发表于 2015-4-9 16:55:56 | 显示全部楼层
siyeb 发表于 2015-4-9 16:32
程序里的确没有调用配置xintf寄存器,这个我还真没试过,也有可能没有初始化全部按默认值走的吧。但是调 ...

试过了,加了这个初始化函数。。结果没什么变化
void init_zone6(void)
{
        EALLOW;
    // Make sure the XINTF clock is enabled
        SysCtrlRegs.PCLKCR3.bit.XINTFENCLK = 1;
        EDIS;
        // Configure the GPIO for XINTF with a 16-bit data bus
        // This function is in DSP2833x_Xintf.c
        InitXintf16Gpio();

    // All Zones---------------------------------
    // Timing for all zones based on XTIMCLK = SYSCLKOUT
        EALLOW;
    XintfRegs.XINTCNF2.bit.XTIMCLK = 0;
    // Buffer up to 3 writes
    XintfRegs.XINTCNF2.bit.WRBUFF = 3;
    // XCLKOUT is enabled
    XintfRegs.XINTCNF2.bit.CLKOFF = 0;
    // XCLKOUT = XTIMCLK
    XintfRegs.XINTCNF2.bit.CLKMODE = 0;   

    // Zone 6------------------------------------
    // When using ready, ACTIVE must be 1 or greater
    // Lead must always be 1 or greater
    // Zone write timing
    XintfRegs.XTIMING6.bit.XWRLEAD = 1;
    XintfRegs.XTIMING6.bit.XWRACTIVE = 2;
    XintfRegs.XTIMING6.bit.XWRTRAIL = 1;
    // Zone read timing
    XintfRegs.XTIMING6.bit.XRDLEAD = 1;
    XintfRegs.XTIMING6.bit.XRDACTIVE = 3;
    XintfRegs.XTIMING6.bit.XRDTRAIL = 0;
   
    // don't double all Zone read/write lead/active/trail timing
    XintfRegs.XTIMING6.bit.X2TIMING = 0;

    // Zone will not sample XREADY signal  
    XintfRegs.XTIMING6.bit.USEREADY = 0;
    XintfRegs.XTIMING6.bit.READYMODE = 0;

    // 1,1 = x16 data bus
    // 0,1 = x32 data bus
    // other values are reserved
    XintfRegs.XTIMING6.bit.XSIZE = 3;
    EDIS;
   //Force a pipeline flush to ensure that the write to
   //the last register configured occurs before returning.  
   asm(" RPT #7 || NOP");
}

出0入0汤圆

发表于 2015-4-9 16:56:58 | 显示全部楼层
lofky 发表于 2015-4-9 16:55
试过了,加了这个初始化函数。。结果没什么变化
void init_zone6(void)
{

那就是走的默认值了。建议还是加上,更严谨些~

出0入0汤圆

 楼主| 发表于 2015-4-9 16:57:58 | 显示全部楼层
siyeb 发表于 2015-4-9 16:34
如果片外挂的是256k的sram,你访问超过256k则不是xintf访问异常,是数据异常吧?也就是读出来的书根本不 ...

是的,我是直接赋值,结果整个zone6区域都会变成那个值

出0入0汤圆

 楼主| 发表于 2015-4-9 17:01:54 | 显示全部楼层
siyeb 发表于 2015-4-9 16:42
压缩包里的cmd和你截图的不一样。

程序运行完了从0x1000000开始的内容应该是从0递增的啊,你这个都是555 ...

分别在这两个位置打了断点

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

 楼主| 发表于 2015-4-9 17:03:34 | 显示全部楼层
lofky 发表于 2015-4-9 16:57
是的,我是直接赋值,结果整个zone6区域都会变成那个值

走默认值?难道默认5555,aaaa,再递增?

出0入0汤圆

发表于 2015-4-9 17:06:00 | 显示全部楼层
lofky 发表于 2015-4-9 17:03
走默认值?难道默认5555,aaaa,再递增?

我说的默认值是xintf设置。。。不是程序

出0入0汤圆

发表于 2015-4-9 17:06:31 | 显示全部楼层
lofky 发表于 2015-4-9 17:01
分别在这两个位置打了断点

我就说么,看着像打了断点的。

出0入0汤圆

 楼主| 发表于 2015-4-9 17:10:11 | 显示全部楼层
siyeb 发表于 2015-4-9 17:06
我说的默认值是xintf设置。。。不是程序

哦哦,懂了

出0入0汤圆

发表于 2015-4-10 08:14:38 | 显示全部楼层
siyeb 发表于 2015-4-9 10:29
数据线需要一一对应,28335的xintf口不能接Dram,也不存在分页刷新等问题。

我的理解,和我之前设计的板子,都是数据线按布线调整过的,不是顺序连接的,这点经过实际考验,没什么好说的。

出0入0汤圆

发表于 2015-4-10 10:10:19 | 显示全部楼层
alcohol 发表于 2015-4-10 08:14
我的理解,和我之前设计的板子,都是数据线按布线调整过的,不是顺序连接的,这点经过实际考验,没什么好 ...

咦,第一次听说这种做法,您能不能详细说说?

出0入0汤圆

发表于 2015-4-11 11:19:39 | 显示全部楼层
siyeb 发表于 2015-4-10 10:10
咦,第一次听说这种做法,您能不能详细说说?

集合映射的概念,因为数学老师死的早,忘了是初中还是高中的内容了。

请参考:
http://www.hellodsp.com/bbs/foru ... id=49229&page=1

因为没有仔细研究过 SRAM 的内部拓扑,对于贴中的地址线是否可以任意互换,我个人还需要确认,但是数据线交换没问题。

出0入0汤圆

发表于 2015-4-13 09:46:25 | 显示全部楼层
alcohol 发表于 2015-4-11 11:19
集合映射的概念,因为数学老师死的早,忘了是初中还是高中的内容了。

请参考:

多谢,跟我想的一样,要在程序里做映射。按这种方式的话地址线也应该ok,简化了硬件,增加了软件开销(虽然不大)。

出0入0汤圆

发表于 2015-4-13 22:40:39 | 显示全部楼层
siyeb 发表于 2015-4-13 09:46
多谢,跟我想的一样,要在程序里做映射。按这种方式的话地址线也应该ok,简化了硬件,增加了软件开销(虽 ...

你没理解本质。
软件不需要做任何工作。

出0入0汤圆

发表于 2015-4-14 19:14:16 | 显示全部楼层
alcohol 发表于 2015-4-13 22:40
你没理解本质。
软件不需要做任何工作。

您这么一说我才豁然开朗,不知道是不是这样?

直接可以理解成DSP从乱序端口写,然后再从乱序端口读,数据是不会变的!因为存入的时候已经有了位调换,在读的时候,又会经过位调换,所以数据是不变的。

另外,非常感谢您的耐心解答。

出0入0汤圆

发表于 2015-4-14 19:23:17 | 显示全部楼层
siyeb 发表于 2015-4-14 19:14
您这么一说我才豁然开朗,不知道是不是这样?

直接可以理解成DSP从乱序端口写,然后再从乱序端口读,数 ...

是的,这样 Layout 可以很灵活。

出0入0汤圆

发表于 2015-4-15 09:26:38 | 显示全部楼层
alcohol 发表于 2015-4-14 19:23
是的,这样 Layout 可以很灵活。

再次感谢,有涨姿势了~
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-27 08:45

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表