PIC18F97J60 FAMILY
DS39762A-page 240
Advance Information
2006 Microchip Technology Inc.
18.5.3.3
Freeing Receive Buffer Space
After the user application has processed a packet (or
part of the packet) and needs to free the occupied
buffer space used by the processed data, it must
advance the Receive Buffer Read Pointers, ERXRDPT.
The module will always write up to, but not include, the
memory pointed to by the Receive Buffer Read Point-
ers. If an overwrite of the Receive Buffer Read Pointer
locations occurs, the packet in progress will be aborted,
the RXERIF flag will be set and an interrupt will be gen-
erated (if enabled). In this manner, the hardware will
never overwrite unprocessed packets. Normally, the
ERXRDPT will be advanced to the value pointed to by
the Next Packet Pointer which precedes the receive
status vector for the current packet. Following such a
procedure will not require any pointer calculations to
account for wrapping at the end of the circular receive
buffer.
The Receive Buffer Read Pointer Low Byte
(ERXRDPTL register) is internally buffered to prevent
the pointer from moving when only one byte is updated.
To move ERXRDPT, the application must write to
ERXRDPTL first. The write will update the internal
buffer but will not affect the register. When the applica-
tion writes to ERXRDPTH, the internally buffered low
byte will be loaded into the ERXRDPTL register at the
same time. The ERXRDPT bytes can be read in any
order. When they are read, the actual value of the
registers will be returned. As a result, the buffered low
byte is not readable.
In addition to advancing the Receive Buffer Read
Pointers, after each packet is fully processed, the user
application must set the PKTDEC bit (ECON2<6>).
This causes the EPKTCNT register to decrement by 1.
After decrementing, if EPKTCNT is ‘
0
’, the PKTIF flag
bit will automatically be cleared. Otherwise, it will
remain set, indicating that additional packets are in the
receive buffer and are waiting to be processed.
Attempts to decrement EPKTCNT below 0 are ignored.
Additionally, if the EPKTCNT register ever maximizes
at 255, all new packets which are received will be
aborted, even if buffer space is available. To indicate
the error, the RXERIF is set and an interrupt is
generated (if enabled). To prevent this condition, the
user application must properly decrement the counter
whenever a packet is processed.
Because only one pointer is available to control buffer
area ownership, the application must process packets in
the order they are received. If a packet is to be saved
and processed later, the application should copy the
packet to an unused location in memory. This can be
done efficiently using the integrated DMA controller (see
Section 18.9 “Direct Memory Access Controller”
).
18.5.3.4
Receive Buffer Free Space
At any time the application needs to know how much
receive buffer space is remaining, it should read the
Hardware Write Pointers (ERXWRPT registers) and
compare it with the ERXRDPT registers. Combined
with the known size of the receive buffer, the free space
can be derived.
When reading the ERXWRPT registers with the receive
hardware enabled, special care must be taken to ensure
the low and high bytes are read as a matching set.
To be assured that a matching set is obtained:
1.
Read the EPKTCNT register and save its
contents.
Read ERXWRPTL and ERXWRPTH.
Read the EPKTCNT register again.
Compare the two packet counts. If they are not
the same, go back to step 2.
2.
3.
4.
With the Hardware Write Pointers obtained, the free
space can be calculated as shown in Example 18-2.
The hardware prohibits moving the Write Pointers to
the same value occupied by ERXRDPT (except when
the Buffer Pointers are being configured), so at least
one byte will always go unused in the buffer. The
Equation 18-2 calculation reflects the lost byte.
EQUATION 18-2:
RECEIVE BUFFER FREE SPACE CALCULATION
Note:
The ERXWRPT registers only update
when a packet has been successfully
received. If the application reads it just
before another packet is to be successfully
completed, the value returned could be
stale and off by the maximum frame length
permitted (MAMXFLN) plus 7. Further-
more, as the application reads one byte of
ERXWRPT, a new packet may arrive and
update the pointers before the application
has an opportunity to read the other byte
of ERXWRPT.
If ERXWRPT > ERXRDPT, then
Free Space = (ERXND – ERXST) – (ERXWRPT – ERXRDPT)
else
if ERXWRPT=ERXRDPT, then
Free Space = (ERXND – ERXST)
else
Free Space = ERXRDPT – ERXWRPT – 1