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

📄 fm_i2cdrv2.msa

📁 yts收音模块用汇编语言写的,介绍了收音的搜台和处理过程
💻 MSA
📖 第 1 页 / 共 2 页
字号:
/********************************************************************************************
Nigata NS953 FM module YTS7001 driver(I2C DRIVER)
writen by Gongjian. for GL3951 S1. 05-1-17
********************************************************************************************/
//For   FM_DRV1.msa
public   CALCULATE_PLL
public   READ_Stereo
public   I2C_Init
public   I2C_Exit
public   Write_Register
public   WRITE_ONEFRAME
public   Read_Register
public   READ_ONEFRAME
public   R8_Readdata
public   FMwait10ms
public   FMwait20ms
public   FMwait30ms

//From  FM_DRV1.msa
extern   FREQ_RF
extern   WRITE_BUFFER
extern   READ_BUFFER
extern   FM_result
extern   R1_PCNTL
extern   R2_PCNTH
extern   R8_PDETTST
extern   Register_Data 
extern   Register_Address


//output enable port
#define     SDA_outport          0F3H
#define     SDA_outport_num      01H
//input enable port              
#define     SDA_inport           0F3H
#define     SDA_inport_num       05H
                                 
#define     SCL_outport          0F3H
#define     SCL_outport_num      00h
#define     SCL_inport           0F3h
#define     SCL_inport_num       004h

//data port
#define     SDA_doport            0F4h
#define     SDA_doport_num        01h
#define     SDA_dinport           0F4h
#define     SDA_dinport_num       01h

#define     SCL_doport            0F4h
#define     SCL_doport_num        00h
#define     SCL_dinport           0F4h
#define     SCL_dinport_num       00h

//=====================================================
            rseg    FM_CTRL_D
//=====================================================

