<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wiki.sandboxpedal.com/index.php?action=history&amp;feed=atom&amp;title=Programming_an_EEPROM_with_HEX_files</id>
	<title>Programming an EEPROM with HEX files - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.sandboxpedal.com/index.php?action=history&amp;feed=atom&amp;title=Programming_an_EEPROM_with_HEX_files"/>
	<link rel="alternate" type="text/html" href="https://wiki.sandboxpedal.com/index.php?title=Programming_an_EEPROM_with_HEX_files&amp;action=history"/>
	<updated>2026-08-24T05:03:20Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.43.9</generator>
	<entry>
		<id>https://wiki.sandboxpedal.com/index.php?title=Programming_an_EEPROM_with_HEX_files&amp;diff=15&amp;oldid=prev</id>
		<title>Matthew: Add how-to guide</title>
		<link rel="alternate" type="text/html" href="https://wiki.sandboxpedal.com/index.php?title=Programming_an_EEPROM_with_HEX_files&amp;diff=15&amp;oldid=prev"/>
		<updated>2026-08-23T23:53:23Z</updated>

		<summary type="html">&lt;p&gt;Add how-to guide&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;Once the [[Installing the RP2040 programmer firmware|programmer firmware is installed]], writing a new algorithm to your pedal means copying a file onto a USB drive.  There is no software to launch and no driver to install.&lt;br /&gt;
