如题,就拿DS引脚来说,假如我初始化时MP/MC=0,ovly=0,且操作外部RAM空间E000,当我设置ioport unsigned portE000=0x01后,是不是DS引脚就会自动拉低?PS和IS引脚呢?PS和IS引脚是不是也是同样的道理呢?
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.
如题,就拿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文件
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文件
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
wenlong zhang 说:Shine Zhang非常感谢!
哦,在��的指导下,我慢慢的知道的越来越多了,怎奈实在愚钝,还请多多指导;现在我用的C5416,具体我要使用那句话或者怎么设置,才可以拉高R/W#进行读操作,拉低R/W#进行写操作呢?
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空间连续读写,所以不能实现。
问题三:
没有这方面的说明,看数据手册时序图即可。
另外,拿块板子来实测一下更直观。