II.4 Design of MCS-51 Evaluation Boards
When developing embedded systems, debugging aspects should be taken into
account as soon as possible. That is why MCS-51 prototype
boards should always be armed with a download RAM in the hardware design
phase, even if the serial model (probably) doesn't need an external RAM!
A $3 RAM can save a $3000 in-circuit emulator and weeks of trouble!
Before discussing the basic concepts of program download, it is essential
to understand the memory organization of the MCS-51 architecture.
First of all, there is an 8-bit address space for internal RAM.
Parts of it are directly addressable (DATA space), indirectly addressable
(IDATA space), or bit-addressable (BIT space). These address spaces are fully
or partly overlapping. Furthermore, the four register banks and the Special
Function Registers (SFR) are mapped into this internal address space. This
is hard to understand for newbies, but plays no role for program download.
Aside of the internal memory, the MCS-51 architecture provides
a bus interface for external memory. There are two separate 16-bit
address spaces for 64K of program memory (ROM) and 64K of data memory (RAM).
Program memory (CODE space) can only be read with the -PSEN
bus signal, and data memory (XDATA space) can be read and written with the
-RD and -WR bus signals. The
-PSEN signal becomes active during instruction fetch cycles
and MOVC instructions. The -RD and -WR
signals become active during read and write operations with MOVX instructions.
The obvious problem is: a downloaded program can only be stored in external
RAM, mapped into the XDATA space, whereas program code can only be executed
from memory in the CODE space.
There must be a way to execute a downloaded program, although it is stored
in external RAM! Fortunately, there is a simple trick to solve this:
The -OE input of the (usually static) RAM must be driven
by a logic AND of the -RD and -PSEN
signals of the MCU, rather than by -RD alone.
That's all!
Then the external RAM can be read and written with MOVX instructions
(using -RD and -WR), and program code
can be executed from it (using -PSEN).
For example, a typical 8051 evaluation board could be designed as follows:
A 32K EPROM (e.g. 27C256) is mapped into the CODE space from
address 0000H to 7FFFH, containing BOOT-51 at address 0000H.
A 32K static RAM (e.g. 62256) is mapped into both the CODE and
XDATA spaces from address 8000H to FFFFH.
After reset, the MCU starts program execution at address 0000H, and
BOOT-51 is running, waiting for commands. When it receives an
UPLOAD command from the host computer, it reads an Intel-HEX file and
stores it at its start address in the external RAM (e.g. 8000H).
If BOOT-51 receives a GO TO 8000 command, it
jumps to the specified address 8000H, and the downloaded program is running.
A memory map like this can be obtained with a minimum of hardware:
The -CE (chip enable) input of the EPROM must be driven
by the A15 signal (P2.7) of the MCU, and
-CE of the RAM with the inverted A15
signal respectively, to avoid bus conflicts in the CODE space.
The -OE (output enable) input of the EPROM must be driven
by the -PSEN signal of the MCU, as usual for CODE memory.
The -WE (write enable) input of the RAM must be driven by
the -WR signal (P3.6) of the MCU, as usual
for XDATA memory.
Only the -OE (output enable) input of the RAM must be
driven by that famous logical AND of the -RD and
-PSEN signals of the MCU, to map the RAM into both the
XDATA and CODE space. That's it!
Because this is so simple, cheap and (in contrast to many
in-circuit emulators) absolutely reliable, most
MCS-51 family evaluation boards are working like this or
similar.
In most cases, it is easy to establish a suitable memory map, even on
target boards that do not originally support it.
If there is no spare AND gate, it may also do, to simply connect the
-OE input of the RAM to the -PSEN
signal of the MCU only.
In this case, the RAM can still be written, but no longer be read with MOVX
instructions. Since program code can also be executed from it, this minimized
version can still be used as download RAM, but no longer as external data
RAM.
(In cases of emergency, it can be read with MOVC instructions, however!)