📄 i2c_driver.msa
字号:
/***************************************************************************
GL3961 I2C Driver Interface
writen by GONGJIAN
last update 05-3-30 10:04
****************************************************************************/
#include "I2C_register.h"
public I2C_Init
public I2C_Start
//public I2C_Write
public I2C_Writeonebyte
//public I2C_Read
public I2C_ReadOneByte
//public I2C_Restart
public I2C_Stop
public I2C_Exit
public I2C_Transaddr
//public Wait_Stop
//public Trans_complete
//public Recv_complete
public DELAY_15us
//***********************************************************
rseg I2C_driver
I2CSPEED DEFB 40H
/*****************************************************************************
I2C Init
input parameter:E:00H for 100k;40H for 400K
output parameter:NO
*****************************************************************************/
I2C_Init:
LD A,E
LD (I2CSPEED),A //I2C SPEED
// LD A,00H
// OUT (MFPSEL),A
IN A,(MFPSEL)
OR 20H
AND 3FH //by jmzhang from 80h->20h
OUT (MFPSEL),A //Mode change to F2
LD A,(I2CSPEED)
ADD A,80H
OUT (I2CCTL),A //Enable I2C;Disable IRQ
RET
/*****************************************************************************
I2C Start
input parameter:E:slave address;
output parameter:A:01-sucess;00-fail.
******************************************************************************/
I2C_Start:
PUSH DE
LD A,E
OUT (I2CADDR),A //Slave address
LD A,(I2CSPEED)
ADD A,86H
OUT (I2CCTL),A //Start condition
CALL LWRD Trans_complete //Judge address tansmit complete
POP DE
RET
/*****************************************************************************
I2C Write One Frame
input parameter:DE:Sendbuffer address
C:byte length
output parameter:A:01-sucess;00-fail.
*****************************************************************************/
//I2C_Write:
// PUSH BC
// PUSH DE
//
// LD L,E
// LD H,D
// LD B,C
//I2C_Write_loop:
// LD A,(HL)
// OUT (I2CDAT),A
// LD A,(I2CSPEED)
// ADD A,82H
// //LD A,82H+I2Cmode
// OUT (I2CCTL),A //release i2c;Must need!!!
//
// CALL LWRD Trans_complete //Judge address tansmit complete?
// CP 00H
// JR Z,I2C_Write_exit
//
// INC HL
//
// DJNZ I2C_Write_loop
//
// LD A,01H
//I2C_Write_exit:
// POP DE
// POP BC
// RET
/*****************************************************************************
I2C Write One Byte
input parameter:E:Write data.
C:02H-Stop;01H-Restart;else send one byte.
output parameter:A:1-success;0:fail.
*****************************************************************************/
I2C_Writeonebyte:
PUSH BC
PUSH DE
LD A,E
OUT (I2CDAT),A
LD A,C
CP 01H
JR Z,Wr_Send_Restart
CP 02H
JR Z,Wr_Send_Stop
LD A,(I2CSPEED) //send one byte
ADD A,82H
OUT (I2CCTL),A //release i2c;Must need!!!!
CALL LWRD Trans_complete
JP I2C_Writeonebyte_exit
Wr_Send_Restart:
CALL LWRD I2C_Restart //Send Restart & the last data
CALL LWRD Trans_complete
LD A,(I2CSPEED)
ADD A,82H
OUT (I2CCTL),A //release i2c;Must need!!!!
LD A,01H
JR I2C_Writeonebyte_exit
Wr_Send_Stop:
CALL LWRD I2C_Stop //Send Stop & the last data
CALL LWRD Trans_complete
LD A,(I2CSPEED)
ADD A,82H
OUT (I2CCTL),A //release i2c;Must need!!!!
CALL LWRD Wait_Stop
LD A,01H
I2C_Writeonebyte_exit:
POP DE
POP BC
RET
/***************************************************************************
I2C Transfer Address:After restart,transfer address.
input parameter:E:slave address.
output parameter:A:1-success;0:fail.
***************************************************************************/
I2C_Transaddr:
PUSH DE
LD A,E
OUT (I2CADDR),A
LD A,(I2CSPEED)
ADD A,82H
OUT (I2CCTL),A //release i2c;Must need????----test
CALL LWRD Trans_complete
POP DE
RET
///***************************************************************************
// I2C Read Continuous Byte
// input parameter:DE:Receivebuffer address.
// C:Data length
// output parameter:A:1-success;0:fail.
//***************************************************************************/
//I2C_Read:
// PUSH DE
//
// LD L,E
// LD H,D
// LD B,C
// CALL DELAY_15us //must >10us;avoid address ACK too short.
//Read_data:
// LD A,B
// CP 01H
// JR NZ,Send_ACK2
// LD A,(I2CSPEED)
// ADD A,8BH
// //LD A,08BH+I2Cmode //if it is last byte,Send NACK & stop.
// JR I2C_Read_loop
//Send_ACK2:
// LD A,(I2CSPEED)
// ADD A,82H
// //LD A,082H+I2Cmode //release i2c;Must need!!!!
//I2C_Read_loop:
// OUT (I2CCTL),A
//
// CALL LWRD Recv_complete
// CP 00H
// JR Z,I2C_Read_Exit
// IN A,(I2CDAT)
// LD (HL),A
// INC HL
// DJNZ Read_data
// LD A,01H
//
//I2C_Read_Exit:
// POP DE
// RET
/***************************************************************************
I2C Read One Byte
input parameter:E:02H-Stop;01H-Restart;else No.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -