; ; ;[to ECU, request] ; +0 +1 +2 +3 +4 ; N/A CCCCAAAA msb lsb data ; C=0 Read ; 1 Write ; f NOP ; ;[from ECU, answer] ; +0 +1 +2 +3 +4 ; CCCCAAAA msb lsb data 0x00 ; C=0 Read ; 1 Write ; f NOP ; ;[from ECU, idle] ; +0 +1 +2 +3 +4 ; 0xff 'F' 'D' '3' 'S' ; m_state equ $0900 QSMTOP equ $f400 QPDR equ $15 SPCR0 equ $18 SPCR1 equ $1a SPCR2 equ $1c SPSR equ $1f RRAM equ $0100 TRAM equ $0120 CRAM equ $0140 ; QSPI initializer org $01360 QSPI_INIT: jsr $0134c ldab #$ff stab m_state,z ; state = 0xff ldab #$0f tbyk ldy #QSMTOP ldab #$a0 stab CRAM,y stab CRAM+1,y stab CRAM+2,y stab CRAM+3,y ldab #$20 stab CRAM+4,y ldab #$ff stab QPDR,y ; PCS default value = 1 ldab #$0b stab $16,y ldab #$0e stab $17,y ldd #$8308 ; 16bit, 1Mbps std SPCR0,y ldd #$0205 ; delay value DT=10us std SPCR1,y jmp $007e2 ; return to main loop QSPI_PARSE: ldab #$0f tbyk ldy #QSMTOP ldab m_state,z cmpb #$fe beq waitcmd idle: brclr SPCR1,y,#$80,idle2 ; check SPE, disable if cleared brclr SPSR,y,#$80,continue ; check SPIF, busy if cleared ldab m_state,z cmpb #$fd bne idle2 brset SPSR,y,#$04,done ; check CPTQP queue pointer rts ; continue done: ldab #$ff stab m_state,z idle2: bclr SPCR1,y,#$80 ; SPE=0, stop transmit ldab #$ff stab TRAM+1,y ldab #'F' stab TRAM+3,y ldab #'D' stab TRAM+5,y ldab #'3' stab TRAM+7,y ldab #'S' stab TRAM+9,y ; send REQ ldd #$0400 std SPCR2,y ; clear ENDP, NEWP bset SPCR1,y,#$80 ; SPE=1, start transmit ldab #$fe stab m_state,z ; sent REQ, waitcmd rts waitcmd: brclr SPSR,y,#$80,continue ; check SPIF, busy if cleared brset SPSR,y,#$04,wdone ; check CPTQP queue pointer rts ; continue wdone: bclr SPCR1,y,#$80 ; SPE=0, stop transmit ldaa #$ff staa m_state,z ; got cmd ldab RRAM+3,y ; receive data tba anda #$f0 cmpa #$f0 bne cmd rts ; nop command, continue cmd: cmpa #$00 beq mread cmpa #$10 beq mwrite rts ; other cmd, resend REQ mread: tbxk ; set segment ldaa RRAM+5,y ldab RRAM+7,y xgdx ldab $00,x stab TRAM+7,y ldab RRAM+3,y stab TRAM+1,y ldab RRAM+5,y stab TRAM+3,y ldab RRAM+7,y stab TRAM+5,y clr TRAM+9,y ldd #$0400 std SPCR2,y ; clear NEWP, ENDP ldab #$fd stab m_state,z ; transmitting bset SPCR1,y,#$80 ; SPE=1, start transmit rts mwrite: tbxk ; set segment ldaa RRAM+5,y ldab RRAM+7,y xgdx ldab RRAM+9,y stab $00,x ldab $00,x stab TRAM+7,y ldab RRAM+3,y stab TRAM+1,y ldab RRAM+5,y stab TRAM+3,y ldab RRAM+7,y stab TRAM+5,y clr TRAM+9,y ldd #$0400 std SPCR2,y ; clear NEWP, ENDP ldab #$fd stab m_state,z ; transmitting bset SPCR1,y,#$80 ; SPE=1, start transmit continue: rts