&lt;br /&gt;
== Quick version ==&lt;br /&gt;
&lt;br /&gt;
# Plug the RP2040 board into USB.  A drive named &amp;#039;&amp;#039;&amp;#039;SANDBOX-FV1&amp;#039;&amp;#039;&amp;#039; appears.&lt;br /&gt;
# Connect the target 24LC32A EEPROM to the I&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;C pins.&lt;br /&gt;
# Drop a HEX file onto the drive, named for the slot you want (&amp;lt;code&amp;gt;0.hex&amp;lt;/code&amp;gt; … &amp;lt;code&amp;gt;7.hex&amp;lt;/code&amp;gt;, or &amp;lt;code&amp;gt;all.hex&amp;lt;/code&amp;gt;).&lt;br /&gt;
# Watch the LED: dim blue while writing, green on success, blinking red on error.&lt;br /&gt;
&lt;br /&gt;
On success the programmer pulses the FV-1&amp;#039;s control pin so the chip reloads immediately.  You do not need to power-cycle the pedal.&lt;br /&gt;
&lt;br /&gt;
== Naming the file ==&lt;br /&gt;
&lt;br /&gt;
The filename is not cosmetic — it is how you choose which of the eight FV-1 program slots gets written.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Filename !! EEPROM address !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;0.hex&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;0x0000&amp;lt;/code&amp;gt; || On a Sandbox pedal this slot is bypass&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;1.hex&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;0x0200&amp;lt;/code&amp;gt; ||&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;2.hex&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;0x0400&amp;lt;/code&amp;gt; ||&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;3.hex&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;0x0600&amp;lt;/code&amp;gt; || Also the destination for any unrecognised filename&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;4.hex&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;0x0800&amp;lt;/code&amp;gt; ||&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;5.hex&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;0x0A00&amp;lt;/code&amp;gt; ||&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;6.hex&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;0x0C00&amp;lt;/code&amp;gt; ||&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;7.hex&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;0x0E00&amp;lt;/code&amp;gt; ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
A file with any other name is written to &amp;lt;code&amp;gt;0x0600&amp;lt;/code&amp;gt; — program 3.  That is deliberate: program 3 is the slot the FV-1 selects when no toggle switches are fitted to the PCB, so a bare board with a single algorithm on it just works.&lt;br /&gt;
&lt;br /&gt;
== Toggle switch positions ==&lt;br /&gt;
&lt;br /&gt;
If your pedal has the two toggle switches fitted, the switch positions map to slots like this:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! !! Right switch up !! Right switch down&lt;br /&gt;
|-&lt;br /&gt;
! Left switch up&lt;br /&gt;
| &amp;lt;code&amp;gt;2.hex&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;6.hex&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! Left switch middle&lt;br /&gt;
| &amp;lt;code&amp;gt;3.hex&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;7.hex&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! Left switch down&lt;br /&gt;
| &amp;lt;code&amp;gt;1.hex&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;5.hex&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The [[Using the Sandbox FV-1 Editor|editor]] shows the same grid, so you can pick the physical switch position you want rather than remembering slot numbers.&lt;br /&gt;
&lt;br /&gt;
== File format rules ==&lt;br /&gt;
&lt;br /&gt;
The programmer validates every file before it writes anything.  A file that fails validation is rejected outright — it will not half-program your chip.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Single-slot files&amp;#039;&amp;#039;&amp;#039; (anything except &amp;lt;code&amp;gt;all.hex&amp;lt;/code&amp;gt;):&lt;br /&gt;
&lt;br /&gt;
* Exactly &amp;#039;&amp;#039;&amp;#039;129 lines&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
* Address range &amp;#039;&amp;#039;&amp;#039;0x000–0x1FF&amp;#039;&amp;#039;&amp;#039; — 512 bytes, which is one FV-1 program.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Full-image files&amp;#039;&amp;#039;&amp;#039; (&amp;lt;code&amp;gt;all.hex&amp;lt;/code&amp;gt;):&lt;br /&gt;
&lt;br /&gt;
* Exactly &amp;#039;&amp;#039;&amp;#039;1025 lines&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
* Address range &amp;#039;&amp;#039;&amp;#039;0x000–0xFFF&amp;#039;&amp;#039;&amp;#039; — the whole 4096-byte chip.&lt;br /&gt;
* The EEPROM is cleared to &amp;lt;code&amp;gt;0xFF&amp;lt;/code&amp;gt; first, then written from &amp;lt;code&amp;gt;0x0000&amp;lt;/code&amp;gt;.&lt;br /&gt;
* If &amp;lt;code&amp;gt;all.hex&amp;lt;/code&amp;gt; is present it is processed &amp;#039;&amp;#039;&amp;#039;first and alone&amp;#039;&amp;#039;&amp;#039;.  Other HEX files dropped in the same batch are skipped that cycle, so do not mix a full image with single slots.&lt;br /&gt;
&lt;br /&gt;
These line counts are what the assembler produces naturally.  If your file is the wrong length, it almost certainly did not come from an FV-1 assembler.&lt;br /&gt;
&lt;br /&gt;
== Reading the status indicators ==&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;RGB LED:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Colour !! Meaning&lt;br /&gt;
|-&lt;br /&gt;
| Off || Idle, waiting&lt;br /&gt;
|-&lt;br /&gt;
| Dim blue || Writing&lt;br /&gt;
|-&lt;br /&gt;
| Green || Write succeeded&lt;br /&gt;
|-&lt;br /&gt;
| Blinking red || Error — check the serial console for the reason&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;OLED display&amp;#039;&amp;#039;&amp;#039; (production programmer only):&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;No target / Connect EEPROM&amp;lt;/code&amp;gt; — nothing detected on the I&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;C bus.&lt;br /&gt;
* &amp;lt;code&amp;gt;EEPROM found / Waiting for .hex&amp;lt;/code&amp;gt; — ready.&lt;br /&gt;
* &amp;lt;code&amp;gt;Complete / Waiting for .hex&amp;lt;/code&amp;gt; — the last write succeeded.&lt;br /&gt;
&lt;br /&gt;
After about 20 seconds of inactivity a screensaver bounces an &amp;quot;FV-1 PROG&amp;quot; label around the display.  Press the button to dismiss it; it is not an error state.&lt;br /&gt;
&lt;br /&gt;
== Re-flashing the same file ==&lt;br /&gt;
&lt;br /&gt;
The programmer remembers which files it has already handled in the current session, so dropping an unchanged &amp;lt;code&amp;gt;2.hex&amp;lt;/code&amp;gt; a second time does nothing.  To force a re-flash, disconnect and reconnect the EEPROM — that clears the processed list.&lt;br /&gt;
&lt;br /&gt;
After a successful write the programmer also creates a marker file such as &amp;lt;code&amp;gt;0.hex.programmed&amp;lt;/code&amp;gt;.  It is purely a record and is safe to delete.&lt;br /&gt;
&lt;br /&gt;
== Common failures ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Symptom !! Likely cause&lt;br /&gt;
|-&lt;br /&gt;
| Stuck on &amp;lt;code&amp;gt;Connect EEPROM&amp;lt;/code&amp;gt; || EEPROM not seen on I&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;C.  Check wiring and that the chip answers at address &amp;lt;code&amp;gt;0x50&amp;lt;/code&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;BAD LINE COUNT&amp;lt;/code&amp;gt; || Not 129 lines (single slot) or 1025 lines (&amp;lt;code&amp;gt;all.hex&amp;lt;/code&amp;gt;).&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;BAD ADDR RANGE&amp;lt;/code&amp;gt; || The HEX addresses do not match the expected range for that slot.&lt;br /&gt;
|-&lt;br /&gt;
| Red blink at startup || I&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;C bus locked, or no EEPROM present during the initial scan.&lt;br /&gt;
|-&lt;br /&gt;
| File copied, nothing happens || The file is a dotfile, is zero bytes, or was already processed this session.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
A zero-byte HEX file is ignored but still marked as processed.  This is how the editor&amp;#039;s &amp;#039;&amp;#039;&amp;#039;Clear Hardware&amp;#039;&amp;#039;&amp;#039; button works — it writes empty files over the slots.&lt;br /&gt;
&lt;br /&gt;
macOS users: Finder likes to write hidden &amp;lt;code&amp;gt;._&amp;lt;/code&amp;gt; companion files onto removable drives.  The programmer ignores dotfiles, so these are harmless.&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
&lt;br /&gt;
* [[Installing the RP2040 programmer firmware]]&lt;br /&gt;
* [[Using the Sandbox FV-1 Editor]]&lt;br /&gt;
* [[Troubleshooting]]&lt;br /&gt;
&lt;br /&gt;
[[Category:How-to]]&lt;/div&gt;</summary>
		<author><name>Matthew</name></author>
	</entry>
</feed>