Sequence:
1. Clear accumulator
Loop
x. Only if last word is not made of two bytes, the data byte is the upper byte (big endian)
2. Compute 1’s complement of each 16bits word, result is 16bits
3. Convert last result from 16 bits to 32 bits, result is 32bits: last result
4. Add last result to the 32 bits accumulator
Try the Loop
5. Convert accumulator in two 16bits words
6. Add those two 16bits words, result is 16bits word.
7. If an overflow occurs with the last addition (Carry), add 1 to the last result.
8. Last result is the final result
Example (in hexadecimal):
!0x0021 (0XFFDE)
0x0000FFDE (Read)
+!0x1234 (0xEDCB)
0x0001EDA9 (TransID)
+!0x0003 (0xFFFC)
0x0002EDA5 (3 reg to read)
+!0x0A10 (0XF5EF)
0x0003E394 (reg 0A,10,02)
+!0x02(00)(0XFDFF)
0x0004E193
Note that in this case a last 00 is implicitly used. (02
02 00).
0xE193 = 0xE197, (carry=0)
carry = 0xE197
Checksum = 0xE197
Here is an example of a checksum calculation function in C:
int RetCheckSum(Byte* ByteTab, int Size)
{
// This function returns the calculated checksum
unsigned int
Sum=0;
bool
AddHighByte=true;
unsigned int
ChecksumCalculated;
for(int i=0;i<Size;i++)
{
if(AddHighByte)
{
Sum+=((ByteTab[i])<<8)^0xFF00;
AddHighByte=false;
}
else
{
Sum+=(ByteTab[i])^0x00FF;
AddHighByte=true;
}
}
Содержание FMod-TCP BOX 2
Страница 2: ......
Страница 11: ...EEPROM In this case you do not need to send the Save Parameters command ...