Sorry, it was late. I edited the above message to include the complete (0xF3) captured trace.
The 0xF3 was not in our CRC16 test program either. That is the end of packet byte. 0xF3 is as constant as 0xF0.
A bit more information..
I am looking through the Boot up messages while the machine boots up and comes online. It takes about 5 minutes to boot. Every 1 second there are PING messages sent from the host to the slave to ensure it is still there. My code sends 7 cadences and then winds up in this NOOP/Ping loop code.
About the 16'th exchange, it farts out on the message above.
As you know, byte 3 increments every time there is an exchange between the two.
So,after the 7 cadences, this is what the bits on the wire look like:
....snip...
0xF0, 0x05, 0x08, 0x00, 0x01, 0x01, 0xDD, 0xCB, 0xF3 ; // Slave to Host (Pong)
0xF0, 0x05, 0x08, 0x00, 0x00, 0x95, 0xA8, 0xF3 ; // Host to Slave (Ping)
0xF0, 0x05, 0x09, 0x00, 0x01, 0x01, 0x66, 0xD7, 0xF3 ; // Slave to Host (Pong)
0xF0, 0x05, 0x09, 0x00, 0x00, 0x40, 0xF2, 0xF3 ; // Host to Slave (Ping)
0xF0, 0x05, 0x0A, 0x00, 0x01, 0x01, 0xAB, 0xF2, 0xF3 ; // Slave to Host (Pong)
0xF0, 0x05, 0x0A, 0x00, 0x00, 0x2D, 0x1D, 0xF3 ; // Host to Slave (Ping)
0xF0, 0x05, 0x0B, 0x00, 0x01, 0x01, 0x10, 0xEE, 0xF3 ; // Slave to Host (Pong)
0xF0, 0x05, 0x0B, 0x00, 0x00, 0xF1, 0x47, 0xF3 ; // Host to Slave (Ping)
0xF0, 0x05, 0x0C, 0x00, 0x01, 0x01, 0x31, 0xB9, 0xF3 ; // Slave to Host (Pong)
0xF0, 0x05, 0x0C, 0x00, 0x00, 0xF4, 0xCB, 0xF3 ; // Host to Slave (Ping)
0xF0, 0x05, 0x0D, 0x00, 0x01, 0x01, 0x8A, 0xA5, 0xF3 ; // Slave to Host (Pong)
0xF0, 0x05, 0x0D, 0x00, 0x00, 0x28, 0x91, 0xF3 ; // Host to Slave (Ping)
0xF0, 0x05, 0x0E, 0x00, 0x01, 0x01, 0x47, 0x80, 0xF3 ; // Slave to Host (Pong)
0xF0, 0x05, 0x0E, 0x00, 0x00, 0x4C, 0x7E, 0xF3 ; // Host to Slave (Ping)
0xF0, 0x05, 0x0F, 0x00, 0x01, 0x01, 0xFC, 0x9C, 0xF3 ; // Slave to Host (Pong)
0xF0, 0x05, 0x0F, 0x00, 0x00, 0x90, 0x24, 0xF3 ; // Host to Slave (Ping)
0xF0, 0x05, 0x10, 0x00, 0x01, 0x01, 0xA4, 0xED, 0xF3 ; // Slave to Host (Pong)
0xF0, 0x05, 0x10, 0x00, 0x00, 0xC2, 0xEB, 0xF3 ; // Host to Slave (Ping)
0xF0, 0x05, 0x11, 0x00, 0x01, 0x01, 0x1F, 0xF1, 0xF3 ; // Slave to Host (Pong)
0xF0, 0x05, 0x11, 0x00, 0x00, 0x1E, 0xB1, 0xF3 ; // Host to Slave (Ping)
0xF0, 0x05, 0x12, 0x00, 0x01, 0x01, 0xD3, 0xD4, 0xF3 ; // Slave to Host (Pong)
0xF0, 0x05, 0x12, 0x00, 0x00, 0x7A, 0x5E, 0xF3 ; // Host to Slave (Ping)
0xF0, 0x05, 0x13, 0x00, 0x01, 0x01, 0x69, 0xC8, 0xF3 ; // Slave to Host (Pong)
0xF0, 0x05, 0x13, 0x00, 0x00, 0xA6, 0x04, 0xF3 ; // Host to Slave (Ping)
0xF0, 0x05, 0x14, 0x00, 0x01, 0x01, 0x48, 0x9F, 0xF3 ; // Slave to Host (Pong)
0xF0, 0x05, 0x14, 0x00, 0x00, 0xA3, 0x88, 0xF3 ; // Host to Slave (Ping)
0xF0, 0x05, 0x15, 0x00, 0x01, 0x01, 0x1B, 0xB3, 0X83, 0xF3 ; // Slave to Host (Pong)
0xF0, 0x05, 0x15, 0x00, 0x00, 0x7F, 0xD2, 0xF3 ; // Host to Slave (Ping)
0xF0, 0x05, 0x16, 0x00, 0x01, 0x01, 0x3E, 0xA6, 0xF3 ; // Slave to Host (Pong)
0xF0, 0x05, 0x16, 0x00, 0x00, 0x1B, 0x3D, 0xF3 ; // Host to Slave- should have 0x5B, 0x3D, 0xF3
0xF0, 0x05, 0x16, 0x00, 0x00, 0x1B, 0x5B, 0x3D, 0xF3 ; // Host to Slave- real pack capture
..A length of 9 bytes, whereas all others are a length of 8..
From what I can tell, for some reason, 0x1B is inserted into the packet string (the checksum of 0x05, 0x16, 0x00, 0x00 is 0x3D, 0x1B). This does not match the real packet. ?? The recalculation of the checksum should be 0x3D, 0x5B, but our CRC checker returns only 0x3D.
The slave does not accept this packet, does not increment the sequence byte and responds with -
0xF0, 0x05, 0x16, 0x00, 0x01, 0x02, 0xA5, 0x94, 0xF3.
My code gets its increment of the sequence byte by looking at the slave's sequence byte, since it is the one that increments on a successful packet exchange. Since the slave does not increment this byte on an error, my code does not increment either.
The real packet capture shows 0x17 as the next packet, 0x18, and so on.
Does this help?