/*******************************************************************************
24c02写,三级堆栈深度 ,I2cData equ 30h; I2cr1 equ 31h ;I2c_mode_zhi equ 32h;
SCLpb,0 SDA pb,1
*******************************************************************************/
At24c02Write:
call I2CStart
movia a0h
movar I2c_mode_zhi
call I2cSendByte//写器件地址
call IIC_Wait_Ack //等待应答
movia 00h
movar I2c_mode_zhi
call I2cSendByte //写内存地址
call IIC_Wait_Ack //等待应答
movia 50h
movar I2c_mode_zhi
call I2cSendByte//写数据地址
call IIC_Wait_Ack //等待应答
call I2CStop
return
/*******************************************************************************
24c02读,三极堆栈深度
*******************************************************************************/
At24c02Read:
call I2CStart
movia a0h
movar I2c_mode_zhi
call I2cSendByte//写器件地址
call IIC_Wait_Ack //等待应答
movia 00h
movar I2c_mode_zhi
call I2cSendByte //写内存地址
call IIC_Wait_Ack //等待应答
call I2CStart
movia a1h
movar I2c_mode_zhi
call I2cSendByte //写内存地址
call IIC_Wait_Ack //等待应答
clrr I2c_mode_zhi //先清除数据
call I2cReadByte //不产生应答,产生应答为连续读,NaCK
call I2CStop
return
/*******************************************************************************
I2c读取信号,?詈螅琒CL=0,SDA=1
*******************************************************************************/
I2cReadByte:
movia 00000010B //已经初始化化的io口状态
xoria 00000000B
iost pb
clrr I2cr1 //清楚计数器
RECEVEBloop: BCR SCL
CALL NOPsix
BSR SCL
call NOPsix
RLR I2c_mode_zhi,1
BTRSS sda
GOTO BCRDataB_RECEVER
BSR I2c_mode_zhi,0
GOTO RECEVEBloop3
RECEVEBloop3:
INCR I2cr1,1
CALL NOPsix
XORARc 08H,I2cr1,RECEVEBloop
CALL IIC_NAck //默认情况不发送应答,只有连续接受的时候发生应答
RETURN //接收结束
BCRDataB_RECEVER:
bcr I2c_mode_zhi,0
goto RECEVEBloop3
/*******************************************************************************
I2c发送信号,高电平期间信号保持稳定,发送完成一个字节再发送一位,最后,SCL=0,SDA=1
*******************************************************************************/
I2cSendByte:
movr I2c_mode_zhi,0 //要被写入的数据
movar I2cData //要被发送出去的数据
clrr I2cr1 //位记数据器
movia 00000000B //已经初始化化的io口状态
xoria 00000000B
iost pb
SendBloop: BTRSS I2cData,7 //判断最高位是1还是0
GOTO BCRDataB
bsr sda
goto SendBloop3
SendBloop3: RLR I2cData,1
INCR I2cr1,1
CALL NOPsix
BSR SCL
CALL NOPsix
BCR SCL
CALL NOPsix
XORARc 08H,I2cr1,SendBloop
RETURN
BCRDataB: bcr SDA
goto SendBloop3
/*******************************************************************************
I2c开始信号,开始信号结束后SCL和sda都为0,设置scl和sda都为输出
*******************************************************************************/
I2CStart:
movia 00000000B //已经初始化化的io口状态
xoria 00000000B
iost pb
movia 00000000B
movar phcon //全部设置为上拉
BSR SDA //
call NOPsix //6us保持时间
BSR SCL //
call NOPsix //6us保持时间
BCR SDA //
call NOPsix //6us保持时间
bcr SCL //把scl拉低因为电平只有在低电平能变化
return
/*******************************************************************************
I2c结束信号,开始信号结束后SCL和sda都为1,表示总线空闲
*******************************************************************************/
I2CStop:
movia 00000000B //已经初始化化的io口状态
xoria 00000000B
iost pb
movia 00000000B
movar phcon //全部设置为上拉
BCR sda
nop
BSR SCL
nop
BSR SDA
call NOPsix //6us,SDA 在高电平跳变
RETURN
/*******************************************************************************
I2c wait_ACK,SDA被拉低表示接收成功
*******************************************************************************/
IIC_Wait_Ack:
movia 00000010B //已经初始化化的io口状态
xoria 00000000B
iost pb
bsr sda
call NOPsix
bsr scl
IIC_Wait_fail:call NOPsix
incr I2cr1,1
xorars ffh,I2c_mode_zhi,I2CStop //超过时间结束,设置为ff
btrsc sda
goto IIC_Wait_fail
nop
nop
nop
bcr scl //拉低时钟
RETURN
/*******************************************************************************
I2c_ACK,产生应答
*******************************************************************************/
IIC_Ack:
movia 00000000B //已经初始化化的io口状态
xoria 00000000B
iost pb
BCR scl
nop
bcr sda
nop
nop
nop
nop
bsr scl
nop
nop
nop
nop
Bcr scl
RETURN
/*******************************************************************************
I2c_nACK,不产生应答
*******************************************************************************/
IIC_NAck:
movia 00000000B //已经初始化化的io口状态
xoria 00000000B
iost pb
BCR scl
nop
bsr sda
nop
nop
nop
nop
bsr scl
nop
nop
nop
nop
Bcr scl
RETURN
/*******************************************************************************
I2c信号保持时间,6*1us=6us
*******************************************************************************/
NOPsix: nop
nop
nop
nop
nop
nop
return
/*******************************************************************************/
/*******************************************************************************
24c02写,三级堆栈深度 ,I2cData equ 30h; I2cr1 equ 31h ;I2c_mode_zhi equ 32h;
SCLpb,0 SDA pb,1
*******************************************************************************/
At24c02Write:
call I2CStart
movia a0h
movar I2c_mode_zhi
call I2cSendByte//写器件地址
call IIC_Wait_Ack //等待应答
movia 00h
movar I2c_mode_zhi
call I2cSendByte //写内存地址
call IIC_Wait_Ack //等待应答
movia 50h
movar I2c_mode_zhi
call I2cSendByte//写数据地址
call IIC_Wait_Ack //等待应答
call I2CStop
return
/*******************************************************************************
24c02读,三极堆栈深度
*******************************************************************************/
At24c02Read:
call I2CStart
movia a0h
movar I2c_mode_zhi
call I2cSendByte//写器件地址
call IIC_Wait_Ack //等待应答
movia 00h
movar I2c_mode_zhi
call I2cSendByte //写内存地址
call IIC_Wait_Ack //等待应答
call I2CStart
movia a1h
movar I2c_mode_zhi
call I2cSendByte //写内存地址
call IIC_Wait_Ack //等待应答
clrr I2c_mode_zhi //先清除数据
call I2cReadByte //不产生应答,产生应答为连续读,NaCK
call I2CStop
return
/*******************************************************************************
I2c读取信号,?詈螅琒CL=0,SDA=1
*******************************************************************************/
I2cReadByte:
movia 00000010B //已经初始化化的io口状态
xoria 00000000B
iost pb
clrr I2cr1 //清楚计数器
RECEVEBloop: BCR SCL
CALL NOPsix
BSR SCL
call NOPsix
RLR I2c_mode_zhi,1
BTRSS sda
GOTO BCRDataB_RECEVER
BSR I2c_mode_zhi,0
GOTO RECEVEBloop3
RECEVEBloop3:
INCR I2cr1,1
CALL NOPsix
XORARc 08H,I2cr1,RECEVEBloop
CALL IIC_NAck //默认情况不发送应答,只有连续接受的时候发生应答
RETURN //接收结束
BCRDataB_RECEVER:
bcr I2c_mode_zhi,0
goto RECEVEBloop3
/*******************************************************************************
I2c发送信号,高电平期间信号保持稳定,发送完成一个字节再发送一位,最后,SCL=0,SDA=1
*******************************************************************************/
I2cSendByte:
movr I2c_mode_zhi,0 //要被写入的数据
movar I2cData //要被发送出去的数据
clrr I2cr1 //位记数据器
movia 00000000B //已经初始化化的io口状态
xoria 00000000B
iost pb
SendBloop: BTRSS I2cData,7 //判断最高位是1还是0
GOTO BCRDataB
bsr sda
goto SendBloop3
SendBloop3: RLR I2cData,1
INCR I2cr1,1
CALL NOPsix
BSR SCL
CALL NOPsix
BCR SCL
CALL NOPsix
XORARc 08H,I2cr1,SendBloop
RETURN
BCRDataB: bcr SDA
goto SendBloop3
/*******************************************************************************
I2c开始信号,开始信号结束后SCL和sda都为0,设置scl和sda都为输出
*******************************************************************************/
I2CStart:
movia 00000000B //已经初始化化的io口状态
xoria 00000000B
iost pb
movia 00000000B
movar phcon //全部设置为上拉
BSR SDA //
call NOPsix //6us保持时间
BSR SCL //
call NOPsix //6us保持时间
BCR SDA //
call NOPsix //6us保持时间
bcr SCL //把scl拉低因为电平只有在低电平能变化
return
/*******************************************************************************
I2c结束信号,开始信号结束后SCL和sda都为1,表示总线空闲
*******************************************************************************/
I2CStop:
movia 00000000B //已经初始化化的io口状态
xoria 00000000B
iost pb
movia 00000000B
movar phcon //全部设置为上拉
BCR sda
nop
BSR SCL
nop
BSR SDA
call NOPsix //6us,SDA 在高电平跳变
RETURN
/*******************************************************************************
I2c wait_ACK,SDA被拉低表示接收成功
*******************************************************************************/
IIC_Wait_Ack:
movia 00000010B //已经初始化化的io口状态
xoria 00000000B
iost pb
bsr sda
call NOPsix
bsr scl
IIC_Wait_fail:call NOPsix
incr I2cr1,1
xorars ffh,I2c_mode_zhi,I2CStop //超过时间结束,设置为ff
btrsc sda
goto IIC_Wait_fail
nop
nop
nop
bcr scl //拉低时钟
RETURN
/*******************************************************************************
I2c_ACK,产生应答
*******************************************************************************/
IIC_Ack:
movia 00000000B //已经初始化化的io口状态
xoria 00000000B
iost pb
BCR scl
nop
bcr sda
nop
nop
nop
nop
bsr scl
nop
nop
nop
nop
Bcr scl
RETURN
/*******************************************************************************
I2c_nACK,不产生应答
*******************************************************************************/
IIC_NAck:
movia 00000000B //已经初始化化的io口状态
xoria 00000000B
iost pb
BCR scl
nop
bsr sda
nop
nop
nop
nop
bsr scl
nop
nop
nop
nop
Bcr scl
RETURN
/*******************************************************************************
I2c信号保持时间,6*1us=6us
*******************************************************************************/
NOPsix: nop
nop
nop
nop
nop
nop
return
/*******************************************************************************/
举报