fm_i2cdrv2.msa

来自「MP3 整个 SDK」· MSA 代码 · 共 326 行

MSA
326
字号
/********************************************************************************************
                    philips TEA5767 FM module driver(I2C DRIVER)
                    writen by GONGJIAN. for 3961 
                    last update 05-3-30 14:57
********************************************************************************************/

//for FM_i2cdrv1
public   WRITE_ONEFRAME
public   READ_STATUS
public   CALCULATE_PLL   

//from I2C_Driver
extern   I2C_Start
extern   I2C_Stop
extern   I2C_Writeonebyte
extern   I2C_ReadOneByte
extern   DELAY_15us

//from  FM_i2cdrv1
extern   FREQ_RF
extern   WSET_PLLLB
extern   WSET_PLLHB
extern   WRITE_BUFFER
extern   READ_BUFFER
extern   WSET_HLSI
extern   FM_result
     
//=====================================================
            rseg    FM_CTRL_D
//=====================================================
FMupdatestatus:
            PUSH    AF
            PUSH    BC
            PUSH    HL
            LD      E,0C0H                            //send start & address    
            CALL    LWRD I2C_Start
            CP      00H
            JR      Z,FMupdatestatus_exit
            
            LD      HL,LWRD WRITE_BUFFER
            LD      E,(HL)
            LD      C,02H
            CALL    LWRD I2C_Writeonebyte
            CP      00H
            JR      Z,FMupdatestatus_exit
                                           
            LD      A,01H
            LD      (LWRD FM_result),A 
            JR      FMupdatestatus_ok
FMupdatestatus_exit:
            LD      A,00H
            LD      (LWRD FM_result),A 
FMupdatestatus_ok:              
            POP    HL
            POP    BC
            POP    AF
            RET
            
//===========================================================
//      READ   STATUS
//===========================================================  
READ_STATUS:
        PUSH    BC
        PUSH    HL
        
        LD      B,05H
        CALL    LWRD FMwait50ms 
FMwaitreadyloop1:  
        DEC     B
        JR      Z,READ_STATUS_err
        CALL    LWRD READ_ONEFRAME
        CP      00H
        JR      Z,FMwaitreadyloop1
        LD      HL,LWRD READ_BUFFER                      //判断RF=1?
        BIT     7,(HL)
        JR      Z,FMwaitreadyloop1
READ_STATUS_err: 
        LD      A,(LWRD FM_result)       
        POP     HL
        POP     BC
        RET
        
/********************************************************************************************
********************************************************************************************
Function is calculate the value of PLL.
    Input parameter:no.
    Output parameter:no.
    Operation condition:
        WSET_XTAL=1 and WSET_HLSI=1,PLL≡(125*(FREQ_RF+FREQ_IF))/1024
        WSET_XTAL=1 and WSET_HLSI=0,PLL≡(125*(FREQ_RF-FREQ_IF))/1024
        WSET_XTAL=0 and WSET_HLSI=1,PLL≡(2*(FREQ_RF+FREQ_IF))/25
        WSET_XTAL=0 and WSET_HLSI=0,PLL≡(2*(FREQ_RF-FREQ_IF))/25
        FREQ_RF:unit is KHz
        FREQ_IF:unit is KHz
        125=7d=01111101
********************************************************************************************/
CALCULATE_PLL:
          PUSH      AF
          PUSH      BC
          PUSH    DE
          PUSH      HL
          
          LD      HL,(LWRD FREQ_RF)
        LD      DE,0E1H
        LD      A,(LWRD WSET_HLSI)
        CP      00H
        JR      Z,subfreqIF
        ADD     HL,DE                       //HL=HL+DE
        JR      calculate_st        
subfreqIF:        
        SCF                                 //CY=1
        CCF                                 //CY=/CY
        SBC     HL,DE                       //HL=HL-DE-CY
calculate_st:
          LD      D,H
          LD      E,L
          LD      BC,0500h
          SCF
          RR      H
          RR      L
          SRL     H
          RR      L
MULshiftadd:    
          ADD     HL,DE
          JR      NC,MULshiftaddnocarry
          INC     C
