This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

5416 访问外部存储器的疑惑

Other Parts Discussed in Thread: TMS320VC5416

你好,我的dsp开发板中有例程访问外部存储器的。它是通过定义io变量 port8000 ,然后对其赋值,然后外部存储器就映射到了对应的数据空间的0x8000之后的空间。我有2个问题:

1、ioport变量的port8000中的8000为什么是8000,我只知道这个8000对应的是io空间的地址0x8000,我的理解是这个变量控制了几个io输出的电平高低,从而对外部存储器进行了片选和高地址位的选择,不知道我这么理解是否有问题?我不理解为什么是port8000而不是别的值,例如port5000之类的,我的dsp是tms320vc5416。

2、如果我定义了一个全局数组SRC「」,并且在程序开头用#pragma伪指令将它定位在.src段,.src段又被定位在存储器0x8000开始处。那么当我改变外部存储器(改为存储器B)的时候,调用该数组时,是不是内容已经变为存储器B低地址为0x8000处的内容了?在cmd文件中,可否对外部存储器进行分别的定位?即,存储器A定位在某个高于16未的地址,存储器B定位于另一个地址,然后对他们再进行sections的段分配,从而实现虽然低16位相同(例如段的起始地址都是0x8000),但是可以用不同的数组去分别表示?


期待你的答复,谢谢^_^

  • 你好,

    1. c5416的I/O空间是64KW(0x0000~0xFFFF)大小, 要访问这64K I/O空间, 需要用ioport关键字定义地址,可以参考下面的user guide第5.4.2 The ioport Keyword章节。
    http://www.ti.com/lit/ug/spru103g/spru103g.pdf

    2.  .scr段名在cmd文件中只能被分配一次, 要么存储器A, 要么存储器B

  • 你好,第一个问题你说的文档我看过了,可是没能解决我的疑问,请您回答详细一点;第二个问题追问,那么要访问外部存储器的话只能用指针的方式了?

  • 1. 用ioport定义相应地址后, DSP知道是要访问IO空间地址, 会自动产生相应的读写信号,地址信号,数据信号。见手册5.5.3 I/O Read, 5.5.4 I/O Write IO口读写时序。

    2. 不是一定要用指针方式访问。

  • 谢谢你的回复。

    1、请问io口与io地址的对应关系是怎样配置的?应该查阅哪个文档?

    2、不用指针的方法是指什么,请问可不可以给个例子?(我想用一个比较大的数组在外部存储器存放数据)

    期待你的回复^_^

  • 1.IO空间地址0000~FFFF,外设对应到哪个IO空间地址,看EMIF口的地址线怎么连的。可以参考下面文档Chapter 10章节。

    2. 用ioport定义地址变量后, 直接往地址变量读写数据。c54x不支持连续访问IO空间地址,要逐个定义IO地址并访问,如下

    ioport unsigned port10;
    ioport unsigned port11;
    .....
    port10 =a;
    port11=11;

  • 1.IO空间地址0000~FFFF,外设对应到哪个IO空间地址,看EMIF口的地址线怎么连的。可以参考下面文档Chapter 10章节。
    http://www.ti.com/lit/ug/spru131g/spru131g.pdf

  • 你好,谢谢你的回复。

    根据你的回复,我知道了IOPORT与外设的对应的关系。可是我的第二个问题没有得到解决:假设我的IOPORT port8000 = 0x000F,其中的低四位控制的是一个1M的外部存储器的高4位地址线(假设它的使能位什么的都是set了的)。那么我想访问这个存储器中的某个部分,例如储存一个16KB大小的数组src[]进去,那我是不是只能通过例如:

    port8000 = 0x000F;

    for (i = 0; i < 0x4000; i++)

        *(int *)(0x8000+i) = src[i];

    的操作来存储?我想用数组来访问,请问应该怎么操作?

  • 这种写法行不通,要一个个定义I/O port地址,不能用指针连续访问。

    如果用汇编的话,可以考虑用下面的方式。
    http://www.ti.com/lit/an/spra507/spra507.pdf

  • Hi Shine Zhang

    您说上面不可以,但是这种情况可以吗?

    ioport unsigned int port8000;//SRAM地址切换控制,32K为1页。地址外部0x8000

    unsigned      int  *ExRamStart = (unsigned  int *)0x8000;

    port8000=0x11;

        for(i = 0; i < 0x8000; i++)
        {
            *(ExRamStart + i) = 0x5555;
        }

    我测试的是可以的,这个和上面什么区别呢?这个和您说的不能连续访问和冲突啊?

    期待你的回答

  • unsigned      int  *ExRamStart = (unsigned  int *)0x8000;你这种用法是针对0x8000的data, program空间,而不是针对I/O空间的地址连续访问。

  • Shine Zhang非常感谢!
       谢谢您对我这种菜鸟的耐心回答, 您看我这样理解您的分析对不对哈!
        由于我的这句设置unsigned      int  *ExRamStart = (unsigned  int *)0x8000;
        我下面的操作是对0x8000的data,program空间的操作,而data,program是肯定可以连续访问的;
        而上面那位哥们Christine mike是想连续访问IO空间的地址,而IO空间的地址又只能一个一个的定义,然后才能够连续访问,另外用上面链接中的方法也能访问;
        看来我对data,program,io还是有点糊涂,不清不楚的,您的火眼金睛厉害,膜拜!

  • wenlong zhang 说:

    Shine Zhang非常感谢!
       谢谢您对我这种菜鸟的耐心回答, 您看我这样理解您的分析对不对哈!
        由于我的这句设置unsigned      int  *ExRamStart = (unsigned  int *)0x8000;
        我下面的操作是对0x8000的data,program空间的操作,而data,program是肯定可以连续访问的;
        而上面那位哥们Christine mike是想连续访问IO空间的地址,而IO空间的地址又只能一个一个的定义,然后才能够连续访问,另外用上面链接中的方法也能访问;
        看来我对data,program,io还是有点糊涂,不清不楚的,您的火眼金睛厉害,膜拜!

    理解正确!