Код:
; -----------------------------------------------------------------------------
; SPI
; -----------------------------------------------------------------------------
; Ports:
; #02: Data Buffer (write/read)
; bit 7-0 = Stores SPI read/write data
; #03: Command/Status Register (write)
; bit 7-2 = Reserved
; bit 1 = 1:IRQEN (Generate IRQ at end of transfer)
; bit 0 = 1:END (Deselect device after transfer/or immediately if START = '0')
; #03: Command/Status Register (read):
; bit 7 = 1:BUSY (Currently transmitting data)
; bit 6 = 1:DESEL (Deselect device)
; bit 5-0 = Reserved
SPI_END LD A,%00000001 ; Config = END
OUT (#03),A
RET
SPI_START XOR A
OUT (#03),A
RET
SPI_W IN A,(#03)
RLCA
JR C,SPI_W
LD A,D
OUT (#02),A
RET
SPI_R LD D,#FF
CALL SPI_W
SPI_R1 IN A,(#03)
RLCA
JR C,SPI_R1
IN A,(#02)
RET
Пример чтения с адреса #60000 SPI-FLASH 512K:
Код:
ORG #8000
StartProg:
DI
LD A,%00000001 ; Bit2 = 0:Loader ON, 1:Loader OFF; Bit1 = 0:SRAM<->CPU0, 1:SRAM<->GS; Bit0 = 0:TDA1543, 1:M25P40
OUT (#01),A
; -----------------------------------------------------------------------------
; SPI autoloader
; -----------------------------------------------------------------------------
CALL SPI_START
LD D,%00000011 ; Command = READ
CALL SPI_W
LD D,#06 ; Address = #060000
CALL SPI_W
LD D,#00
CALL SPI_W
LD D,#00
CALL SPI_W
LD HL,#8000
SPI_LOADER1 CALL SPI_R
LD (HL),A
INC HL
LD A,L
OR H
JR NZ,SPI_LOADER1
LD A,%00000111 ; Bit2 = 0:Loader ON, 1:Loader OFF; Bit1 = 0:SRAM<->CPU0, 1:SRAM<->GS; Bit0 = 0:TDA1543, 1:M25P40
OUT (#01),A
LD HL,#C000 ; ADDRESS READ DATA
SPI_LOADER2 CALL SPI_R
LD (HL),A
INC HL
LD A,L
OR H
JR NZ,SPI_LOADER2
CALL SPI_END
LD A,%00011111 ; Маска порта #DFFD (разрешаем 4MB)
OUT (#00),A
LD A,%00000110 ; Bit2 = 0:Loader ON, 1:Loader OFF; Bit1 = 0:SRAM<->CPU0, 1:SRAM<->GS; Bit0 = 0:TDA1543, 1:M25P40
OUT (#01),A
RET