PIC16C745/765
DS41124C-page 72
Preliminary
2000 Microchip Technology Inc.
10.9
USB Firmware Users Guide
10.9.1
INTRODUCING THE USB SOFTWARE
INTERFACE
Microchip provides a layer of software that handles the
lowest level interface so your application won’t have
to. This provides a simple Put/Get interface for com-
munication. Most of the USB processing takes place in
the background through the Interrupt Service Routine.
From the application viewpoint, the enumeration pro-
cess and data communication takes place without fur-
ther interaction. However, substantial setup is required
in the form of generating appropriate descriptors.
FIGURE 10-3: USB SOFTWARE INTERFACE
10.9.2
INTEGRATING USB INTO YOUR
APPLICATION
The latest version of the USB interface software
is
available
on
Microchip's
website
(see
http://www.microchip.com/).
The interface to the application is packaged in 3 func-
tions: InitUSB, PutUSB and GetUSB. InitUSB initial-
izes the USB peripheral, allowing the host to
enumerate the device. Then, for normal data commu-
nications, function PutUSB sends data to the host and
GetUSB receives data from the host.
However, there's a fair amount of setup work that must
be completed. USB depends heavily on the descrip-
tors. These are the software parameters that are com-
municated to the host to let it know what the device is,
and how to communicate with it. See USB V1.1 spec
section 9.5 for more details.
Also, code must be added to give meaning to the
SetConfiguration command. The Chapter 9 com-
mands call SetConfiguration when it receives the
command. Both the descriptors and SetConfigura-
tion are in DESCRIPT.ASM.
InitUSB enables the USB interrupt so enumeration
can begin. The actual enumeration process occurs in
the background, driven by the host and the Interrupt
Service Routine. Macro ConfiguredUSB waits until
the device is in the CONFIGURED state. The time
required to enumerate is completely dependent on the
host and bus loading.
10.9.3
INTERRUPT STRUCTURE CONCERNS
10.9.3.1
Processor Resources
Most of the USB processing occurs via the interrupt and
thus is invisible to application. However, it still con-
sumes processor resources. These include ROM, RAM,
Common RAM and Stack Levels. This section attempts
to quantify the impact on each of these resources, and
shows ways to avoid conflicts.
If you write your own Interrupt Service Routine: W,
Status, FSR and PCLATH may be corrupted by servic-
ing the USB interrupt and must be saved.
USB_MAIN.ASM provides a skeleton ISR which does
this for you, and includes tests for each of the possible
interrupt bits. This provides a good starting point if you
haven't already written your own.
10.9.3.2
Stack Levels
The hardware stack on the PICmicro MCU is only 8
levels deep. So the worst case call between the applica-
tion and ISR can only be 8 levels. The enumeration pro-
cess requires 4 levels, so it’s best if the main application
holds off on any processing until enumeration is com-
plete. ConfiguredUSB is a macro that waits until the
enumeration process is complete for exactly this pur-
pose, by testing the lower two bits of USWSTAT
(0x197).
10.9.3.3
ROM
The code required to support the USB interrupt,
including the chapter 9 interface calls, but not includ-
ing the descriptor tables, is about 1kW. The descriptor
and string descriptor tables can each take up to an
additional 256W. The location of these parts is not
restricted.
10.9.3.4
RAM
With the exception of Common RAM discussed below,
servicing the USB interrupt requires ~40 bytes of
RAM in Bank 2. That leaves all the General Purpose
RAM in banks zero and one, plus half of bank two,
available for your application to use.
10.9.3.5
Common RAM Usage
The PIC16C745/765 has 16 bytes of common RAM.
These are the last 16 addresses in each bank and all
refer to the same 16 bytes of memory, without regard
to which register bank is currently addressed by the
RP0, RP1 and IRP bits.
These are particularly useful when responding to inter-
rupts. When an interrupt occurs, the ISR doesn’t imme-
diately know which bank is addressed. With devices
that don’t support common RAM, the W register must
be provided for in each bank. The 16C745/765 can
save the appropriate registers in Common RAM and not
have to waste a byte in each bank for W register.
Main Application
Put
Get
Init
USB Peripheral
USB
745cov.book Page 72 Wednesday, August 2, 2000 8:24 AM