my armchair engineer’s 0.02c is to underline these points:
each byte is ACK’d, but there’s no timeout/retry mechanism except what is rolled in software for important configuration steps. it’s not feasible to make each transmission robust in a soft-realtime scenario. think UDP, not TCP.
if ER-301 is busy when a message comes in, or if its RX buffer is full or something (i don’t know how the event stack works on that device), then the message is gone.
there could also be more than one thing happening here.
-
dropped messages, but solid timing, sounds like the receiver missing it. (or, equivalently, TT i2x tx buffer is full b/c the bus is claimed too often for it to get rid of all pending tx’s.)
-
“jitter” sounds like too much traffic. the entire bus can only have one transaction on it at once. the maximum clock speed in “standard mode” is 100 kb/s; iirc this is what TT sets as master. but that is a maximum - it just means that compliant hardware has to be able to handle this clock rate in silicon. in practice, since i2c is an open-drain bus, it can get very slow with multiple things reading and writing from it - every device can “stretch” the clock by holding the line down for an arbitrary amount of time. usually there is some inductance and slew (that’s why cable runs should be short) - to accomodate this, devices will wait a moment after pulling the line down and then check the value by reading it.
it is totally possible to corrupt the bus entirely by exceeeding the throughput rate momentarily, and i suspect that is what’s happening with these long-uptime scenarios.
if you’re sending 16 values (16-bit values? dunno) every 0.25 ms (or 40/s) then that’s 10kbps right there. it sounds conservative, but with multiple devices and clock stretching it’s really not.
in a nutshell: i would be very conservative about realtime applications of i2c for musical sequencing and making dance music and stuff. we used i2c in the buchla 200e and quickly ran into these limitations. it’s (basically) fine for a midi keyboard limited by human input rates. it’s not fine for dense machine music. it’s fine for system / preset management stuff where there is the luxury of time to ACK/timeout/resend every piece of data.
finally: TT is a tiny old processor. the i2c tx buffer is peripheral driven, but the core loop still has to stuff bytes in it and handle interrupts when it’s done. so timing could be well mangled within TT by attempting to send too much.
recommended reading:
http://www.ti.com/lit/an/slva704/slva704.pdf