QQ登录

只需一步,快速开始

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 1958|回复: 11

如何操作external i/o bank?

[复制链接]
发表于 2005-10-27 11:27:46 | 显示全部楼层 |阅读模式
大牛们:我的4510 external i/o bank0接了一片CPLD,在uclinux应用程序里如何让CPLD和4510通信?开发包里有没有现成的驱动?没有的话,不写专门的驱动,在应用程序怎么操作地址和数据?没搞过,提十一下,谢了。
发表于 2005-10-27 21:02:06 | 显示全部楼层
定义一下外部IO的地址及数据总线宽度,然后就可以操作了!和功能寄存器差不多的!!
可以看看4510的手册!!
回复

使用道具 举报

 楼主| 发表于 2005-10-29 15:34:25 | 显示全部楼层
楼上的,0x3ff3010(EXTDBWTH)在应用程序里不能赋值,一旦出险赋值语句,程序一运行,板子就死了.
#define urefextcon (*(volatile unsigned char *) 0x3ff303
#define uextacon0 (*(volatile unsigned char *) 0x3ff300
#define uextacon1 (*(volatile unsigned char *) 0x3ff300c)
#define udatawidth (*(volatile unsigned char *) 0x3ff3010)
...
udatawidth=udatawidth | 0x00f00000;
//urefextcon=0x0ce2983fd;
//uextacon0=0x0FFFFFFF;
//uextacon1=0x0FFFFFFF;
fprintf(stderr,"%x\t%x\t%x\t%x\n",urefextcon,uextacon0,uextacon1,udatawidth);
如果注释掉udatawidth=udatawidth | 0x00f00000;运行结果0   0   0   56
打开注释,编译运行板子就死,这是什么原因?有知道的提示一下,先谢了.
回复

使用道具 举报

发表于 2005-10-29 18:58:17 | 显示全部楼层
你的程序在ADS下可以调试通过了吗??最好在ADS下调试通过了,再在系统上进行试验!!还有一般应该定义成volatile unsigned的吧,因为这些寄存器都是32位的啊!!
回复

使用道具 举报

发表于 2005-10-30 09:46:43 | 显示全部楼层
回复

使用道具 举报

发表于 2005-10-30 10:17:55 | 显示全部楼层
uClinux没有mmu,是实地址模式,所以直接对extio bank0 的实际地址进行读写及可,驱动可有可无,我个人认为,不知道各位大侠,有啥新的见解?
回复

使用道具 举报

发表于 2005-10-30 10:23:13 | 显示全部楼层
uClinux没有mmu,是实地址模式,所以直接对extio bank0 的实际地址进行读写及可,驱动可有可无,我个人认为,不知道各位大侠,有啥新的见解?
回复

使用道具 举报

 楼主| 发表于 2005-10-30 11:01:40 | 显示全部楼层
同意楼上的观点。但有个问题,操作extio bank0 地址之前,现要设几个于此相关控制寄存器,在应用程序里,一设寄存器,板子就死。
回复

使用道具 举报

发表于 2005-10-30 12:53:12 | 显示全部楼层
恩,对于uclinux而言 ,你要对extio bank 0 操作, 它的地址为 0X3fd00000开头,你直接操作就可以,不用设置相关控制寄存器. uclinux给你设置好了,你直接用就可以了
回复

使用道具 举报

发表于 2005-10-30 12:59:15 | 显示全部楼层
对于寄存器的操作,你在ADS 下,调试,会更直接明了
回复

使用道具 举报

 楼主| 发表于 2005-10-30 15:24:44 | 显示全部楼层
感谢楼上的回复.
首先我个人认为external bank 0的地址不是从0x3fd0000开始的.原因是uclinux开发包里有个头文件hardware.h是这样的
/************************************************/
/* DRAM Refresh & External I/O Control Register */
/************************************************/
#define ExtIOBase        (0x360<<0)
#define VSF                (0x1<<15)
#define REN                (0x1<<16)
#define tCHR                (0x0<<17)
#define tCSR                (0x0<<20)
#define RefCountValue        ((2048+1-(16*fMCLK))<<21)
#define rREFEXTCON        (RefCountValue|tCSR|tCHR|REN|VSF|ExtIOBase)
应该是从0x3600000开始的
第二,在我的程序里:
#define CPLD (*(volatile unsigned char *) 0x3600003)
...
CPLD=0x11;
fprintf(stderr,"%x\n",CPLD);
运行结果显示CPLD为零.这是为何?
我原来也认为external bank 0的地址是从0x3fd0000开始的,一运行死机,改成从0x3600000开始,不死机了,只是值不对.
第三,就是我把hardware.h里的相应设置改了一下,编译连接完了发现修改过的又被恢复了,这怎么回事?
先谢了!
回复

使用道具 举报

发表于 2005-10-31 08:20:28 | 显示全部楼层
hardware.h 文件里,有个设置extio的数据宽度和禁止的地方,那个地方也应该修改。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

GMT+8, 2024-11-22 01:53 , Processed in 0.089325 second(s), 16 queries .

© 2021 Powered by Discuz! X3.5.

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