单片机寄存器问题 急....熬了两天了

stdio_h_0   2008-10-20 11:20 楼主
单片机连接图:
AT89C51RC
P0                AD0~AD7
P2.0(A8)        A0(MCX314)
P2.1(A9)        A1(MCX314)
P2.2(A10)        A2(MCX314)
P2.3(A11)        A3(MCX314)
P2.4(A12)        激光开关信号控制I/O
P2.5(A13)        A(74LS138)
P2.6(A14)        B(74LS138)
P2.7(A15)        C(74LS138)
74LS138片选值:
片选                输入                        芯片说明                片选控制
                A13        A14        A15                       
CSPD12                0        0        0        USB通讯芯片PDUSBD12        P2=P2|0x1f
CSK9                1        0        0        64MB的FLASH,K9F1208        P2=P2|0x3f
CS314                0        1        0        运动控制芯片MCX314AL        P2=P2|0x5f
CS558A                1        1        0        第一激光能量D/A                P2=P2|0x7f
CS558B                0        0        1        第二激光能量D/A                P2=P2|0x9f
CSOCMJC                1        0        1        LCD(128*64)                P2=P2|0xbf
MCX314中8位数据总线的寄存器地址映射:
寄存器                A3        A2        A1        A0(MCX314)
WR0L                0        0        0        0
WR0H                0        0        0        1               
WR1L                0        0        1        0                         
WR1H                0        0        1        1
WR2L                0        1        0        0
WR2H                0        1        0        1
WR3L                0        1        1        0
WR3H                0        1        1        1
WR4L                1        0        0        0       
WR4H                1        0        0        1
WR5L                1        0        1        0
WR5H                1        0        1        1
WR6L                1        1        0        0
WR6H                1        1        0        1
WR7L                1        1        1        0
WR7H                1        1        1        1
RR0L                0        0        0        0
RR0H                0        0        0        1               
RR1L                0        0        1        0                         
RR1H                0        0        1        1
RR2L                0        1        0        0
RR2H                0        1        0        1
RR3L                0        1        1        0
RR3H                0        1        1        1
RR4L                1        0        0        0       
RR4H                1        0        0        1
RR5L                1        0        1        0
RR5H                1        0        1        1
RR6L                1        1        0        0
RR6H                1        1        0        1
RR7L                1        1        1        0
RR7H                1        1        1        1



问题:
一、根据我的接线,片选是否正确?如果不对,应该是什么值?


二、我个人认为MCX314的寄存器映射如下:
#define WR0L XBYTE[0x4000]                  //命令寄存器
#define WR0H XBYTE[0x4100]               
#define WR1L XBYTE[0x4200]                  //模式寄存器1
#define WR1H XBYTE[0x4300]               
#define WR2L XBYTE[0x4400]                  //模式寄存器2
#define WR2H XBYTE[0x4500]               
#define WR3L XBYTE[0x4600]                  //模式寄存器3
#define WR3H XBYTE[0x4700]               
#define WR4L XBYTE[0x4800]                  //输出寄存器
#define WR4H XBYTE[0x4900]               
#define WR5L XBYTE[0x4a00]                  //插补模式寄存器
#define WR5H XBYTE[0x4b00]               
#define WR6L XBYTE[0x4c00]                  //写数据寄存器最小数据位
#define WR6H XBYTE[0x4d00]               
#define WR7L XBYTE[0x4e00]                  //写数据寄存器最大数据位
#define WR7H XBYTE[0x4f00]               
#define RR0L XBYTE[0x4000]                  //主状态寄存器
#define RR0H XBYTE[0x4100]               
#define RR1L XBYTE[0x4200]                  //状态寄存器1
#define RR1H XBYTE[0x4300]                 
#define RR2L XBYTE[0x4400]                  //状态寄存器2
#define RR2H XBYTE[0x4500]               
#define RR3L XBYTE[0x4600]                  //状态寄存器3
#define RR3H XBYTE[0x4700]               
#define RR4L XBYTE[0x4800]                  //寄存器1输入
#define RR4H XBYTE[0x4900]               
#define RR5L XBYTE[0x4a00]                  //寄存器2输入
#define RR5H XBYTE[0x4b00]               
#define RR6L XBYTE[0x4c00]                  //读寄存器最小数据位
#define RR6H XBYTE[0x4d00]               
#define RR7L XBYTE[0x4e00]                  //读寄存器最大数据位
#define RR7H XBYTE[0x4f00]
这些数据的算法:
WR1H                A15        A14        A13        A12        A11        A10        A9        A8        A7        A6        A5        A4        A3        A2        A1        A0
XBYTE[0x4300]        0        1        0        0        0        0        1        1        0        0        0        0        0        0        0        0
这样的寄存器映射是否正确?A12和A0~A7是不是填0?还是填1?我这样映射了,还需要在读写时先片选MCX314吗?
我对K9F1208进行读写是否也可以用寄存器映射?具体的思路是否也可以这样做?

回复评论 (10)

