打印

求助!!!关于IIC总线传输

[复制链接]
2157|16
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
zl040901|  楼主 | 2008-7-9 20:58 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
用AT89S51写AT24C01,AT24CO1的 地址是 怎样确定的,下面程序为什么 它发送完了读取写控制字之后不用发写在AT24CO1的首地址吗?

 LCALL STA ;发送起始条件
        MOV A,,#0A0H读取写控制字
        LCALL WRB;发送一个字节
        LCALL CACK;检查应答位
        JB F0,WRBYTE1;无应答,重发
        MOV R0,#DTSV ;欲发送数据首址
        MOV R5,KEYNUM;R5保存欲发送数据的字节数        
WRDA:   MOV A,@R0;读一个字节数据
        LCALL WRB;发送写控制字节
        LCALL CACK;检查应答位
        JB F0,WRBYTE1;无应答,重发
        DEC R0
        DJNZ R5,WRDA;未发送完N个字节继续
        LCALL STOP ;数据发送完毕,停止
        POP PSW ;恢复现场
        RET

相关帖子

沙发
dai_weis| | 2008-7-10 17:20 | 只看该作者

地址的确定分成两部分

一部分已经固定的地址,手册中有写
另一个通过外部引脚的电平决定

使用特权

评论回复
板凳
zl040901|  楼主 | 2008-7-10 23:22 | 只看该作者

IIC

谢谢,第二个地址能不能讲具体点呢,
看看下面的程序是我从网上找的 ,为什么它说把8个数据写到24C02的01H为首址单元中去,而不发24C02的首地址01H呢,对24C02的读写要不要发它里面所存的单元地址呢,各位大虾帮帮忙啊,小弟我最近被网上各种这样的程序弄的很糊涂了,这先谢谢,能不能给点例程,推荐一点好的网站也行,万分感谢!!!!





这是将0600H地址中以下的8个数据写到24C02的01H为首址单元中去的汇编程序
ORG 0000H 
SCL BIT P3.4 
SDA BIT P3.5;

LJMP START
START:LCALL STAR
MOV A,#0AOH
LCALL SDATA
LCALL ACK
JC  START
MOV R2,#08H;数据有8个
MOV DPTR,#0600H;定义源数据的位置
LOOP:MOV A,#00H
MOVC A,@A+DPTR
LCALL SDATA
LCALL ACK
JC LOOP
INC DPTR
DJNZ R2,LOOP

LCALL STOP;调用停止子程序

STAR:SETB SDA
SETB SCL
NOP
NOP
NOP
NOP
CLR SDA
NOP
NOP
NOP
NOP
CLR SCL
RET
SDATA:MOV R0,#08H
LOOP0:RLC A
MOV SDA,C
NOP
NOP
SETB SCL
NOP
NOP
NOP
NOP
CLR SCL
DJNZ R0,LOOP0
RET
ACK:SETB SDA
NOP
NOP
SETB SCL
NOP
NOP
NOP
NOP
MOV C,SDA
CLR SCL
RET
STOP:CLR SDA
NOP
NOP
NOP
NOP
SETB SCL
NOP
NOP
NOP
NOP
SETB SDA
NOP
NOP
NOP
NOP
RET
ORG 0600H
DB 0A0H,10H,01H,02H,03H,04H,05H,06H
END

使用特权

评论回复
地板
zl040901|  楼主 | 2008-7-12 00:56 | 只看该作者

帮帮忙啊

谢谢

使用特权

评论回复
5
孤星119| | 2008-7-12 09:59 | 只看该作者

如2楼所说.楼主地址扩展弄懂就行了.

使用特权

评论回复
6
zg_z| | 2008-7-15 00:01 | 只看该作者

手册上有吧

最近做铁电,高4位是固定的地址(手册上有),d3-1是器件地址/页地址(型号不一样好象不同),d0是读写~~~~
另外24C01是什么,AT的EEPROM最小也有4Kb吧

使用特权

评论回复
7
zjh006| | 2008-7-15 14:58 | 只看该作者

应该是要写首地址的。

