English
Language : 

PIC18F97J60_11 Datasheet, PDF (254/492 Pages) Microchip Technology – 64/80/100-Pin, High-Performance, 1-Mbit Flash Microcontrollers with Ethernet
PIC18F97J60 FAMILY
19.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 buf-
fer space used by the processed data, it must advance
the Receive Buffer Read Pointer pair, ERXRDPT. The
module always writes up to, but not over, the memory
pointed to by the ERXRDPT registers. If an attempt to
overwrite the Receive Buffer Read Pointer location
occurs, the packet in progress is aborted, the RXERIF
flag is set and an interrupt is generated (if enabled). In
this manner, the hardware will never overwrite
unprocessed packets. Normally, the ERXRDPT pair is
advanced close to a value pointed to by the Next
Packet Pointer, which precedes the receive status
vector for the current packet.
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 the ERXRDPT pair, 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
Pointer, after each packet is fully processed, the appli-
cation 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 is
automatically cleared. Otherwise, it remains set, indi-
cating that additional packets are in the receive buffer
and are waiting to be processed. Attempting to decre-
ment EPKTCNT below 0 does not cause an underflow
to 255, but may cause an unintentional interrupt. The
application should avoid decrementing EPKTCNT in
this situation.
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 19.9 “Direct Memory Access Controller”).
19.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.
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 success-
fully completed, the value returned could
be stale and off by the maximum frame
length permitted (MAMXFLH:MAMXFLL)
plus 8. Furthermore, as the application
reads one byte of the ERXWRPT regis-
ters, a new packet may arrive and update
the 13-bit pointer before the application
has an opportunity to read the other byte
of the ERXWRPT registers.
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.
2. Read ERXWRPTL and ERXWRPTH.
3. Read the EPKTCNT register again.
4. Compare the two packet counts. If they are not
the same, go back to Step 2.
With the Hardware Write Pointers obtained, the free
space can be calculated as shown in Equation 19-2.
The hardware prohibits moving the Write Pointer to the
same value occupied by the ERXRDPT registers, so at
least one byte will always go unused in the buffer. The
Equation 19-2 calculation reflects the lost byte.
EQUATION 19-2: RECEIVE BUFFER FREE SPACE CALCULATION
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
DS39762F-page 254
 2011 Microchip Technology Inc.