打印

单片机总线运用的问题

[复制链接]
3550|25
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 qjp1988113 于 2013-12-20 09:25 编辑

为什么只有2句就把FML8O8外存储和CH372搞定了啊,完全不写关于时序的操作啊?谁能帮解释下啊。小弟感激不敬。。
语句:
#define CH375_CMD_PORT XBYTE[0x8fff]
#define CH375_DAT_PORT XBYTE[0x8ffe]

下面是电路图:
CH372通过74LS138选通的:



单片机与外存储FM1808和USB通讯芯片CH372的总线连接:
程序清单.rar (7.93 KB) https://bbs.21ic.com/forum.php?mod=attachment&aid=MjI4NTI0fDA2NzU5NjFhNDFjNjk0NTBhZjU1NzcyZDM2Y2ZlNGUzfDE3MzUwOTMwMTU%3D&request=yes&_f=.rar
所用程序清单:






评分
参与人数 1威望 +5 收起 理由
znmcu + 5 谈及一个很重要的问题

相关帖子

沙发
yangfan19641964| | 2013-12-20 09:43 | 只看该作者
51系列的单片机受到广大的面向实际应用的技术开发人员的追捧,就在于它的总线操作简洁、高效、明朗。我们使用51总线上的器件的读写操作,哪像学校里乱教的,就是你的疑问:怎么没有时序?
XBYE函数对应的是汇编的MOVX指令,它自动发出16地址,你根据器件的特性,用这16位地址选中要操作的芯片;然后单片机发出WR或RD的负脉冲,如果是写指令,将同时将8位数据放在数据总线上;如果是读指令,WR的低电平将使外围器件数据放在总线上、单片机读回。
更好的做法是不用XBYTE函数,定义xdata类型的指针(端口比如扩展并行输出口)或数值(连续的单元比如存储器)。
现在大学里出来的学生98%都不懂这个。

使用特权

评论回复
板凳
ayb_ice| | 2013-12-20 09:52 | 只看该作者
看标准51总线时序自然就知道了

使用特权

评论回复
地板
yangfan19641964| | 2013-12-20 09:55 | 只看该作者
你的图中标号取得很不好。
要对CH372操作,必须使其CS为低。对应138的G1为“1”,A、B、C为“0”。对应单片机为A15=1、A14=A13=A12=0。-----1000
这就是XBYTE函数的地址为什么为8xxx。
我没有用过图中型号的单片机,图哪来的?似乎有错。U2第1脚应该接单片机的P7.0,这是16位地址的最低位。因为在定义中数据端口的地址为0x8fffe。
再补充一句,对于16位地址中没有用到的一般的习惯是写成1

使用特权

评论回复
5
yangfan19641964| | 2013-12-20 09:58 | 只看该作者
有点错误,改一下:

如果是写指令,单片机将8位数据放在数据总线上、同时发出WR负脉冲;如果是读指令,RD负脉冲的低电平将使外围器件将被地址选中的单元的数据放在总线上、单片机读回。

使用特权

评论回复
6
znmcu| | 2013-12-20 09:59 | 只看该作者
很多人对cpu总线和编址不熟,这是初学的一个软肋。但总线确实极为重要的。

使用特权

评论回复
7
znmcu| | 2013-12-20 10:04 | 只看该作者
根本原因在于很多初学者都把单片机当做一个"IO器",认为所有的时序都要由程序通过操作io来产生。并没有深入到cpu层面,有很多时序是cpu的本征行为,比如寻址访存。当你访问一个外部地址时,cpu就会自然产生相应时序。大量的总线应用,就是在利用这一点。根本在于你要如何把你的电路挂到总线上,又如何去计算他的地址。

使用特权

评论回复
8
qjp1988113|  楼主 | 2013-12-20 10:07 | 只看该作者
yangfan19641964 发表于 2013-12-20 09:43
51系列的单片机受到广大的面向实际应用的技术开发人员的追捧,就在于它的总线操作简洁、高效、明朗。我们使 ...

谢谢了。不过FM1808与其他的SRAN不一样,读写时,CS端低电平就行了。FM1808必须是下降沿,才行。单片机这么智能,不同的也能知道??

使用特权

评论回复
9
qjp1988113|  楼主 | 2013-12-20 10:11 | 只看该作者
yangfan19641964 发表于 2013-12-20 09:55
你的图中标号取得很不好。
要对CH372操作,必须使其CS为低。对应138的G1为“1”,A、B、C为“0”。对应单片 ...

单片机是C8051F120,它的功能寄存器跟外部引脚是通过个选择开关选的,图中的是INT0,所用U2一脚没错。

使用特权