从楼主给的程序来看,应该是把首地址放在了数据的第一个了。例如要在08H的位置写入3个字节(00h,01h,02h),只要连续写如下面4个字节就可以了:08H,00H,01H,02H.

使用特权

评论回复
8
zl040901|  楼主 | 2008-7-15 15:39 | 只看该作者

谢谢

我再试下
型号      容量       地址                  可扩展数目
AT24C01    128       1010 A2 A1 A0 R/W~     8
AT24C02    256       1010 A2 A1 A0 R/W~     8
AT24C04    512       1010 A2 A1 P0 R/W~     4
AT24C08    1KB       1010 A2 P1 P0 R/W~     2
AT24C16    2KB       1010 P2 P1 P0 R/W~     1
AT24C32    4KB       1010 A2 A1 A0 R/W~     8
AT24C64    8KB       1010 A2 A1 A0 R/W~     8
表中P2 P1,P0为页地址位
6楼的可不可以帮我解释d3-d1, 即A2,A1,A0,P0,P1,P2,该怎样接电路
可扩展数目是怎样确定的
谢谢

使用特权

评论回复
9
zg_z| | 2008-7-15 16:52 | 只看该作者

...

d3-d1就是数据的第3位到第1位..你用AT24C01的话就是A2 A1 A0,也就是器件地址.器件地址是硬件设计的时候固定的,地址000就把A2 A1 A0接地,地址001就把A2 A1接地,A1上拉,依次类推.页地址是编程的时候设的,没电路可接.
扩展数目根据器件地址确定,地址3位就是2^3=8个,2位就是2^2=4个.没有就是2^0=1个,也就是总线上只能挂一片(如AT24C16).
后面的R/W就是读写位,写1读,写0就写...

使用特权

评论回复
10
zl040901|  楼主 | 2008-7-16 00:23 | 只看该作者

先谢谢了,9楼的

还有一点疑问?希望帮解答一下
1:比如接AT24C01,我要扩展数目时,假设扩展3个,是不是第一个的A2 A1 A0为000,第二个的为001,第三个的为010,但我看过AT24C系列的一点介绍,好像A2 A1 A0一定要接同以电平。
2:刚才7楼的写AT24C01的写法,我试过了,好像还不行,不知是不是我的 程序问题,请问一下这样行吗,首地址一般怎样发?
3;对AT24C01进行页面写的时候,假如超过了8个字节,它是不是自动转到下一页呢 ,因为IIC总线说SDA上发送的字节数量不受限制,即对页面写的操作可不可不从页面第以字节开始?




使用特权

评论回复
11
zjh006| | 2008-7-16 08:25 | 只看该作者

肯定要写首地址的

如果写不进去应该是你程序有问题。

使用特权

评论回复
12
zl040901|  楼主 | 2008-7-16 16:22 | 只看该作者

;;;;

谢谢,我再试试
其它问题能不能帮忙解答一下

使用特权

评论回复
13
zl040901|  楼主 | 2008-7-16 17:36 | 只看该作者

aa

即我能不能连续写N个数据,只要不超过它的容量

使用特权

评论回复
14
zjh006| | 2008-7-17 08:20 | 只看该作者

只能连续读写一个Page的内容

使用特权

评论回复
15
xwj| | 2008-7-17 08:39 | 只看该作者

1、当然要发首地址;2、不能跨页

能连续写多少个数据,取决于page大小和相对页首的偏移

比如AT24C01的page大小是8,对AT24C01进行页面写,
如果首地址是8的整数倍,这每次可以连续写入8个字节,然后延时大约10毫秒(具体看器件资料)的时间等待其内部完成写操作;
如果首地址不是8的整数倍,比如是7,那这时写一个字节就跨页了,就必须延时等待这一页写入,否则结果肯定是错误的

使用特权

评论回复
16
zl040901|  楼主 | 2008-7-17 18:07 | 只看该作者

XX

谢谢各位大侠

使用特权

评论回复
17
huanben| | 2011-9-24 09:49 | 只看该作者
15# xwj
对页的描述是来自数据手册吗?
这帖子太牢了 呵呵

使用特权

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

本版积分规则

16

主题

61

帖子

0

粉丝