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.

C5416的DS、PS、IS、MSTRB引脚具体是怎么设置的呢?还是自动设置的呢?

Other Parts Discussed in Thread: TMS320VC5416

如题,就拿DS引脚来说,假如我初始化时MP/MC=0,ovly=0,且操作外部RAM空间E000,当我设置ioport unsigned portE000=0x01后,是不是DS引脚就会自动拉低?PS和IS引脚呢?PS和IS引脚是不是也是同样的道理呢?

  • 1.这个可以对照数据手册上的Figure 3-2. Program and Data Memory Map图看, 外部RAM空间E000如果映射到Data program space的话,是由DROM位控制, 跟MP/MC, OVLY无关,往E000地址读写, DS管教会自动拉低。
    http://www.ti.com/lit/ds/symlink/tms320vc5416.pdf

    2. ioport unsigned portE000=0x01, 这句是对IO空间操作, 所以IS管教会拉低, PS, DS不会变化。

  • 我是小白,只是想搞明白到底是怎么回事儿,谢谢您的回答!

    是不是就是说:此时操作IO空间地址线,此时地址线为A15-A0依次为:1110 0000 0000 0000(如果我用逻辑分析仪抓时序的话,可以看到这16位的电平是吗?),然后数据线上面就会出现D7-D0依次为:0000 0001(如果我用逻辑分析仪抓的话,可以看到这8位的电平是吗?)。

    那么如果我分别设置:ioport unsigned int port8000;

    port8000=0x11;

    port8000=0x13;

    port8000=0x15;是相当于在统一地址空间分别写入不同数据吗?为了您查看方便我把代码附上,只有main.c和CMD文件

    main_and_CMD.rar
  • Shine Zhang非常感谢!

    看了您对《5416 访问外部存储器的疑惑》问题的回答,我突然傻了,不知道怎么区分什么时候读什么是写呀?您说PS#、DS#、IS#会自动拉低,所以我就想当然的认为R/W#、MSTRB#、IOSTRB#也是自动拉低,操作完成就会自动拉高,真实情况是这样吗?当我看到spru131g文档(TMS320C54xDSP Reference Set Volume 1:CPU and Peripherals)的时候Figure 10-8时,突然不明白什么读什么时候写呢?

    (在我读http://www.ti.com/lit/ug/spru131g/spru131g.pdf,的时候,又发现下面描述,难道是以此来区分读写操作的吗?)

    port10 = a;    //此时是写a到port10

    b = port11;    //此时从port11读取到b

  • wenlong zhang 说:

    我是小白,只是想搞明白到底是怎么回事儿,谢谢您的回答!

    是不是就是说:此时操作IO空间地址线,此时地址线为A15-A0依次为:1110 0000 0000 0000(如果我用逻辑分析仪抓时序的话,可以看到这16位的电平是吗?),然后数据线上面就会出现D7-D0依次为:0000 0001(如果我用逻辑分析仪抓的话,可以看到这8位的电平是吗?)。

    那么如果我分别设置:ioport unsigned int port8000;

    port8000=0x11;

    port8000=0x13;

    port8000=0x15;是相当于在统一地址空间分别写入不同数据吗?为了您查看方便我把代码附上,只有main.c和CMD文件



    1. 是的,可以在地址线和数据线上量到你读写的数据。

    2. 是的,理解正确。

    3.  cmd文件中,只要写一个PAGE0, PAGE1就可以了。

  • wenlong zhang 说:

    Shine Zhang非常感谢!

    看了您对《5416 访问外���存储器的疑惑》问题的回答,我突然傻了,不知道怎么区分什么时候读什么是写呀?您说PS#、DS#、IS#会自动拉低,所以我就想当然的认为R/W#、MSTRB#、IOSTRB#也是自动拉低,操作完成就会自动拉高,真实情况是这样吗?当我看到spru131g文档(TMS320C54xDSP Reference Set Volume 1:CPU and Peripherals)的时候Figure 10-8时,突然不明白什么读什么时候写呢?

    (在我读http://www.ti.com/lit/ug/spru131g/spru131g.pdf,的时候,又发现下面描述,难道是以此来区分读写操作的吗?)

    port10 = a;    //此时是写a到port10

    b = port11;    //此时从port11读取到b



    什么时候读什么时候写由R/W信号决定。读的时候,R/W信号高电平,写的时候,R/W信号输出低电平。

  • 非常感谢你,大虾!!!

  • Shine Zhang非常感谢!

        哦,在您的指导下,我慢慢的知道的越来越多了,怎奈实在愚钝,还请多多指导;现在我用的C5416,具体我要使用那句话或者怎么设置,才可以拉高R/W#进行读操作,拉低R/W#进行写操作呢?

  • wenlong zhang 说:

    Shine Zhang非常感谢!

        哦,在��的指导下,我慢慢的知道的越来越多了,怎奈实在愚钝,还请多多指导;现在我用的C5416,具体我要使用那句话或者怎么设置,才可以拉高R/W#进行读操作,拉低R/W#进行写操作呢?



    没事,都有一个学习的过程,有问题大家可以一起探讨。

    往地址里写数据,如*(0x1000)=0x1, RW信号会自动拉低表示写信号。
    往地址里读数据,如i=*(0x1000), RW信号会自动拉高表示读信号

  • Shine Zhang非常感谢!

        您太谦虚了,我这个人很笨,又没人指导,全靠个人,网上乱窜,跟个无头苍蝇一样,但是我不是那么容易放弃一件事。
        总结一下哈,经过您的指导,让我明白了:
        1,对于data空间地址的读写操作是通过对地址的的直接读取的,例如
            向data地址里写数据,如*(0x1000)=0x1, R/W#信号、DS#信号、MSTRB#信号会自动拉低表示写信号。
            从data地址里读数据,如i=*(0x1000),     MSTRB#、DS#信号会自动拉低,R/W#信号会自动拉高表示读信号。
            且data空间地址肯定可以连续访问,哈哈
            问题一:有没有办法让R/W#一直拉低呢?即使我连续读写呜呜呜
                我在手册:http://www.ti.com/lit/ds/symlink/tms320vc5416.pdf的第五章Fugire 5-6Consecutive Mode Memroy Reads
                看到连续读可以使MSTRB#、DS#一直拉低,R/W#一直拉高,我下面这样是否能实现:
                int *AddressIncrease = *(0x1000);
                int a[];
                for(i=0;i<1024;i++)    
                {
                    a[i]=*AddressIncrease;
                }
                在这段读的时间内,MSTRB#、DS#一直拉低,R/W#一直拉高,是否是这样呢?若不能,代码该如何正确编写呢?

        2,对于program空间地址的读写操作是通过对地址的的直接读取的,例如
            向program地址里写数据,如*(0x1000)=0x1, RW信号、PS#信号、MSTRB#信号会自动拉低表示写信号。
            从program地址里读数据,如i=*(0x1000),     MSTRB#、PS#信号会自动拉低,RW信号会自动拉高表示读信号。
            且program空间地址肯定可以连续访问,哈哈

        3,对于IO空间地址的读写操作是通过对地址的的直接读取的,例如
            向IO空间地址里写数据,如*(0x1000)=0x1, RW信号、IS#信号、IOSTRB#信号会自动拉低表示写信号。
            从IO空间地址里读数据,如i=*(0x1000),     IOSTRB#、IS#信号会自动拉低,RW信号会自动拉高表示读信号。
            且IO空间地址只能一个一个的定义,然后才能连续访问,另外也可以使用下面这种方式进行连续访问:
            start:
                ORM   #00020h,pmst    ;set OVLY=1
                STM   #01000h,ar2     ;pointer to data memory address
                STM   #02000h,ar3     ;pointer for I/O port address
                MVMD  ar3,(portloc+1) ;update PORTW instruction
                              ; with new address
                STM   #table_length,BRC  ;initialize BRC
                RPTB  end_block-1
            portloc:     PORTW *ar2+,0h        ;copy word from data space to
                               ; I/O space and increment
                                           ; data memory address
                MAR   *ar3+           ; increment I/O memory address
                MVMD  ar3,(portloc+1) ;update PORTW instruction
                                      ;with new address
                NOP                   ;wait for MVMD pipeline latency
                NOP                   ;wait for MVMD pipeline latency
                              ;(portloc+1) is now updated
            end_block:
            问题二:1、如何把上面的汇编转成C,如何转换?看一下哈,我转化得对不对?谢谢您
                    #define PMST     *(0x1D)//PMST寄存器的地址
                    #define AR2     *(0x12)//AR2寄存器的地址
                    #define AR3     *(0x13)//AR3寄存器的地址
                    ioport    unsigned port2000; //IO空间
                    
                    PMST = 0x20;
                    AR2  = *(0x1000);
                    AR3  = *(port2000);
                    //太笨啊,下面就不知道怎么写啦

                    
                3、我想让IOSTRB#信号一直拉低,我怎么去做呢?呜呜呜,我想实现一直拉低IOSTRB#信号,我的脑袋太死,肯定不会这样吧
                    ioport    unsigned port2000; //IO空间
                    ioport    unsigned port2001; //IO空间
                    ioport    unsigned port2002; //IO空间
                    ioport    unsigned port2003; //IO空间
                    。。。
                    ioport    unsigned port23FF; //IO空间

                    int a[1024];
                    a[0]=port2000;
                    a[1]=port2001;
                    a[2]=port2002;
                    ...
                    a[1021]=port23fd;
                    a[1022]=port23fe;
                    a[1023]=port23ff;
                //脑袋太死板了,怎么实现持续拉低IOSTRB#

            

        问题三:大侠,我还有一个问题,我又重新看了一遍
        TMS320C54x DSP Reference Set Voulume 1:CPU and Peripherals(SPRU131F)第三章Memory和TMS320VC5416 Fixed-Point Digital Sigal Processor Data Manual(SPRS095P)第3.1Memory中
        去寻找关于自动设置PS#/DS#/IS#/MSTRB#/IOSTRB#的地方????????没有找到相关描述的地方,请指导一下在那片手册里面,让我好好的学习消化一下,非常感谢!

  • 1. 可以。

    2. 理解正确。

    3. IO空间访问要用PORTW, PORTR(汇编语言)或者ioport定义(C语言)

  • 问题二:
    1. 不能通过C语言对IO空间连续操作。

    2. C语言里不能对IO空间连续读写,所以不能实现。

  • 问题三:

    没有这方面的说明,看数据手册时序图即可。

    另外,拿块板子来实测一下更直观。