Datasheet

ENC28J60
DS39662E-page 72 . 2006-2012 Microchip Technology Inc.
13.2 Checksum Calculations
The checksum calculation logic treats the source data as
a series of 16-bit big-endian integers. If the source range
contains an odd number of bytes, a padding byte of 00h
is effectively added to the end of the series for purposes
of calculating the checksum. The calculated checksum
is the 16-bit one’s complement of the one’s complement
sum of all 16-bit integers. For example, if the bytes
included in the checksum were {89h, ABh, CDh}, the
checksum would begin by computing 89ABh + CD00h.
A carry out of the 16th bit would occur in the example, so
in 16-bit one’s complement arithmetic, it would be added
back to the first bit. The resulting value of 56ACh would
finally be complemented to achieve a checksum of
A953h.
To calculate a checksum:
1. Program the EDMAST and EDMAND register
pairs to point to the first and last bytes of buffer
data to be included in the checksum. Care should
be taken when programming these pointers to
prevent a never ending checksum calculation
due to receive buffer wrapping.
2. To generate an optional interrupt when the
checksum calculation is done, clear EIR.DMAIF,
set EIE.DMAIE and set EIE.INTIE.
3. Start the calculation by setting ECON1.CSUMEN
and ECON1.DMAST.
When the checksum is finished being calculated, the
hardware will clear the DMAST bit, set the DMAIF bit
and an interrupt will be generated if enabled. The DMA
Pointers will not be modified and no memory will be
written to. The EDMACSH and EDMACSL registers will
contain the calculated checksum. The host controller
may write this value into a packet, compare this value
with a received checksum, or use it for other purposes.
Various protocols, such as TCP and IP, have a checksum
field inside a range of data which the checksum covers.
If such a packet is received and the host controller needs
to validate the checksum, it can do the following:
1. Read the checksum from the packet and save it
to a temporary location
2. Write zeros to the checksum field.
3. Calculate a new checksum using the DMA
controller.
4. Compare the results with the saved checksum
from Step 1.
Writing to the receive buffer is permitted when the write
address is protected by means of the ERXRDPT
Pointers. See Section 7.2 “Receiving Packets” for
additional information.
The IP checksum has unique mathematical properties
which may be used in some cases to reduce the
processing requirements further. Writing to the receive
buffer may be unnecessary in some applications.
When operating the DMA in Checksum mode, it will
take one main clock cycle for every byte included in the
checksum. As a result, if a checksum over 1446 bytes
were performed, the DMA module would require
slightly more than 57.84 s to complete the operation.
TABLE 13-1: SUMMARY OF REGISTERS ASSOCIATED WITH THE DMA CONTROLLER
Register
Name
Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0
Reset
Values
on page
EIE
INTIE PKTIE DMAIE LINKIE TXIE r TXERIE RXERIE 13
EIR
PKTIF DMAIF LINKIF TXIF r TXERIF RXERIF 13
ECON1
TXRST RXRST DMAST CSUMEN TXRTS RXEN BSEL1 BSEL0 13
ERXNDL RX End Low Byte (ERXND<7:0>) 13
ERXNDH
RX End High Byte (ERXND<12:8>) 13
EDMASTL DMA Start Low Byte (EDMAST<7:0>) 13
EDMASTH DMA Start High Byte (EDMAST<12:8>) 13
EDMANDL DMA End Low Byte (EDMAND<7:0>) 13
EDMANDH
DMA End High Byte (EDMAND<12:8>) 13
EDMADSTL DMA Destination Low Byte (EDMADST<7:0>) 13
EDMADSTH DMA Destination High Byte (EDMADST<12:8>) 13
EDMACSL DMA Checksum Low Byte (EDMACS<7:0>) 13
EDMACSH DMA Checksum High Byte (EDMACS<15:8>) 13
Legend: r = reserved bit, — = unimplemented, read as ‘0’. Shaded cells are not used with the DMA controller.