Да там же все просто
выдрал кусок из старого проекта, SPI здесь софтом делается
нужно только макросы описать для ног
Здесь прошивка PLD лежит во вторых 64к флеша меги, первые 2 байта размер прошивки
Код
#define nSTAT_PORT PINB
#define nSTAT_PIN 6
ifnSTATOn MACRO Oper
sbic nSTAT_PORT, nSTAT_PIN
Oper
ENDM
ifnSTATOff MACRO Oper
sbis nSTAT_PORT, nSTAT_PIN
Oper
ENDM
#define DCLK_PORT PORTB
#define DCLK_PIN 2
#define DCLKOn sbi DCLK_PORT, DCLK_PIN
#define DCLKOff cbi DCLK_PORT, DCLK_PIN
DCLKSpike MACRO
sbi DCLK_PORT, DCLK_PIN
cbi DCLK_PORT, DCLK_PIN
ENDM
ifDCLKOn MACRO Oper
sbic DCLK_PORT, DCLK_PIN
Oper
ENDM
ifDCLKOff MACRO Oper
sbis DCLK_PORT, DCLK_PIN
Oper
ENDM
Delay MACRO us
LOCAL _l
ldi r21, CLOCK_FREQ/1000000*(us)/3
_l: dec r21
brne _l
ENDM
LoadPld:
nCONFOff
DCLKOff
DATA0Off
Delay 2
nCONFOn
Delay 5
ldi r16, 1
out RAMPZ, r16
clr ZL
clr ZH
in r16, DATA0_PORT
elpm r18, Z+
elpm r19, Z+
cpi r19, 0xFF
breq _ok
MainLoop:
elpm r0, Z+
ldi r17, 8
loop: bst r0, 0
bld r16, DATA0_PIN
out DATA0_PORT, r16
ifnSTATOff <rjmp Failed>
lsr r0
dec r17
DCLKOn
brne loop
cp r18, ZL
cpc r19, ZH
brne MainLoop
DATA0Off
clr r16
Wait: DCLKOn
dec r16
breq Failed
DCLKOff
ifC_DONEOff <rjmp Wait>
ldi r16, 10
Wait2:
DCLKOn
dec r16
DCLKOff
brne Wait2
_ok:
clr r16
out RAMPZ, r16
ser r16
ret
Failed: clr r16
out RAMPZ, r16
ret