⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 i2c_driver.msa

📁 炬力方案176*132软件源码,适用于AK1025
💻 MSA
📖 第 1 页 / 共 2 页
字号:
/***************************************************************************
          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 + -