都是基础问题,大家帮帮忙啊
点赞  2008-10-20 11:22
发个原理图出来,这样看费劲
点赞  2008-10-20 12:26
发个原理图上来,这样看费劲
点赞  2008-10-20 12:29
A0~A7是不是填0?还是填1?我这样映射了,还需要在读写时先片选MCX314吗?
填什么都可以,不影响MCX314的访问。
我看没有啥问题。
点赞  2008-10-20 12:53
片选 输入 芯片说明 片选控制
A13 A14 A15
CSPD12 0 0 0 USB通讯芯片PDUSBD12 P2=P2|0x1f
CSK9 1 0 0 64MB的FLASH,K9F1208 P2=P2|0x3f
CS314 0 1 0 运动控制芯片MCX314AL P2=P2|0x5f
CS558A 1 1 0 第一激光能量D/A P2=P2|0x7f
CS558B 0 0 1 第二激光能量D/A P2=P2|0x9f
CSOCMJC 1 0 1 LCD(128*64) P2=P2|0xbf
------------------------------------------
片选 输入 芯片说明 片选控制
A13 A14 A15
CSPD12 0 0 0 USB通讯芯片PDUSBD12      接138 Y0
CSK9 1 0 0 64MB的FLASH,K9F1208      接138 Y1
CS314 0 1 0 运动控制芯片MCX314AL     接138 Y2
CS558A 1 1 0 第一激光能量D/A            接138 Y3
CS558B 0 0 1 第二激光能量D/A            接138 Y4
CSOCMJC 1 0 1 LCD(128*64)             接138 Y5

后面的P2=P2|0xbf,这些是多余的
除了片选和地址,还要连其它的控制线,比如RD,WR,要注意有效电平,51单片机这两个信号是低电平有效,有些芯片是高电平有效
*********************************************************
地址没有算错,对于A0-A7你填什么都无所谓,一般填0就行了,A12要看你的激光开关信号控制,只要操作总线的时候 不影响这个信号就行。
你的片选既然已使用地址信号译码,就不需要先输出片选了,所有的信号由总线控制。
51的总线直接驱动K9F1208很麻烦,你还是模拟总线去读写FLASH
点赞  2008-10-20 13:03
引用: 引用 2 楼 guetcw 的回复:
发个原理图出来,这样看费劲


是啊,哈哈。你还对单片机念念不忘。
点赞  2008-10-20 20:16
连续几天通宵,去睡了,各位给我回了贴还不知道,在这非常感谢你们,特别是 guetcw ,非常感谢。
“除了片选和地址,还要连其它的控制线,比如RD,WR,要注意有效电平,51单片机这两个信号是低电平有效,有些芯片是高电平有效 ”
我能确定我用的所有芯片RD、WR是低电平有效,而且和K9F1208、MCX314、PDUSBD12的RD、WR连接正常。
我在后面代码指令中的“WR0H=0x01;”是等价于P0=0x00;P2=0x40;RD=1;WR=0;P0=0x01;WR=1;这一连续的动作??

还有一个问题,我的74LS138为什么有的输出信号是8V,我以的电源是5V的,我测试了所有芯片的VCC和GND连接全是好的。我P0口的上拉电阻用的是102G,本是想用103G,但是LCD驱动问题,用103G容易出现乱码,我不知道跟上拉电阻有关系不?


“51的总线直接驱动K9F1208很麻烦,你还是模拟总线去读写FLASH”
guetcw,可以详细说说你这句话吗?

我是软件工程系毕业的,对电子根本就没学过,我是自学的,所有基础很差,大家别笑我,很多问题全是挺弱弱的:)

点赞  2008-10-20 21:47
引用: 引用 7 楼 3927134 的回复:
我在后面代码指令中的“WR0H=0x01;”是等价于P0=0x00;P2=0x40;RD=1;WR=0;P0=0x01;WR=1;这一连续的动作??

因为你用了XBYTE这个宏,汇编对应的指令是 MOVX 这条指令,比如WROH = 0X01;这条指令可用下面的汇编来完成
MOV DPTR,#4100H ;设外部数据地址指针
MOV A,#01H;数据
MOVX @DPTR,A ;0X4100<-A
这条指令会自动的从P0,P2口输出数据和地址信号,并控制相应控制线(如RD,RW,ALE,PSENT等)输出有效信号。我记得不清楚了,你可以找相关的资料看看MOVX这条指令的时序。(哈哈,以前有面试单片机工作的时候有些面试官要你画出这条指令的时序图的)
引用: 引用 7 楼 3927134 的回复:
还有一个问题,我的74LS138为什么有的输出信号是8V,我以的电源是5V的,我测试了所有芯片的VCC和GND连接全是好的。我P0口的上拉电阻用的是102G,本是想用103G,但是LCD驱动问题,用103G容易出现乱码,我不知道跟上拉电阻有关系不?

如果你板子所有电源都是5V(包括LCD)那很大可能就是你的测试方法不对,如果有上拉电阻接到比如12V的电压,那出现8V就很正常。上拉电阻的大小可以影响总线的速度的,一般来讲速度快上拉电阻要小些,反之亦然。
引用: 引用 7 楼 3927134 的回复:
“51的总线直接驱动K9F1208很麻烦,你还是模拟总线去读写FLASH”

你应该看了FLASH的数据手册,FLASH除了数据线,还有几个控制线,51单片机的总线没有对应的控制线,如果你要用总线的方式去驱动FLASH芯片,你必需用一堆74电路配合现有的控制信号来产生这些信号(还不知道一不一定行),所以你按照FLASH的驱动时序用I/O口来模拟驱动它。


点赞  2008-10-20 23:03
引用: 引用 6 楼 wogoyixikexie_gliet 的回复:
引用 2 楼 guetcw 的回复:
发个原理图出来,这样看费劲


是啊,哈哈。你还对单片机念念不忘。

呵呵,单片机和ARM都一样的嘛
点赞  2008-10-20 23:04
非常感谢,今晚就测试,明天早上结果就出来,
点赞  2008-10-20 23:16
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复