Help Writing Spin Program to EEPROM
mynet43
Posts: 644
I'm trying to write a little program to read a spin program from an SD card and write it to the Propeller EEPROM, so it will boot up when power is cycled.
I've generated the saved program from the Propeller Tool by selecting:
Run/Compile Current/View Info
This displays the object info. From this I select: Show Hex. This brings up a listing of the program and several new option buttons.
I select the "Save EEPROM File" button and enter the file name I want to save. I then rename the file and save it to the SD card.
The program I'm using to copy from the SD card to the EEPROM is shown below. It seems to work fine, with no errors.
The messages displayed are:
VGA Started
i2c Started
SD Card Mounted
File Opened
File Closed
WgtBin written. (WgtBin is the name of the EEPROM file on the SD card.
I'm at the point where I've decided I'm missing something.
Here's the program I'm using:
You can see I've stolen some of it from other users [noparse]:)[/noparse]
Here's a hex dump of the first part of the EEPROM file (WgtBin) stored on the SD Card:
0000: 00 B4 C4 04 6F 73 10 00 20 1F 94 44 24 00 9C 44 ....os.. ..D$..D
0010: A0 01 03 02 14 00 04 00 40 00 0C 00 A0 01 14 00 ........@.......
0020: 68 14 08 21 02 05 02 65 01 87 80 2B 06 03 0E 01 h..!...e...+....
0030: 64 06 03 0A 01 38 0D 06 03 0D 32 52 65 74 75 72 d....8....2Retur
0040: 6E 65 64 20 66 72 6F 6D 20 73 74 61 72 74 0D 00 ned from start..
0050: 01 37 03 35 38 1A 38 1B 37 02 38 28 06 03 01 01 .7.58.8.7.8(....
0060: 87 81 11 06 03 0E 01 35 06 04 01 01 87 81 1C 06 .......5........
0070: 03 0E 01 87 81 26 06 03 0E 01 06 04 09 35 00 8B .....&.......5..
0080: 00 06 04 0A FC 0A 0E 01 8B 00 06 03 0E 01 38 0D ..............8.
0090: 06 03 0D 04 68 01 87 81 2D 06 03 0E 01 38 0D 06 ....h...-....8..
00A0: 03 0D 00 87 81 3D 38 77 06 04 04 65 01 87 81 4A .....=8w...e...J
00B0: 06 03 0E 01 64 06 03 0A 01 38 0D 06 03 0D 3F 91 ....d....8....?.
00C0: 69 35 6D 37 21 08 14 38 27 08 08 01 38 2A 06 04 i5m7!..8'...8*..
00D0: 08 09 78 01 38 0D 06 04 08 09 6C 01 06 04 03 01 ..x.8.....l.....
00E0: 87 81 5C 06 03 0E 00 87 81 69 38 72 06 04 04 65 ..\......i8r...e
00F0: 01 87 81 77 06 03 0E 01 64 06 03 0A 01 38 0D 06 ...w....d....8..
I think I should be storing something in the first part of the file before it's copied, but I don't know what to store there.
Would someone please take a look at this and tell me where I'm going wrong.
Thanks for your help.
Jim
I've generated the saved program from the Propeller Tool by selecting:
Run/Compile Current/View Info
This displays the object info. From this I select: Show Hex. This brings up a listing of the program and several new option buttons.
I select the "Save EEPROM File" button and enter the file name I want to save. I then rename the file and save it to the SD card.
The program I'm using to copy from the SD card to the EEPROM is shown below. It seems to work fine, with no errors.
The messages displayed are:
VGA Started
i2c Started
SD Card Mounted
File Opened
File Closed
WgtBin written. (WgtBin is the name of the EEPROM file on the SD card.
I'm at the point where I've decided I'm missing something.
Here's the program I'm using:
CON
_clkmode = xtal1 + pll16x
_xinfreq = 5_000_000
' VGA and Keyboard info for vga.start
BasePin = 16 ' base pin for video output (0, 8, 16, 24) - 16 on proto board
kbd_dpin = 26 ' keyboard dpin number - pin 26 on proto board
kbd_cpin = 27 ' keyboard cpin number - pin 27 on proto board
kbd_lock = %0_001_000 ' keyboard locks: disable scroll lock key, NumLock, CapsLock, ScrollLock all off
kbd_auto = %01_01000 ' keyboard auto repeat: 0.5 sec delay, 15 chars/sec repeat (?)
kbdflag = 0 ' set this if a keyboard is connected/needed
OBJ
sd : "fsrw" ' FAT File System Read/Write
i2c : "Basic_I2C_Driver"
vga : "VGA_1024"
VAR
long f0[noparse][[/noparse]128]
DAT
filname byte "WgtBin", 0 ' file name on SD card to copy to EEPROM
PUB CopyToEEPROM | a, b, c, d, i, j, sstart, start_time
' start the VGA and Keyboard routines
vga.start(BasePin, kbdflag, kbd_dpin, kbd_cpin, kbd_lock, kbd_auto)
vga.cursloc(0,1) ' locate cursor x,y
vga.str(string("VGA Started",13))
i2c.Initialize(i2c#BootPin)
vga.str(string("i2c Started",13,13))
if sd.mount(0) < 0 ' base pin 0
vga.str(string("Can't mount SD card",13))
else
vga.str(string("SD Card Mounted",13))
if sd.popen(@filname,"r")
vga.str(string("Can't open file",13))
else
vga.str(string("File Opened",13))
sstart:=0
i:=true
repeat 64
if sd.pread(@f0,512) <> 512
vga.str(string("Can't read program",13))
' else
' vga.str(string("Read Program OK",13))
' sdfat.pread(@f0, 512)
j:=@f0
repeat 16
if i2c.WritePage(i2c#BootPin, i2c#EEPROM, sstart, j, 32)
vga.str(string("Copy EEPROM write error",13))
i:=false
quit
' else
' vga.str(string("EEPROM write OK",13))
start_time := cnt ' prepare to check for a timeout
repeat while i2c.WriteWait(i2c#BootPin, i2c#EEPROM, sstart)
if cnt - start_time > clkfreq / 10
vga.str(string("Copy EEPROM wait error",13))
i:=false
quit
' else
' vga.str(string("EEPROM wait OK",13))
sstart += 32
j += 32
if sd.pclose < 0
vga.str(string("Error closing file",13))
else
vga.str(string("File Closed",13))
if i == true
vga.out(13)
vga.str(@filname)
vga.str(string(" written.",13))
else
vga.str(string("Write error [noparse][[/noparse]"))
vga.dec(i)
vga.str(string("]!",13))
You can see I've stolen some of it from other users [noparse]:)[/noparse]
Here's a hex dump of the first part of the EEPROM file (WgtBin) stored on the SD Card:
0000: 00 B4 C4 04 6F 73 10 00 20 1F 94 44 24 00 9C 44 ....os.. ..D$..D
0010: A0 01 03 02 14 00 04 00 40 00 0C 00 A0 01 14 00 ........@.......
0020: 68 14 08 21 02 05 02 65 01 87 80 2B 06 03 0E 01 h..!...e...+....
0030: 64 06 03 0A 01 38 0D 06 03 0D 32 52 65 74 75 72 d....8....2Retur
0040: 6E 65 64 20 66 72 6F 6D 20 73 74 61 72 74 0D 00 ned from start..
0050: 01 37 03 35 38 1A 38 1B 37 02 38 28 06 03 01 01 .7.58.8.7.8(....
0060: 87 81 11 06 03 0E 01 35 06 04 01 01 87 81 1C 06 .......5........
0070: 03 0E 01 87 81 26 06 03 0E 01 06 04 09 35 00 8B .....&.......5..
0080: 00 06 04 0A FC 0A 0E 01 8B 00 06 03 0E 01 38 0D ..............8.
0090: 06 03 0D 04 68 01 87 81 2D 06 03 0E 01 38 0D 06 ....h...-....8..
00A0: 03 0D 00 87 81 3D 38 77 06 04 04 65 01 87 81 4A .....=8w...e...J
00B0: 06 03 0E 01 64 06 03 0A 01 38 0D 06 03 0D 3F 91 ....d....8....?.
00C0: 69 35 6D 37 21 08 14 38 27 08 08 01 38 2A 06 04 i5m7!..8'...8*..
00D0: 08 09 78 01 38 0D 06 04 08 09 6C 01 06 04 03 01 ..x.8.....l.....
00E0: 87 81 5C 06 03 0E 00 87 81 69 38 72 06 04 04 65 ..\......i8r...e
00F0: 01 87 81 77 06 03 0E 01 64 06 03 0A 01 38 0D 06 ...w....d....8..
I think I should be storing something in the first part of the file before it's copied, but I don't know what to store there.
Would someone please take a look at this and tell me where I'm going wrong.
Thanks for your help.
Jim

Comments
Your program looks like it ought to copy the specified file from an SD card file to the boot EEPROM.
What do you need to store in the first part of the file before it's copied? The .binary file should be
what you need to copy to EEPROM. There is a checksum in the Spin header (bytes $0000-$000F),
but I think it's only used during the download from the PC. The program loader in FemtoBasic (and
some other programs) also uses this checksum when loading from EEPROM or an SD card file, but
it stops checksumming at the end of the program in the .binary file and doesn't care what's beyond
that.
EEPROM-file is fine ... you only waste the part of the 32kB that's not used by your program, but on a 2 GB SD-card ... who cares?
I'd only check the datasheet of the EEPROM you used to adjust the number of bytes you write to it in the inner loop.
( PS: Ah ... I see you already did ... in my code it was 64 )
PPS: And I added
············· if (sstart//1024) == 0
··············· term.tx( "." )
after the if i2c.WritePage...
This gives a nice progress indication ;o)
Post Edited (MagIO2) : 6/10/2009 6:53:37 AM GMT
Thanks to both of you. Yes, I borrowed code from each of you [noparse]:)[/noparse]
MagicIO, you nailed the problem. It was incrementing of the two variables outside of the loop.
It's one of those things I could have stared at for eons and not seen.
I fixed those and now it works perfectly.
I'm using the at24c512, which has a 128 byte page, so I can probably change the write from 32 to 128 bytes.
The reason I had 32 was I was afraid I'd lose something at the end of the file.
I'm still not clear on the difference between the "binary" and the "eeprom" files.
Are these documented somewhere? This seems to work OK with the eeprom file.
Thanks again for the help. You saved me a lot of time!
Jim
The binary file only contains the used space of the EEPROM, so usually it's a bit smaller. That's it.
Thanks for the info, it helps.
By the way, I tried the program with 128 byte writes, and it worked fine with this EEPROM.
Jim