Content originally posted in LPCWare by DiligentMinds.com on Fri Aug 24 16:26:11 MST 2012
The I2C ACK/NAK is for byte-level acknowledgement (in the "link layer" so to speak). The higher-level protocols (as you stated) use some kind of check-sum or CRC at the end of the packet. In this case, the entire packet has already been transmitted, and there is nothing to tell the link-layer (hardware) transmitter that the message was not received or understood. I2C hardware works on a byte-by-byte basis, and it has no knowledge of a "packet". As already stated, error recovery happens at a higher layer in the stack, and the "ACK" or "NAK" that the higher layer sends to the transmitting node's higher-layer is not the same thing as an "ACK" or "NAK" that is sent by the hardware receiver to the hardware transmitter if a byte was (for some reason) not accepted. Just because the writer of the I2C low-level hardware protocol and the writer of the higher-level software protocol both decided to use the name "ACK" and "NAK", does not necessarily mean that they are the same thing.
[begin rant]
BTW-- As a side issue, [IMHO] packet-based protocols should never "NAK"-- if there is an error in the packet, just throw the bad packet into the "bit bucket", and don't "ACK", then the sender will time out and will send the packet again with the same sequence number-- this works much better than any "ACK/NAK" protocol, which can end up in a never-ending cascade of ACK's and NAK's ad nauseum... (Just Sayin'...)
[end rant]