I2C transfer rates using Wire library.

What's the holdup?

Are you asking why is I2C so slow? I think the answer basically is that I2C has a slower clock rate. But why does it have a slower clock rate?

I'm guessing for a number of reasons:

  • Since it uses open-drain and pull-up resistors, the transition from low to high is necessarily electrically fairly slow, as it relies on the pull-up (possibly some distance away) to bring the line back to the high state (compared to SPI which drives the line low/high "manually" all the time).
  • It is designed for longer cable runs.
  • The data line in particular is two-way, that is, after every 8th bit the sender waits for an ACK from the receiver. This would take time and the receiver needs to be given time to do it.
  • The reply to a query comes down the same data line, so both ends are constantly reconfiguring inputs as outputs, and then open-drain.
  • SPI does not wait for any sort of acknowledgement - this must make it able to be designed to be faster.
  • There are probably more subtle reasons. It is interesting for example that 1-Wire is slower again.