如题,就拿DS引脚来说,假如我初始化时MP/MC=0,ovly=0,且操作外部RAM空间E000,当我设置ioport unsigned portE000=0x01后,是不是DS引脚就会自动拉低?PS和IS引脚呢?PS和IS引脚是不是也是同样的道理呢?
wenlong zhang87:
回复 Shine:
我是小白,只是想搞明白到底是怎么回事儿,谢谢您的回答!
是不是就是说:此时操作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 zhang87:
回复 Shine:
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 zhang87:
回复 Shine:
非常感谢你,大虾!!!
wenlong zhang87:
回复 Shine:
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#的地方????????没有找到相关描述的地方,请指导一下在那片手册里面,让我好好的学习消化一下,非常感谢!
Shine:
回复 wenlong zhang87:
1. 可以。
2. 理解正确。
3. IO空间访问要用PORTW, PORTR(汇编语言)或者ioport定义(C语言)