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

📄 pca9564_int.asm

📁 .ifnz I2C_SUPPORT ************************************************************** Function : fPro
💻 ASM
字号:
;;===================================================================================
;;Description: 
;;        TTE wants to design TV+ DVD player.The product is that TV is host(I2C),
;; and DVD(SUNPLUS 8202) is slave(I2C) .But 8202 don't support I2C slave mode.
;; so, We make 8202 for I2C slave by PCA9564( parallel bus to I2C-bus controler).
;; FUNCTION:  IOP can receive( or send) data from( or to) PCA9564.
;; IC:        SUNPLUS 8202-256-NS  
;; DATE:      2004-10-27 11:28
;;====================================================================================
.ifnz PCA9564  
;;------------------------------------------------------------------------------------
SRAM_PG1:		.section				;;PAGE1 start    
;;------------------------------------------------------------------------------------

         lda pca9564_state
         cmp #PCA9564_beginning_state
         beq PCA9564_Slave_Task
		 cmp #PCA9564_continue_Receive_data_state
		 beq PCA9564_Slave_Receive
         cmp #PCA9564_Receive_Judge_SI_state
         beq PCA9564_Receive_Read_I2CCON          
         cmp #PCA9564_continue_Transmit_data_state
         beq Pre_PCA9564_Slave_Transmit
		 cmp #PCA9564_Transmit_Judge_SI_state
         beq Pre_PCA9564_Transmit_Read_I2CCON
;;====================================================================================         
PCA9564_Slave_Task: 
         ;;  Read I2CCON
         smb PCA9564_A0_bit,PCA9564_A0_PORT 
         smb PCA9564_A1_bit,PCA9564_A1_PORT      
         jsr PCA9564_READ_PORT                 
         lda rOutBuffer_9564          
         ;;  Judge SI(I2CCON) is 1 or not
         ;;  If SI=1 ,Read I2CSTA  
         and #$08 ;;00001000
         beq PRE_Exit_PCA9564                
         ;;  Read I2CSTA     
         rmb PCA9564_A0_bit,PCA9564_A0_PORT 
         rmb PCA9564_A1_bit,PCA9564_A1_PORT      
         jsr PCA9564_READ_PORT                                           
         lda rOutBuffer_9564 
         ;;  If I2CSTA==0x60 ,slave receive data mode
         ;;  else if I2CSTA==0xa8 ,slave transmitter data mode       
         cmp #$60
         beq PCA9564_Slave_Receive
         cmp #$a8
         beq Pre_PCA9564_Slave_Transmit         
         jmp PCA9564_Error_Handling          
;;==================================================================================
PRE_Exit_PCA9564:
         jmp Exit_PCA9564   
Pre_PCA9564_Slave_Transmit:
         jmp PCA9564_Slave_Transmit 
Pre_PCA9564_Transmit_Read_I2CCON:
		 jmp PCA9564_Transmit_Read_I2CCON
;;===================================================================================         
PCA9564_Slave_Receive:                  
         ;;  Reset SI bit in I2CCON, write I2CCON=0xc5
         lda  #$c5
         sta  rOutBuffer_9564
         jsr  PCA9564_WRITE_I2CCON 

PCA9564_Receive_Read_I2CCON:          
         ;;  Read  I2CCON
         smb PCA9564_A0_bit,PCA9564_A0_PORT 
         smb PCA9564_A1_bit,PCA9564_A1_PORT             
         jsr PCA9564_READ_PORT  
         ;;  Judge SI(I2CCON) is 1 or not
         ;;  If SI=1 ,Read I2CSTA               
         lda rOutBuffer_9564
         and #$08                 
         ;;beq Exit_state_1  
		 beq Continue_read_I2CCON
		 jmp Receive_PC9564_DATA

Continue_read_I2CCON:
		 lda #PCA9564_Receive_Judge_SI_state
         sta pca9564_state
         jmp Exit_PCA9564  
;;-----------------------------------------------------------------------------------                  
Receive_PC9564_DATA:
         ;;  Read I2CSTA     
         rmb PCA9564_A0_bit,PCA9564_A0_PORT 
         rmb PCA9564_A1_bit,PCA9564_A1_PORT      
         jsr PCA9564_READ_PORT                                           
         lda rOutBuffer_9564
         cmp #$80
         bne check_rx_stopped
         lda pca9564_rx_in_ptr
         sta temp
         inc temp
         lda temp
         cmp #MAX_RX_BUF_LEN
         beq reset_rx_ptr
         jmp check_buf_full
reset_rx_ptr:
         stz temp
check_buf_full:                  
         lda temp
         cmp IOP_DATA2_H	   ;;outptr
         beq rx_buffer_is_full
                    
         ;;  set A0A1=10 ,I2CDAT
         smb PCA9564_A0_bit,PCA9564_A0_PORT          
         rmb PCA9564_A1_bit,PCA9564_A1_PORT  
         ;;  read I2CDAT data
		 lda temp
         tax             
         jsr PCA9564_READ_PORT 
         lda rOutBuffer_9564
         sta Rx_buffer,x                   
         lda temp  
		 sta pca9564_rx_in_ptr
		 lda pca9564_rx_in_ptr
         sta IOP_DATA2_L    ;;inform RISC     
         lda #PCA9564_continue_Receive_data_state
         sta pca9564_state  
		 jmp Exit_PCA9564                   