/********************************************************************************************
Function is calculate the value of PLL.
    Input parameter:no.
    Output parameter:no.
    Operation condition:        
        PLL≡(125*(FREQ_RF-FREQ_IF))/1024
        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)            //radio freq
            //LD      HL,28E0H                   //76MHz
            LD      DE,0177H                     //375kHz IF
          
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
            
            LD      B,07H
            AND     B
	          CP      05H
	          JR      C,calculate_ok
            
	          INC     HL
calculate_ok:
            LD      A,L
            LD      (LWRD R1_PCNTL),A
            LD      A,H
            LD      (LWRD R2_PCNTH),A
            //LD      E,L
            //LD      D,H
            	
	          POP	    HL
	          POP     DE
	          POP	    BC
	          POP	    AF
	          RET

//=========================================================
//       Read Stereo:
//            Input parameter:NO
//            Output parameter:A:1-sucess;0-Fail.    
//=========================================================
READ_Stereo:
            PUSH    BC
            PUSH    HL
                        
            LD      B,05H
FMwaitreadyloop1:  
            DEC     B
            JR      Z,READ_STATUS_err
            CALL    LWRD R8_Readdata
            CP      00H
            JR      Z,FMwaitreadyloop1
            
READ_STATUS_err: 
            LD      A,(LWRD FM_result)       
	          POP     HL
	          POP     BC
            RET
            
//=========================================================
//        Write register:
//            Input parameter:E:register Address
//                            C:register data
//            Output parameter:A:1-sucess;0-Fail.    
//=========================================================
Write_Register:
            PUSH    BC
            PUSH    DE
            LD      A,E
            LD      (LWRD Register_Address),A
            LD      A,C
            LD      (LWRD Register_Data),A
            
            CALL    LWRD I2C_Start
            
            LD      A,0C8H                        //slave address:1100 10 ADR R/W
            LD      B,00H
            CALL    LWRD I2Ctransbyte
            CP      00H
            JR      NZ,I2C_wrerror_exit
            
            LD      A,(LWRD Register_Address)          //write register address
            LD      B,00H
            CALL    LWRD I2Ctransbyte
            CP      00H
            JR      NZ,I2C_wrerror_exit
            
            LD      A,(LWRD Register_Data)
            LD      B,00H
            CALL    LWRD I2Ctransbyte
            CP      00H
            JR      NZ,I2C_wrerror_exit
            LD      A,01H
            LD      (LWRD FM_result),A
            JR      I2C_wrstop_exit
I2C_wrerror_exit:
            LD      A,00H
            LD      (LWRD FM_result),A
I2C_wrstop_exit:
            CALL    LWRD  I2C_Stop
            LD      A,(LWRD FM_result)
            POP     DE
            POP     BC
            RET                  
                    
//=========================================================
//        Write Continous register:
//            Input parameter:WRITE_BUFFER
//            Output parameter:A:1-sucess;0-Fail.
//=========================================================
WRITE_ONEFRAME:
            PUSH    HL
            PUSH    BC    
            CALL    LWRD I2C_Start

            LD      A,0C8H                        //Slave Address
            LD      B,00H
            CALL    LWRD I2Ctransbyte
            CP      00H
            JR      NZ,I2C_wferror_exit
            
            LD      A,00H                        //First Register Address
            LD      B,00H
            CALL    LWRD I2Ctransbyte
            CP      00H
            JR      NZ,I2C_wferror_exit

            LD      C,14                           //R0~R13
            LD      HL,LWRD WRITE_BUFFER
I2C_wf_nextbyte:
            LD      A,(HL)
            LD      B,00H
            CALL    LWRD  I2Ctransbyte
            CP      00H
            JR      NZ,I2C_wferror_exit
            INC     HL
            DEC     C
            JR      NZ,I2C_wf_nextbyte
            LD      A,01H
            LD      (LWRD FM_result),A    
            JR      I2Cwfstop_exit  
I2C_wferror_exit:
            LD      A,00H
            LD      (LWRD FM_result),A   
I2Cwfstop_exit:
            CALL    LWRD  I2C_Stop
            LD      A,(LWRD FM_result)
            POP     BC
            POP     HL
            RET

//=========================================================
//        Read register:
//            Input parameter:E:register Address
//            Output parameter:C:Register_Data
//                             A:1-sucess;0-Fail.    
//=========================================================            
Read_Register:
           PUSH    DE
           
           LD      A,E                  
           LD      (LWRD Register_Address),A 
           
           CALL    LWRD  I2C_Start    
           LD      A,0C8H                       //Slave Address-Write
           LD      B,00H
           CALL    LWRD  I2Ctransbyte
           CP      00H
           JR      NZ,I2C_rrerror_exit
           
           LD      A,(LWRD Register_Address)         //Register Address
           LD      B,00H
           CALL    LWRD  I2Ctransbyte
           CP      00H
           JR      NZ,I2C_rrerror_exit           
           
           CALL    LWRD  I2C_Init               //Restart
           CALL    LWRD  I2C_Start   
           LD      A,0C9H                       //Slave Address-Read
           LD      B,01H
           CALL    LWRD  I2Ctransbyte
           CP      00H
           JR      NZ,I2C_rrerror_exit
           
           LD      A,01h
           CALL    LWRD I2Crecebyte
           LD      (LWRD Register_Data),A
           
           LD      A,01H
           LD      (LWRD FM_result),A    
           JR      I2Crrstop_exit    
I2C_rrerror_exit:
           LD      A,00H
           LD      (LWRD FM_result),A   
I2Crrstop_exit:
           CALL    LWRD  I2C_Stop
           LD      A,(LWRD Register_Data)
           LD      C,A
           LD      A,(LWRD FM_result)
           POP     DE
           RET                      
                 
//=========================================================
//        Read Continous register:
//            Input parameter:READ_BUFFER
//            Output parameter:A:1-sucess;0-Fail.
//=========================================================
READ_ONEFRAME:
            PUSH    BC
            PUSH    HL
            CALL    LWRD  I2C_Start

            LD      A,0C8H                       //Slave Address-Write
            LD      B,00H
            CALL    LWRD  I2Ctransbyte
            CP      00H
            JR      NZ,I2C_rferror_exit
            
            LD      A,00H
            LD      B,00H
            CALL    LWRD  I2Ctransbyte
            CP      00H
            JR      NZ,I2C_rferror_exit
            
            CALL    LWRD  I2C_Init               //Restart
            CALL    LWRD  I2C_Start   
            LD      A,0C9H                       //Slave Address-Read
            LD      B,01H
            CALL    LWRD  I2Ctransbyte
            CP      00H
            JR      NZ,I2C_rferror_exit
            
            LD      C,13                         //R0~R12
            LD      HL,LWRD READ_BUFFER
I2C_rd_nextbyte:
            LD      A,00h
            CALL    LWRD  I2Crecebyte
            LD      (HL),A      
            INC     HL
            DEC     C
            JR      NZ,I2C_rd_nextbyte
            
            LD      A,01h                         //R13
            CALL    LWRD I2Crecebyte
            LD      (HL),A    
            
            LD      A,01H
            LD      (LWRD FM_result),A    
            JR      I2Crfstop_exit    
I2C_rferror_exit:
            LD      A,00H
            LD      (LWRD FM_result),A   
I2Crfstop_exit:
            CALL    LWRD  I2C_Stop
            LD      A,(LWRD FM_result)
            POP     HL
            POP     BC
            RET
            
//=========================================================
//        Read R8 Data:
//            Input parameter:NO
//            Output parameter:A:1-sucess;0-Fail.
//=========================================================
R8_Readdata:
            PUSH    BC
            PUSH    HL
            LD      B,03H
R8_Readdata_LOOP:
            DEC     B
            JR      Z,R8_Readdata_Exit            
            LD      E,08H
            CALL    LWRD Read_Register
            CP      00H
            JR      Z,R8_Readdata_LOOP
            xor	    a
            LD      (LWRD FM_result),A
            LD      A,C
            BIT     7,A
            JR      Z,R8_Readdata_Exit
            LD      A,01H
            LD      (LWRD R8_PDETTST),A 
            LD      (LWRD FM_result),A                 
R8_Readdata_Exit:                      
            LD      A,(LWRD FM_result)
            POP     HL
            POP     BC
            RET
              
//=========================================================
//        I2C Init:
//            Input parameter:NO
//            Output parameter:NO.
//=========================================================
I2C_Init:
            PUSH    AF
            IN      A,(SDA_doport)
            SET     SDA_doport_num,A
            OUT     (SDA_doport),A
            IN      A,(SCL_doport)
            SET     SCL_doport_num,A
            OUT     (SCL_doport),A
                 
            IN      A,(SDA_outport)
            SET     SDA_outport_num,A
            OUT     (SDA_outport),A 
            IN      A,(SCL_outport)
            SET     SCL_outport_num,A
            OUT     (SCL_outport),A  
            POP     AF
            RET

⌨️ 快捷键说明

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