📄 fm_i2cdrv2.msa
字号:
//=========================================================
// I2C Exit:
// Input parameter:NO
// Output parameter:NO.
//=========================================================
I2C_Exit:
PUSH AF
IN A,(SDA_outport)
RES SDA_outport_num,A
OUT (SDA_outport),A
IN A,(SCL_outport)
RES SCL_outport_num,A
OUT (SCL_outport),A
POP AF
RET
//=========================================================
// I2C Start Condition:
// Input parameter:NO
// Output parameter:NO.
//=========================================================
I2C_Start:
PUSH AF
IN A,(SDA_doport)
RES SDA_doport_num,A
OUT (SDA_doport),A
CALL LWRD I2C_wait5us
IN A,(SCL_doport)
RES SCL_doport_num,A
OUT (SCL_doport),A
POP AF
RET
//=========================================================
// I2C Stop Condition:
// Input parameter:NO
// Output parameter:NO.
//=========================================================
I2C_Stop:
PUSH AF
IN A,(SCL_doport)
SET SCL_doport_num,A
OUT (SCL_doport),A
CALL LWRD I2C_wait5us
IN A,(SDA_doport)
SET SDA_doport_num,A
OUT (SDA_doport),A
POP AF
RET
//========================================================
// I2C Transfer One Byte
//A 为待传数据,返回时A中为响应类型,0为ACK, 1为NACK
//若为地址字节且欲读取数据,B为1,否则为0
//========================================================
I2Ctransbyte:
PUSH BC
LD C,A
CALL LWRD I2CSendbyte
//SDA output-->input
IN A,(SDA_outport)
RES SDA_outport_num,A
OUT (SDA_outport),A
IN A,(SDA_inport)
SET SDA_inport_num,A
OUT (SDA_inport),A
//SCL output 1
CALL LWRD I2C_wait5us
IN A,(SCL_doport)
SET SCL_doport_num,A
OUT (SCL_doport),A
IN A,(SDA_dinport)
BIT SDA_dinport_num,A
JR NZ,GetNACK
LD C,00H
LD A,B
CP 01H
JR Z,I2Creadaddbyte
IN A,(SDA_inport)
RES SDA_inport_num,A
OUT (SDA_inport),A
IN A,(SDA_doport)
RES SDA_doport_num,A
OUT (SDA_doport),A
JR ACKgetok
I2Creadaddbyte:
CALL LWRD I2C_wait5us
IN A,(SCL_doport)
RES SCL_doport_num,A
OUT (SCL_doport),A
JR I2Ctransok
GetNACK:
LD C,01H
IN A,(SDA_doport)
SET SDA_doport_num,A
OUT (SDA_doport),A
ACKgetok:
IN A,(SDA_outport)
SET SDA_outport_num,A
OUT (SDA_outport),A
CALL LWRD I2C_wait5us
IN A,(SCL_doport)
RES SCL_doport_num,A
OUT (SCL_doport),A
IN A,(SDA_doport)
RES SDA_doport_num,A
OUT (SDA_doport),A
I2Ctransok:
LD A,C
POP BC
RET
//==================================================
//I2C Receive One Byte
//A入口为准备响应,返回为接受到的数值
//==================================================
I2Crecebyte:
PUSH BC
LD B,A
PUSH BC
IN A,(SCL_outport)
RES SCL_outport_num,A
OUT (SCL_outport),A
IN A,(SCL_inport)
SET SCL_inport_num,A
OUT (SCL_inport),A
waitsclrelease:
IN A,(SCL_dinport)
BIT SCL_dinport_num,A
JR Z,waitsclrelease
IN A,(SCL_inport)
RES SCL_inport_num,A
OUT (SCL_inport),A
IN A,(SCL_doport)
SET SCL_doport_num,A
OUT (SCL_doport),A
IN A,(SCL_outport)
SET SCL_outport_num,A
OUT (SCL_outport),A
LD B,08H
SDAInextbit:
IN A,(SCL_doport)
SET SCL_doport_num,A
OUT (SCL_doport),A
CALL LWRD I2C_wait3us
IN A,(SDA_dinport)
BIT SDA_dinport_num,A
JR Z,SDAI0
SDAI1:
SCF
RL C
JR SDAI_OK
SDAI0:
SLA C
SDAI_OK:
LD A,B
CP 01H
JR Z,I2CRlastbit
PUSH BC
POP BC
IN A,(SCL_doport)
RES SCL_doport_num,A
OUT (SCL_doport),A
CALL LWRD I2C_wait5us
DJNZ SDAInextbit
I2CRlastbit:
IN A,(SDA_inport)
RES SDA_inport_num,A
OUT (SDA_inport),A
BIT 0,C
JR NZ,I2CRlastbit1
IN A,(SDA_doport)
RES SDA_doport_num,A
OUT (SDA_doport),A
JR I2CRlastbitOK
I2CRlastbit1:
IN A,(SDA_doport)
SET SDA_doport_num,A
OUT (SDA_doport),A
I2CRlastbitOK:
IN A,(SDA_outport)
SET SDA_outport_num,A
OUT (SDA_outport),A
IN A,(SCL_doport)
RES SCL_doport_num,A
OUT (SCL_doport),A
LD A,C
POP BC
LD C,A
LD A,B
CP 00H
JR NZ,GenNACK
IN A,(SDA_doport)
RES SDA_doport_num,A
OUT (SDA_doport),A
CALL LWRD I2C_wait5us
IN A,(SCL_doport)
SET SCL_doport_num,A
OUT (SCL_doport),A
CALL LWRD I2C_wait5us
IN A,(SCL_doport)
RES SCL_doport_num,A
OUT (SCL_doport),A
IN A,(SDA_outport)
RES SDA_outport_num,A
OUT (SDA_outport),A
IN A,(SDA_inport)
SET SDA_inport_num,A
OUT (SDA_inport),A
JR ACKgenok
GenNACK:
IN A,(SDA_doport)
SET SDA_doport_num,A
OUT (SDA_doport),A
CALL LWRD I2C_wait5us
IN A,(SCL_doport)
SET SCL_doport_num,A
OUT (SCL_doport),A
CALL LWRD I2C_wait5us
IN A,(SCL_doport)
RES SCL_doport_num,A
OUT (SCL_doport),A
IN A,(SDA_doport)
RES SDA_doport_num,A
OUT (SDA_doport),A
ACKgenok:
LD A,C
POP BC
RET
//==================================================
//I2C Send 8Bit Data
// Input Parameter:C:Send Data
// Output Parameter:NO
//==================================================
I2CSendbyte:
PUSH BC
LD B,8
SDAOnextbit:
SLA C
JR C,SDAO1
SDAO0:
IN A,(SDA_doport)
RES SDA_doport_num,A
OUT (SDA_doport),A
JR SDAO_OK
SDAO1:
IN A,(SDA_doport)
SET SDA_doport_num,A
OUT (SDA_doport),A
SDAO_OK:
CALL LWRD I2C_wait5us
IN A,(SCL_doport)
SET SCL_doport_num,A
OUT (SCL_doport),A
CALL LWRD I2C_wait5us
IN A,(SCL_doport)
RES SCL_doport_num,A
OUT (SCL_doport),A
DJNZ SDAOnextbit
POP BC
RET
//==================================================
// Delay 5us
//==================================================
I2C_wait5us:
PUSH AF
PUSH BC
NOP
NOP
POP BC
POP AF
RET
//==================================================
// Delay 3us
//==================================================
I2C_wait3us:
PUSH AF
PUSH BC
NOP
NOP
POP BC
POP AF
RET
//==================================================
// Wait 10ms
//==================================================
FMwait10ms:
PUSH AF
PUSH BC
LD BC,09FFH
FMwait10msloop:
PUSH DE
POP DE
PUSH DE
POP DE
PUSH DE
POP DE
PUSH DE
POP DE
PUSH DE
POP DE
DEC BC
LD A,B
OR C
JR nZ,FMwait10msloop
POP BC
POP AF
RET
//==================================================
// Wait 20ms
//==================================================
FMwait20ms:
PUSH AF
PUSH BC
LD BC,1500H
FMwait20msloop:
PUSH DE
POP DE
PUSH DE
POP DE
PUSH DE
POP DE
PUSH DE
POP DE
PUSH DE
POP DE
DEC BC
LD A,B
OR C
JR nZ,FMwait20msloop
POP BC
POP AF
RET
//==================================================
// Wait 30ms
//==================================================
FMwait30ms:
PUSH AF
PUSH BC
LD BC,1E00H
FMwait30msloop:
PUSH DE
POP DE
PUSH DE
POP DE
PUSH DE
POP DE
PUSH DE
POP DE
PUSH DE
POP DE
DEC BC
LD A,B
OR C
JR nZ,FMwait30msloop
POP BC
POP AF
RET
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -