IIC总线上24C01的寻址问题

IIC总线上24C01的寻址问题,第1张

“为什么将地址改为0x51或者0x52,0x53,0x54,,,,也可以找到这个器件

这是不正常的现象。检查你的程序或者硬件连接。

“将第一个数字5变为其他时(如0x60,0x61,0x10,0x20,0x30,,,,)就找不到了”

控制码不对,当然找不到了。不同类型的I²C设备的控制码是不一样的,例如EEPROM、RTC一般采用1010作为控制码,视频数字编码器一般采用0101作为控制码……

端口 自己改一下

接法..随便找两个io口.

上拉5-10k电阻就好了.

24c01总共就只有128字节

而且写入的时候都知道忘那里写

你自己自然清楚什么时候..24c01满了.

这个东西都是固定地址.

又不是硬盘这种..还要什么时候满

SDAEQUP2.0

SCL EQUP2.1

AddressEQU08H

I2CData EQU09H

ORG 0040H

LJMP START转入主程序.

START:

MOV SP,#60H

MOV Address,#00H

MOV I2CData,#55H

MOV P0,I2CDATA

CALLDELAY

CALL I2C_WRITE写入数据.

MOV I2CDATA,#0AAH

MOV P0,I2CDATA

CALLDELAY

MOV Address,#00H

CALL I2C_READ

MOV I2CData,A 读出数据.

MOV P0,I2CDATA

CALLDELAY

NOP

NOP

LJMPSTART

//*******************************************

/*------------------------------------------------------

读一个字节 Address地址 Data读出的数据

------------------------------------------------------*/

I2C_READ:

I2C_READ_A:

LCALL I2C_START

MOV A,#10100000B //从器件地址位是000,并且对从器件进行写 *** 作。

//不要有所疑问为什么这么 *** 作。因为这是一个选择性读的 *** 作,主器件发送从器件地址和它想读取的字节数据的地址执行一个伪写 *** 作。

LCALL I2C_SEND8BIT

LCALL I2C_ACK

JCI2C_READ_A =1,表示无确认,再次发送 C为1转移。

MOV A,Address

LCALL I2C_SEND8BIT

LCALL I2C_ACK

I2C_READ_B:

LCALL I2C_START

MOV A,#10100001B //从器件地址位是000,并且对从器件进行读 *** 作。

LCALL I2C_SEND8BIT

LCALL I2C_ACK

JCI2C_READ_B //C=1转移,表示无确认,再次发送。

LCALL I2C_RECEIVE8BIT

MOV I2CData,A

LCALL I2C_ACK

LCALL I2C_STOP

RET

//*******************************************************

//*******************************************************

接收八位数据

//主器件接收从器件指定地址的8位数据。

I2C_RECEIVE8BIT:

MOV B,#08H

CLR A

SETB SDA

I2C_RECEIVE8IT_A:

SETB SCL

NOP

NOP

MOV C,SDA

RLC A

CLR SCL

DJNZ B,I2C_RECEIVE8IT_A

RET

//*******************************************************

//*******************************************************

/*------------------------------------------------------

写一个字节 Address地址 I2CDatata写入的数据

------------------------------------------------------*/

I2C_WRITE:

I2C_WRITE_A:

LCALL I2C_START //调用I2C总线的起始信号的程序。

MOV A,#10100000B //从器件地址位是000,并且对从器件进行写 *** 作。

LCALL I2C_SEND8BIT

LCALL I2C_ACK

JCI2C_WRITE_A //=1,表示无确认,再次发送。 C为1转移。

MOV A,Address

LCALL I2C_SEND8BIT

LCALL I2C_ACK

MOV A,I2CData

LCALL I2C_SEND8BIT

LCALL I2C_ACK

LCALL I2C_STOP

RET

//***************************************

//**********************************

发送开始信号

//I2C总线的起始信号的程序。

I2C_START:

SETB SCL

SETB SDA

NOP

NOP

CLR SDA

NOP

NOP

CLR SCL

RET

//***********************************

//***********************************

送八位数据

//主器件送从器件8位数据。

I2C_SEND8BIT:

MOV B,#08H

I2C_SEND8BIT_A:

RLC A

MOV SDA,C

SETB SCL

NOP

NOP

CLR SCL

DJNZ B,I2C_SEND8BIT_A

RET

//************************************

//*************************************

发送接收确认信号

I2C_ACk:

SETB SDA

SETB SCL

NOP

NOP

JB SDA,I2C_ACK0 //SDA为1跳转。

CLR C

SJMP I2C_ACK_END

I2C_ACK0:

SETB C

I2C_ACK_END:

CLR SCL

RET

//**************************************

//**************************************

发送结束信号

I2C_STOP:

CLR SDA

NOP

NOP

SETB SCL

NOP

NOP

SETB SDA

RET

//***************************************

//***************************************

delay:

MOV R7,#0FFH

DEL1:

MOV R6,#0FFH

DEL2:

MOV R5,#10

DEL3:

DJNZ R5,DEL3

DJNZ R6,DEL2

DJNZ R7,DEL1

RET

//***************************************


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/yw/7838149.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-10
下一篇 2023-04-10

发表评论

登录后才能评论

评论列表(0条)

保存