rx_buffer_is_full:
		 lda #PCA9564_beginning_state
         sta pca9564_state  
		 jmp Exit_PCA9564       

check_rx_stopped:
          ;;  Read I2CSTA     
         rmb PCA9564_A0_bit,PCA9564_A0_PORT 
         rmb PCA9564_A1_bit,PCA9564_A1_PORT      
         jsr PCA9564_READ_PORT                                           
         lda rOutBuffer_9564 
         cmp #$a0
         beq Receive_a_bulk_data_end  
		 jmp PCA9564_Error_Handling
;;-----------------------------------------------------------------------------------
Receive_a_bulk_data_end:          
         ;;  Reset SI bit in I2CCON, write I2CCON=0xc5
         lda  #$c5
         sta  rOutBuffer_9564
         jsr  PCA9564_WRITE_I2CCON   
         lda #PCA9564_beginning_state
         sta pca9564_state
         jmp Exit_PCA9564      
                
                
;;==================================================================================         
PCA9564_Slave_Transmit:               
		 lda pca9564_tx_out_ptr
		 sta temp           
         lda IOP_DATA3_L
		 adc #1
         cmp temp
         beq tx_buf_empty   
         lda #1
         sta Translate_data_flag  
         inc temp  
         lda temp
         cmp #MAX_TX_BUF_LEN
         bcc go_next_2
         stz temp
go_next_2:   
         ;; Load I2CDAT with DATA         
         lda  temp
		 sta  pca9564_tx_out_ptr
         lda  pca9564_tx_out_ptr
         sta  IOP_DATA3_H     
		 lda  temp
         tay   
         ;  Load I2CDAT with DATA         
         lda Tx_buffer,y
         jmp tx_buf_not_empty
tx_buf_empty:         
;         lda Translate_data_flag
;         cmp #1
;         beq No_transmit_data     
         lda #PCA9564_continue_Transmit_data_state
         sta pca9564_state
         jmp Exit_PCA9564 
No_transmit_data:
		 stz Translate_data_flag
         lda #PCA9564_beginning_state
         sta pca9564_state
         jmp Exit_PCA9564 
tx_buf_not_empty:         
         sta rOutBuffer_9564
         jsr PCA9564_WRITE_I2CDAT           
         ;;  Reset SI bit and AA bit I2CCON
         lda  #$c5
         sta  rOutBuffer_9564
         jsr  PCA9564_WRITE_I2CCON   

PCA9564_Transmit_Read_I2CCON:
         ;; Read I2CCON ,Judge SI bit ==1
         smb PCA9564_A0_bit,PCA9564_A0_PORT 
         smb PCA9564_A1_bit,PCA9564_A1_PORT             
         jsr PCA9564_READ_PORT 
         lda rOutBuffer_9564 
         and #$08 
         beq Continue_Read_I2CCON_For_Transmit      
         bra Read_I2CSTA_for_transmit
Continue_Read_I2CCON_For_Transmit:
		 lda #PCA9564_Transmit_Judge_SI_state
         sta pca9564_state
         jmp Exit_PCA9564 
Read_I2CSTA_for_transmit:         
          ;;  Read I2CSTA     
         rmb PCA9564_A0_bit,PCA9564_A0_PORT 
         rmb PCA9564_A1_bit,PCA9564_A1_PORT      
         jsr PCA9564_READ_PORT 
         ;inc stop_timeout_counter             
         ;lda stop_timeout_counter     
         ;cmp #MAX_TX_BUF_LEN
         ;bcs PCA9564_Error_Handling                                    
         lda rOutBuffer_9564 
		 cmp #$b8
		 beq Continue_transmit_data
         cmp #$c0
         beq Transmit_a_bulk_data_end 
         jmp  PCA9564_Error_Handling 
;;---------------------------------------------------------------------------------
Transmit_a_bulk_data_end: 
         stz stop_timeout_counter
		 ;;  Reset SI bit and AA bit I2CCON
         lda  #$c5
         sta  rOutBuffer_9564
         jsr  PCA9564_WRITE_I2CCON 
         lda #PCA9564_beginning_state
         sta pca9564_state
         jmp Exit_PCA9564   
;;--------------------------------------------------------------------------------          
Continue_transmit_data:			 
         lda #PCA9564_continue_Transmit_data_state
         sta pca9564_state
         jmp Exit_PCA9564  
;;=================================================================================
PCA9564_Error_Handling:  
         stz stop_timeout_counter
         lda IOP_DATA3_L
         sta pca9564_tx_out_ptr        
         jsr PCA9564_Init
         lda #PCA9564_beginning_state
         sta pca9564_state  
Exit_PCA9564:         
.endif


        

⌨️ 快捷键说明

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