📄 i2c_driver.msa
字号:
C:One Byte Data.
***************************************************************************/
I2C_ReadOneByte:
PUSH DE
PUSH HL
LD A,E
CP 01H
JR Z,Rd_Send_Restart
CP 02H
JR Z,Rd_Send_Stop
LD A,(I2CSPEED) //read one byte
ADD A,82H
OUT (I2CCTL),A //Realse I2C-must need!!!
CALL LWRD Recv_complete
CP 00H
JR Z,I2C_ReadOneByte_Exit
IN A,(I2CDAT)
LD C,A
LD A,01H
JP I2C_ReadOneByte_Exit
Rd_Send_Restart:
CALL LWRD I2C_Restart //Send NACK & Restart& receive the last data
CALL LWRD Recv_complete
CP 00H
JR Z,I2C_ReadOneByte_Exit
IN A,(I2CDAT)
LD C,A
LD A,(I2CSPEED)
ADD A,82H
OUT (I2CCTL),A //release i2c;Must need!!!!
LD A,01H
JR I2C_ReadOneByte_Exit
Rd_Send_Stop:
CALL LWRD I2C_Stop //Send Stop & NACK & receive the last data
CALL LWRD Recv_complete
CP 00H
JR Z,I2C_ReadOneByte_Exit
IN A,(I2CDAT)
LD C,A
LD A,(I2CSPEED)
ADD A,82H
OUT (I2CCTL),A //release i2c;Must need!!!!
CALL LWRD Wait_Stop
LD A,01H
JR I2C_ReadOneByte_Exit
I2C_ReadOneByte_Exit:
POP HL
POP DE
RET
/***************************************************************************
I2C Restart
input parameter:NO
output parameter:NO
***************************************************************************/
I2C_Restart:
LD A,(I2CSPEED)
ADD A,8FH
OUT (I2CCTL),A //Start condition
RET
/***************************************************************************
I2C Stop
input parameter:NO
output parameter:NO
***************************************************************************/
I2C_Stop:
LD A,(I2CSPEED)
ADD A,8BH
OUT (I2CCTL),A
RET
/***************************************************************************
wait Stop:wait stop complete
input parameter:NO
output parameter:NO
***************************************************************************/
Wait_Stop:
PUSH AF
Wait_Stopxxx:
IN A,(I2CSTA)
BIT 6,A
JR Z,Wait_Stopxxx
POP AF
RET
/***************************************************************************
I2C Exit
input parameter:NO
output parameter:NO
***************************************************************************/
I2C_Exit:
LD A,00H
OUT (I2CCTL),A
RET
/***************************************************************************
Trans_complete
input parameter:NO
output parameter:A-1:Transmit complete;0:fail.
***************************************************************************/
Trans_complete:
PUSH BC
//LD C,3FH
Trans_complete_loop:
//DEC C
//JR Z,Trans_complete_error //Timeout error
IN A,(I2CSTA)
BIT 7,A
JR Z,Trans_complete_loop
CALL DELAY_5us
CALL Test_ACK
CP 00H
JR Z,Trans_complete_error
//ADD 2005.3.18
LD A,80H //Clear complete bit
OUT (I2CSTA),A
////
////modify 2005.4.21
// CALL Test_ACK
// CP 00H
// JR Z,Trans_complete_error
LD A,01H
JR Trans_complete_exit
Trans_complete_error:
LD A,00H
Trans_complete_exit:
POP BC
RET
/***********************************************************************
Recv_complete
input parameter:NO
output parameter:A:1:Receive complete;0:fail.
************************************************************************/
Recv_complete:
PUSH BC
//LD C,3FH
Recv_complete_loop:
//DEC C
//JR Z,Recv_complete_error //Timeout error
IN A,(I2CSTA)
BIT 7,A
JR Z,Recv_complete_loop
//ADD 2005.3.18
LD A,80H //Clear complete bit
OUT (I2CSTA),A
//
LD A,01H
JR Recv_complete_exit
Recv_complete_error:
LD A,00H
Recv_complete_exit:
POP BC
RET
/**********************************************************************
TEST ACK
input parameter:NO
output parameter:A:1:ACK;0:NACK.
***********************************************************************/
Test_ACK:
IN A,(I2CCTL)
BIT 0,A
JR Z,ACK_OK
LD A,00H
JR ACK_exit
ACK_OK:
LD A,01H
ACK_exit:
RET
/***************************************************
DELAY 15us
***************************************************/
DELAY_15us:
PUSH BC
LD B,18
WAIT_DELAY:
PUSH AF
POP AF
DJNZ WAIT_DELAY
POP BC
RET
/***************************************************
DELAY 5us
***************************************************/
DELAY_5us:
PUSH BC
LD B,6
WAIT_DELAY1:
NOP
NOP
NOP
NOP
DJNZ WAIT_DELAY
POP BC
RET
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -