打印

求助读写eeprom的问题

[复制链接]
2000|11
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
linshl|  楼主 | 2008-11-27 16:20 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我这个51程序就是以区位码加上偏移量做地址,然后读取这个地址上的字模数据 .
字模在27c020上,27c020是16位地址线并行连接P0和P2,并复用P0做接收
unsigned long  location;
unsigned long  la,*la3;
unsigned long  xdata *  la2;      
while(*s){
    qh=*s-0xa0;
    wh=*(s+1)-0xa0;
    location=94*(qh-1);
    location=(location+wh-1)*24+0x2000;                        
    la2=location; //这个可以通过编译,赋值后长度变短,丢失了低8位,怎么办
    la3=(unsigned long *)location;//编译不过,提示转换违规,为什么
    la3=location; //编译不过,提示转换违规,为什么
后面三行是我分别做三次测试了的 
麻烦会的朋友指点一下,附件中有图纸
相关链接:https://bbs.21ic.com/upfiles/img/200811/20081127161722346.rar

相关帖子

来自 2楼
hab2000| | 2008-11-28 12:45 | 只看该作者

研究一下C的头文件中的定义

#define XBYTE ((unsigned char volatile *) 0x20000L)
#define XWORD ((unsigned int volatile *) 0x20000L)

一般访问外部RAM可直接写成:

unsigned int i;

i= XBYTE[0x0000~0xffff];

当然最好定义XDATA类型指针

unsigned int xdata *Point;
   
    Point=要访问的外部RAM地址
以后Point按数组操作即可。


使用特权

评论回复
板凳
耕在此行| | 2008-11-27 18:43 | 只看该作者

呵呵 先帮你顶下

这年头用并口,有点麻烦吧.

使用特权

评论回复
地板
linshl|  楼主 | 2008-11-27 21:28 | 只看该作者

求助读写eeprom的问题

没办法,硬件工程师已经确定了,而且这个系统用了好多时,不过以前是汇编,现在要改成C,并再加一些功能。
老怀疑是不是在返回地址里的数据时少了某个操作,但自己又不知道,麻烦懂的朋友指点一下,感激不尽

使用特权

评论回复
5
zq1987731| | 2008-11-27 23:45 | 只看该作者

不妨试试:la2 = (xdata unsigned long *)location;

注意xdata关键字的使用,还有location既然声明为变量最好不要直接给地址赋值,靠编译器的自动类型转换毕竟是个不怎么好的习惯

使用特权

评论回复
6
linshl|  楼主 | 2008-11-28 09:14 | 只看该作者

还是不行

谢谢楼上的帮忙,但是这四个都通不过编译
la2 = (xdata unsigned long *)location;
la3 = (xdata unsigned long *)location;
上面两个是xdata附近句法误差,下面是转换错误
la2 = (unsigned long xdata*)location;
la3 = (unsigned long xdata*)location;
麻烦再看看

使用特权

评论回复
7
linshl|  楼主 | 2008-11-28 14:09 | 只看该作者

谢谢楼上的

谢谢楼上的,你说的第二个方法就是我顶楼贴出来的,不过你是uint,可是就是读不出来。你说的第一个方法是读绝对地址,我也试过,也是用XBYTE[],但读出来的都是FF,我怀疑是不是读之前缺少什么操作。麻烦朋友们再看看

使用特权

评论回复
8
weishg| | 2008-11-28 16:10 | 只看该作者

re

la2=location; //这个可以通过编译,赋值后长度变短,丢失了低8位,怎么办
la3=(unsigned long *)location;//编译不过,提示转换违规,为什么
la3=location; //编译不过,提示转换违规,为什么

你是想把location这个变量的地址给la2和la3的吧
但是location是变量  la2 la3是指针,按理来说第1 3句都是不合法的
第2句 进行了强制转换类型   但是是将location的地址转换还是location的内容转换过去 这个编译器无法得知  所以出错

可以这样试下la2= &location; 

如果是数组 可以直接用数组名给指针变量赋值,数组名就代表数组的首地址
但是变量不能这样用  可以用  &变量名 的方式取出地址

使用特权

评论回复
9
linshl|  楼主 | 2008-12-1 10:25 | 只看该作者

回weishg

怎么没看懂我的意思呢。
“我这个51程序就是以区位码加上偏移量做地址,然后读取这个地址上的字模数据” 
la3=location; location == &(字模数据)
la2,la3只是我的两次实验,就是带xdata和不带xdata的测试。
朋友们再帮我看看

使用特权

评论回复
10
chen3bing| | 2008-12-1 14:56 | 只看该作者

re

我试了一下,发现这样读出来数据一样:
*la2=location;

使用特权

评论回复
11
linshl|  楼主 | 2008-12-5 13:22 | 只看该作者

搞定了

搞定了,只要把xdata换成code就行了

使用特权

评论回复
12
weishg| | 2008-12-5 13:57 | 只看该作者

是编译行了 还是包括运行及读数也正确了

按这样改应该读不出正确的数据

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

6

帖子

0

粉丝