Napisać czy dostosować go do odbierania pojedynczych bajtów.
Bo widzę że nie bardzo wiesz, że z karty SD czy MMC nie można od tak sobie po prostu pobrać czy zapisać pojedynczy bajt.
Trzeba odczytywać/zapisywać sektorami po 512B (można ustawić inny sektor, ale domyślnie jest 512B. Pozostałe które można ustawić są tylko większe, np: 1024, 2048B).
Odczyt jeszcze można zakończyć wcześniej, ale zapis musi iść do końca.
No dobra, na razie procedura szybkiego odczytu całego sektora 512B:
Dim Sector(512) As Byte
Dim Command_2 As Long 'Adres początku sektora
Command_2 = 1024 'To musi być wielokrotnością 512-tu
Gosub Receive_sector_from_sd
Do
Loop
'-------------------------------------------------------------------------------
Receive_sector_from_sd:
ldi R17, &H51
ldi R18, &HFF
Gosub Send_command_to_sd
ldi R19, 250
ldi R20, 250
!Wait_sd_ready_loop:
subi R19, 1
sbci R20, 0
brcc Jeszcze_czekaj3_Sd
jmp Nie_ma_miejsca_Sd
!Jeszcze_czekaj3_Sd:
ldi R16, &HFF
Gosub Spi_send_receive_byte_sd
cpi R16, &HFE
brne Wait_sd_ready_loop
Loadadr Sector(1) , X
ldi R19, &HFF
!Out SPDR, R19
nop
nop
nop
nop
ldi R17, 254
ldi R18, 1
!Loop_Receive_sector_from_sd:
nop
nop
nop
nop
nop
nop
nop
nop
nop
In R16, SPDR
ldi R19, &HFF
!Out SPDR, R19
st X+, R16
subi R17, 1
sbci R18, 0
brcc Loop_Receive_sector_from_sd
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
In R16, SPDR
st X+, R16
ldi R16, &HFF
Gosub Spi_send_receive_byte_sd
ldi R16, &HFF
Gosub Spi_send_receive_byte_sd
!Nie_ma_miejsca_Sd:
Return
'-------------------------------------------------------------------------------
Send_command_to_sd:
ldi R16, &HFF
Gosub Spi_send_receive_byte_sd
mov R16, R17
Gosub Spi_send_receive_byte_sd
lds R16, {Command_2+3}
Gosub Spi_send_receive_byte_sd
lds R16, {Command_2+2}
Gosub Spi_send_receive_byte_sd
lds R16, {Command_2+1}
Gosub Spi_send_receive_byte_sd
lds R16, {Command_2+0}
Gosub Spi_send_receive_byte_sd
mov R16, R18
Gosub Spi_send_receive_byte_sd
ldi R16, &HFF
Gosub Spi_send_receive_byte_sd
ldi R16, &HFF
Gosub Spi_send_receive_byte_sd
Return
'-------------------------------------------------------------------------------
Spi_send_receive_byte_sd:
!Out SPDR, R16
!Wait_transmit:
sbis SPSR, SPIF
rjmp Wait_Transmit
In R16, SPDR
Return
'-------------------------------------------------------------------------------
Oczywiście to zadziała, ale dopiero gdy wcześniej sprzętowe SPI będzie już skonfigurowane.
Ale chyba masz już zrobione.
Widzę że procedura zapisu jeszcze nie jest do końca zoptymalizowana. Widocznie nie było mi to potrzebne.