评论回复
10
yangfan19641964| | 2013-12-20 10:16 | 只看该作者
qjp1988113 发表于 2013-12-20 10:07
谢谢了。不过FM1808与其他的SRAN不一样,读写时,CS端低电平就行了。FM1808必须是下降沿,才行。单片机这 ...

单片机先在数据总线上发出8位数据,然后在数据有效期间发一个负脉冲。所以下降沿写入也并不影响写操作,因为下降沿来到时数据总线上已是有效数据。

使用特权

评论回复
11
qjp1988113|  楼主 | 2013-12-20 10:17 | 只看该作者
znmcu 发表于 2013-12-20 10:04
根本原因在于很多初学者都把单片机当做一个"IO器",认为所有的时序都要由程序通过操作io来产生。并没有深入 ...

请问:你的意思就是只要把外接挂上去,然后通过链接的CS,WR,RD等直接编成相应的操作地址即可?如果每个外接的时序不一样,单片机都能智能把握??

使用特权

评论回复
12
yangfan19641964| | 2013-12-20 10:23 | 只看该作者
应该根据单片机总线时序、再结合器件的要求,来设计电路。
举个最简单的例子,51系列单片机的外围器件基本上是低电平选中,但也有极少数是高电平选中。怎么办?最简单的用个反相器不就得了?

使用特权

评论回复
13
qjp1988113|  楼主 | 2013-12-20 10:24 | 只看该作者
yangfan19641964 发表于 2013-12-20 09:55
你的图中标号取得很不好。
要对CH372操作,必须使其CS为低。对应138的G1为“1”,A、B、C为“0”。对应单片 ...

谢谢这位大哥:
根据你的提示,我想了下。
#define CH375_CMD_PORT XBYTE[0x8fff]
#define CH375_DAT_PORT XBYTE[0x8ffe]
中最后一位代表的应该是CH372的A0端。A0=1,写命令,A0=0,写数据。

使用特权

评论回复
14
yangfan19641964| | 2013-12-20 10:33 | 只看该作者
再给你看个图。很多学生用1602,但是用的是I/O操作方式。看看我们是如何用于总线操作的。当然,有两点需要说明:1  还有其它电路实现总线操作,关键在于理解MOVX指令时序。 2   我们有时也会用I/O方式来控制1602.。那是因为从整个系统设计来考虑的,比如16位地址已用满、又不想扩展地址。

未命名.JPG (31.25 KB )

未命名.JPG

使用特权

评论回复
15
znmcu| | 2013-12-20 10:35 | 只看该作者
不是单片机很智能,是你设计的地址啊,比较你为什么要把CH372的地址定义成0X8FFF和0X8FFE,因为你肯定是把CH372的CS接P27上了,所以0X8FFF在寻址的时候会被拉低,你肯定也把A0接P20了,所以才有了数据与命令端口。

使用特权

评论回复
16
qjp1988113|  楼主 | 2013-12-20 10:36 | 只看该作者
yangfan19641964 发表于 2013-12-20 10:33
再给你看个图。很多学生用1602,但是用的是I/O操作方式。看看我们是如何用于总线操作的。当然,有两点需要 ...

真是太谢谢了。汇编没学好,就是不行啊。没了解本质。以后我想多用总线。

使用特权

评论回复
17
znmcu| | 2013-12-20 10:38 | 只看该作者
你在多器件复用总线的时候,其它器件你只要不把CS放在与CH372冲突的地址线上,不就OK了吗。
其实总线复用原理很简单。
你的CH372的程序里,XBYTE其实就是(volatile unsigned char *),你是在用地址线的时序控制CS与AO,同时又有WR与RD的配合。

使用特权

评论回复
18
znmcu| | 2013-12-20 10:40 | 只看该作者
一般多器件复用总线,都会把CS们分配到不同的地址线上,使它们相互不冲突。
为了解决这个问题,很多ARM或DSP,直接有多个CS控制引脚,或者有多个地址空间,称为ZONE。
尽力理解我所说的这些,深入理解总线,对你以后有极大益处。

使用特权

评论回复
19
znmcu| | 2013-12-20 10:52 | 只看该作者
一个很基础的51问题,我来考一下大家,看看大家有没有这方面的意识。
51的P0作IO的时候是必须加外部上拉的,但是在作总线接口的时候却并不需要加上拉,这是为什么?!

使用特权

评论回复
20
leehp| | 2013-12-20 12:33 | 只看该作者
有的需要上拉,有的不需要,具体不需要上拉的是P1P2就记不得了。做IO口用的时候,负载比较大,用上拉踏实些。

使用特权

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

本版积分规则

111

主题

627

帖子

2

粉丝