📄 pca9564_int.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 + -