MULshiftaddnocarry:
        INC     C
        SRL     C             //最后一次多移一位
        RR      H
        RR      L
          DJNZ    MULshiftadd
        LD      A,L
        LD      B,03H       //本来应该是4位
MULshiftadd2:        
        SRL     C
        RR      H
        RR      L
        DJNZ    MULshiftadd2
//优化PLL值        
/*
        LD      A,(LWRD WSET_HLSI)
        CP      01H
        JR      Z,calculate_ok   
*/

        LD      B,07H
        AND     B
          CP      05H
          JR      C,calculate_ok

          INC     HL
calculate_ok:
        LD      (LWRD WSET_PLLLB),HL
            
          POP        HL
          POP     DE
          POP        BC
          POP        AF
          RET            
                    
//=========================================================
//             WRITE FM REGISTER
//=========================================================
WRITE_ONEFRAME:
            PUSH    HL
            PUSH    BC
            PUSH    DE
            
            LD      E,0C0H              //send start & address  
            CALL    LWRD I2C_Start
            CP      00H
            JR      Z,I2C_werror_exit                                                           

            LD      DE,LWRD WRITE_BUFFER 
            LD      C,05H
            CALL    LWRD I2C_Write
            CP      00H
            JR      Z,I2C_werror_exit
                                      
            LD      A,01H
            LD      (LWRD FM_result),A    
            JR      I2Cwstop_exit  
I2C_werror_exit:
            LD      A,00H
            LD      (LWRD FM_result),A   
I2Cwstop_exit:            
            LD      A,(LWRD FM_result)
            
            POP     DE
            POP     BC
            POP     HL
            RET
            
//=========================================================
//             READ FM REGISTER
//=========================================================
READ_ONEFRAME:
            PUSH    BC
            PUSH    HL 
            PUSH    DE 
            
            LD      E,0C1H                         //send start & address    
            CALL    LWRD I2C_Start
            CP      00H
            JR      Z,I2C_rerror_exit
                
            LD      DE,LWRD READ_BUFFER
            LD      C,05H
            CALL    LWRD I2C_Read
            CP      00H
            JR      Z,I2C_rerror_exit                
            
            LD      A,01H
            LD      (LWRD FM_result),A    
            JR      I2Crstop_exit    
I2C_rerror_exit:
            LD      A,00H
            LD      (LWRD FM_result),A   
I2Crstop_exit:
            LD      A,(LWRD FM_result)
            
            POP     DE
            POP     HL
            POP     BC
            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 
             DEC    B            
I2C_Write_loop:             
             LD     E,(HL)
             LD     C,00H
             CALL   LWRD I2C_Writeonebyte
             CP     00H
             JR     Z,I2C_Write_exit
             
             INC    HL
                 
             DJNZ   I2C_Write_loop
             
             LD     E,(HL)
             LD     C,02H
             CALL   LWRD I2C_Writeonebyte
             
I2C_Write_exit:                          
             POP    DE
             POP    BC
             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
            DEC       B
            CALL      DELAY_15us               //must >10us;avoid address ACK too short.
Read_data_loop:
            LD        E,00H
            CALL      LWRD I2C_ReadOneByte
            CP        00H
            JR        Z,I2C_Read_Exit
            LD        A,C
            LD        (HL),A
            INC       HL
            DJNZ      Read_data_loop 
              
              LD        E,02H                    //Send Stop & Receive data
              CALL      LWRD I2C_ReadOneByte
            CP        00H
            JR        Z,I2C_Read_Exit
            LD        A,C
            LD        (HL),A
            
              LD        A,01H
I2C_Read_Exit:              
              POP       DE
              RET
                
//========================================================
//         FM wait 50ms  
//======================================================== 
FMwait50ms:       
           PUSH    AF
           PUSH    BC 
           IN           A,(4eh)
           OR          08h
           OUT         (4eh),A
           LD      B,100
FMwait50msloop1:        
           PUSH    BC   
//500us            
           LD      B,230
FMwait50msloop2:          
           PUSH    DE
           POP     DE
           PUSH    DE
           POP     DE
           DJNZ    FMwait50msloop2
        
           POP     BC
           DJNZ    FMwait50msloop1        
           POP     BC
           POP     AF
           RET
                    
END

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?