打印

【求助】关于用锁存器74HC373N外扩单片机的RAM

[复制链接]
5053|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
qingfeng20|  楼主 | 2011-7-18 16:45 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
简单介绍:由于项目中传感器输出信号为3.3V,
所以单片机选用了可以3.3V供电的AT89LV52,需要外扩RAM用于存储采集的数据,用到了可以3.3V供电的锁存器74HC373N,简单介绍一下74HC373N连线情况:
-OE 直接接地处理;LE接空出来的P1^7引脚;P0口8个脚分别接输入端口D的8个引脚;输出Q接到IS61LV256AL(外扩的SRAM,3.3V供电)的低8位地址。
-------------------------------------
问题:
1、-OE直接接地处理可以吗?

2、能用P1^7脚来控制LE端吗?看书上有单片机ALE脚直接控制74HC373N的LE脚的,可是单片机的ALE脚有办法编程控制吗?不太明白这点。

3、P0口在这里要低8位地址线和数据线复用的,此时需要P0口接上拉电阻到VCC3.3V上吗?是必须接上拉电阻到3.3V吗?P0口不作为I/O口是不是可以不用接上拉电阻到3.3V的?
-----------------------
以上有些问题可能比较简单,请高手不吝解答,谢谢啦!

相关帖子

沙发
原野之狼| | 2011-7-18 19:24 | 只看该作者
问题:
1、-OE直接接地处理可以吗?
如果输出总线没有别的设备,那么就可以直接接地处理,否则会引起总线电平竞争。
2、能用P1^7脚来控制LE端吗?看书上有单片机ALE脚直接控制74HC373N的LE脚的,可是单片机的ALE脚有办法编程控制吗?不太明白这点。
可以用任何一个IO来控制,但是如果这样的话,你对片外RAM的访问就得采用“迂回”的路线了,而不能借助处理器本身的扩展机制。
单片机的ALE不需要直接控制,有些器件需要根据外部器件的速度进行匹配。

3、P0口在这里要低8位地址线和数据线复用的,此时需要P0口接上拉电阻到VCC3.3V上吗?是必须接上拉电阻到3.3V吗?P0口不作为I/O口是不是可以不用接上拉电阻到3.3V的?
采用标准的总线扩展机制是不需要加什么上拉的。

使用特权

评论回复
板凳
qingfeng20|  楼主 | 2011-7-18 20:56 | 只看该作者
问题:
1、-OE直接接地处理可以吗?
如果输出总线没有别的设备,那么就可以直接接地处理,否则会引起总线电平竞争。
2、能用P1^7脚来控制LE端吗?看书上有单片机ALE脚直接控制74HC373N的LE脚的,可是单片机的ALE脚 ...
原野之狼 发表于 2011-7-18 19:24

谢谢 狼友。
关于问题2还得请教:看74HC373N芯片资料可知,LE=1时,透明输出;LE =0时,输出锁定为以前输入的数据。如果LE直接接单片机的ALE脚,那么,如何知道P0口输出的是数据还是低8位地址呢?如何通过ALE判别?

使用特权

评论回复
地板
原野之狼| | 2011-7-18 21:55 | 只看该作者
谢谢 狼友。
关于问题2还得请教:看74HC373N芯片资料可知,LE=1时,透明输出;LE =0时,输出锁定为以前输入的数据。如果LE直接接单片机的ALE脚,那么,如何知道P0口输出的是数据还是低8位地址呢?如何通过ALE判别? ...
qingfeng20 发表于 2011-7-18 20:56

ALE结合读写控制信号来完成对片外RAM的访问。

使用特权

评论回复
5
dqyubsh| | 2011-7-18 21:56 | 只看该作者
用ALE没法判别,因为单片机不知道ALE是高还是低,这条线应该是输出线,读不回来。

存取一个外部RAM时,单片机的执行次序是:以写为例,单片机先给出地址,选中RAM地址(对应RAM芯片的/CS变低,有效),然后给出数据线的数据,维持着,一直等到/WR信号的上升沿来临,将数据线的数据锁存到RAM对应的地址。

可见,输出地址和数据是分时的,先地址再数据,这个过程中,单片机自动变化ALE。

你正常写程序就好了,别的你也做不了什么,干预不了这个过程。

使用特权

评论回复
6
qingfeng20|  楼主 | 2011-7-18 21:58 | 只看该作者
用ALE没法判别,因为单片机不知道ALE是高还是低,这条线应该是输出线,读不回来。

存取一个外部RAM时,单片机的执行次序是:以写为例,单片机先给出地址,选中RAM地址(对应RAM芯片的/CS变低,有效),然后给出数据 ...
dqyubsh 发表于 2011-7-18 21:56

嗯,我试试看,谢谢指点。

使用特权

评论回复
7
qingfeng20|  楼主 | 2011-7-19 11:37 | 只看该作者
本帖最后由 qingfeng20 于 2011-7-19 11:38 编辑

5# dqyubsh
请帮忙看看我的代码,谢谢!
单片机的ALE直接接 锁存器SN74HC373的LE脚。
程序的目的:先写到固定地址一个0x0f00一个数据,然后再从该地址读取该数据,并串口输出显示。可是,写入的是0x61,读取的总是0x00,不知为何?
程序代码如下,请各位大侠详细解析一下,谢谢啦!
-------------------------代码如下-----------------------------
#include <stdio.h>
#include <reg52.h>
#include <intrins.h>

#define uchar unsigned char
#define uint unsigned int

void Delay(uint n);    // Delay 100us

sbit ce_inverse = P1^6; //低电平有效,-CE,高电平时RAM芯片处于standby mode
    //低电平时并且-WE控制RAM的写和读

sbit wr_inverse = P3^6;
sbit rd_inverse = P3^7;

