also, verify all 3 first bytes of SPI commands. I'm not sure why I wasn't doing that, probably because I was getting a lot of AVR err and thought that only 2 bytes of the cmd were echoed. But now, with a reliable SPI setup, verifying 3 bytes seems to work.master
@@ -1,4 +1,4 @@ | |||||
( AVR Programmer, load range 160-162. doc/avr.txt ) | |||||
( AVR Programmer, load range 160-163. doc/avr.txt ) | |||||
( page size in words, 64 is default on atmega328P ) | ( page size in words, 64 is default on atmega328P ) | ||||
CREATE aspfpgsz 64 , | CREATE aspfpgsz 64 , | ||||
VARIABLE aspprevx | VARIABLE aspprevx | ||||
@@ -6,7 +6,7 @@ VARIABLE aspprevx | |||||
: _xc ( a -- b ) DUP (spix) ( a b ) | : _xc ( a -- b ) DUP (spix) ( a b ) | ||||
DUP aspprevx @ = NOT IF ABORT" AVR err" THEN ( a b ) | DUP aspprevx @ = NOT IF ABORT" AVR err" THEN ( a b ) | ||||
SWAP aspprevx ! ( b ) ; | SWAP aspprevx ! ( b ) ; | ||||
: _cmd ( b4 b3 b2 b1 -- r4 ) _xc DROP _x DROP _xc DROP _x ; | |||||
: _cmd ( b4 b3 b2 b1 -- r4 ) _xc DROP _xc DROP _xc DROP _x ; | |||||
: asprdy ( -- ) BEGIN 0 0 0 0xf0 _cmd 1 AND NOT UNTIL ; | : asprdy ( -- ) BEGIN 0 0 0 0xf0 _cmd 1 AND NOT UNTIL ; | ||||
: asp$ ( spidevid -- ) | : asp$ ( spidevid -- ) | ||||
( RESET pulse ) DUP (spie) 0 (spie) (spie) | ( RESET pulse ) DUP (spie) 0 (spie) (spie) | ||||
@@ -0,0 +1,6 @@ | |||||
: aspe@ ( addr -- byte, read from EEPROM ) | |||||
0 SWAP 256 /MOD ( 0 lsb msb ) SWAP | |||||
0xa0 ( 0 msb lsb 0xa0 ) _cmd ; | |||||
: aspe! ( byte addr --, write to EEPROM ) | |||||
256 /MOD ( b lsb msb ) SWAP | |||||
0xc0 ( b msb lsb 0xc0 ) _cmd DROP asprdy ; |
@@ -103,3 +103,10 @@ aspfb! that divides dst addr by 2 because AMOVEW use byte-based | |||||
addresses but aspfb! uses word-based ones. You also have to make | addresses but aspfb! uses word-based ones. You also have to make | ||||
sure that A@* points to @ (or another word-based fetcher) | sure that A@* points to @ (or another word-based fetcher) | ||||
instead of its default value of C@. | instead of its default value of C@. | ||||
# Access EEPROM | |||||
Accessing EEPROM is simple and is done byte-by-byte with words | |||||
aspe@ and aspe!. Example: | |||||
0x42 0 aspe! 0 aspe@ .x ( prints 42 ) |
@@ -27,8 +27,8 @@ the "no division" position, and when I communicate with the | |||||
AVR chip, I move the switch to increase the divisor. | AVR chip, I move the switch to increase the divisor. | ||||
Once you've done this, you can test that you can communicate | Once you've done this, you can test that you can communicate | ||||
with your AVR chip by doing `160 162 LOADR` (turn off your | |||||
programmer or alse it might mess up the SPI bus and prevent you | |||||
with your AVR chip by doing `160 163 LOADR` (turn off your | |||||
programmer or else it might mess up the SPI bus and prevent you | |||||
from using your SD card) and then running: | from using your SD card) and then running: | ||||
1 asp$ aspfl@ .x 0 (spie) | 1 asp$ aspfl@ .x 0 (spie) | ||||