//uint count = 10;

void main(void)
{
TMOD = 0x20;
TL1 = 0xfd;TH1 = 0xfd;
SCON=0xd8; PCON=0x00;
TR1=1;
//以上程序,设置波特率为9600的定时器1方式和初始值

//RAM写入
ce_inverse =0; //低电平有效,RAM芯片使能chip enable
//提供写地址
P0 = 0x00;
P2 = 0x0f;  //P2提供高8位地址

//开始写数据
wr_inverse = 0; //写使能
P0 = 0x61;  //对应字母'A'
wr_inverse = 1; //写禁止

ce_inverse = 1; //RAM芯片禁止使能

//RAM读取
ce_inverse = 0; //RAM芯片使能
//提供读地址
P0 = 0x00;
P2 = 0x0f;  //P2提供高8位地址

//开始读数据
rd_inverse = 0; //读使能
SBUF = P0;
rd_inverse = 1; //读禁止

ce_inverse = 1; //RAM芯片禁止使能

//串口输出SBUF数据
while(TI==0);
TI=0;


while(1);
}

void Delay(uint m)
{
uint i;
while(m--)
for(i=0;i<100;i++);
}

使用特权

评论回复
8
qingfeng20|  楼主 | 2011-7-19 23:36 | 只看该作者
本帖最后由 qingfeng20 于 2011-7-19 23:43 编辑

1、在没有在P0口接上拉电阻时,将P0=0xff后,发现P0口的各个引脚的电压只有1.0V,所以还是接了10K的排阻,才正常达到3.26V,所以:P0口即使作为扩展的总线用,也要加上拉电阻接到VCC 3.3V上。
2、觉得ALE没法控制,总觉得不放心。
所以,最后还是用单独的一个P1^7脚来作为LE锁存控制端。
完成程序如下:
----------------------程序如下,完全写入读取32KB地址空间-----------
#include <stdio.h>
#include <reg52.h>
#include <intrins.h>


#define uchar unsigned char
#define uint unsigned int


void Delay(uint n);
// Delay 100us

// uchar idata trdata[10]={'y','a','n','g','-',0x00};

sbit ce_inverse = P1^6;
//低电平有效,-CE,高电平时RAM芯片处于standby mode

//低电平时并且-WE控制RAM的写和读

sbit le = P1^7;
//while LE input is high,the Q outputs follow the data inputs.
//when LE is taken to low,the Q outputs

//are latches at the levels that were set up at the D inputs.


sbit wr_inverse = P3^6;
sbit rd_inverse = P3^7;

int low,high;

void main(void)
{


TMOD = 0x20;

TL1 = 0xfd; TH1 = 0xfd;

SCON=0xd8; PCON=0x00;


TR1=1;


//以上程序,设置波特率为9600的定时器1方式和初始值




//RAM写入

//提供写地址

for(high = 0x00;high<0x80;high++)
//共有32KB的存储空间

{
for(low=0x00;low<0xff;low++)

{

le = 1;

P0 = low;

le = 0;

P2 = high;
//P2提供高8位地址



//开始写数据

ce_inverse =0;
//低电平有效,RAM芯片使能chip enable

wr_inverse = 0;
//写使能

P0 = 0x00+low;
//对应字母'a'

wr_inverse = 1;
//写禁止


ce_inverse = 1;
//RAM芯片禁止使能



}

}

Delay(100);





for(high = 0x00;high<0x80;high++)

{
for(low=0x00;low<0xff;low++)


{

//RAM读取


//提供读地址

le = 1;

P0 = low;

le = 0;

P2 = 0x00;
//P2提供高8位地址



//开始读数据

ce_inverse = 0;
//RAM芯片使能

//
wr_inverse = 1;
//写禁止

rd_inverse = 0;
//读使能

SBUF = P0;


rd_inverse = 1;
//读禁止


ce_inverse = 1;
//RAM芯片禁止使能

//串口输出SBUF数据

while(TI==0);

TI=0;

}

}

Delay(100);






while(1);

}


void Delay(uint m)
{

uint i;

while(m--)

for(i=0;i<100;i++);

}

使用特权

评论回复
9
ayb_ice| | 2011-7-20 08:32 | 只看该作者
都什么年代了,还扩展RAM,直接换MCU

使用特权

评论回复
10
dqyubsh| | 2011-7-20 12:12 | 只看该作者
这都啥啊,不是说用ALE吗,咋还搞这么复杂、乱七八糟的东西!

你已经走火入魔了。20年前的51扩展电路,都是带ALE的。再找找8088计算机的电路,看看周明德的书,哪有一个是你这么玩的。

使用特权

评论回复
11
qingfeng20|  楼主 | 2011-7-21 11:38 | 只看该作者
本帖最后由 qingfeng20 于 2011-7-21 11:39 编辑

10# dqyubsh
那请dqyubsh大侠帮我看看在ALE接到锁存器的LE引脚时的程序到底问题出在哪里啦?
程序在7楼。
在7楼的程序里,我先测试了前边的
//RAM写入
ce_inverse =0; //低电平有效,RAM芯片使能chip enable
//提供写地址
P0 = 0x00;
P2 = 0x0f;  //P2提供高8位地址

//开始写数据
wr_inverse = 0; //写使能
P0 = 0x61;  //对应字母'A'
wr_inverse = 1; //写禁止
ce_inverse = 1; //RAM芯片禁止使能

这部分代码,发现RAM低8位地址是0x61,表明根本没有锁存住,不知道问题到底出在哪里啦?这点我有点云里雾里的,实在搞不明白了,请高手指点一下。
PS:8楼的程序中,测试表明一切正常。整个过程完全透明可控。

使用特权

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

本版积分规则

2

主题

15

帖子

0

粉丝