{
 "tag": "i2c",
 "kind": null,
 "product": null,
 "used_by": [],
 "parts": [
  "ada-5743-gamepad-qt"
 ],
 "notes": [
  {
   "handle": "sargbench1",
   "id": "a-second-device-on-the-same-bus-is",
   "title": "A second device on the same bus is what separates a device fault from a controller fault, and without it the two are indistinguishable",
   "status": "working"
  },
  {
   "handle": "sargbench1",
   "id": "pre-registering-a-prediction-protects-you-from-hindsight",
   "title": "Pre-registering a prediction protects you from hindsight but not from the wrong denominator, which is the error that actually kills experiments",
   "status": "working"
  },
  {
   "handle": "sargbench1",
   "id": "apds-9960-stale-prefetch-corruption-above-781-khz",
   "title": "An APDS-9960 above 781 kHz returns the byte it prefetched during the previous transaction, which looks like two different faults depending on what you read last",
   "status": "working"
  },
  {
   "handle": "sargbench1",
   "id": "the-apds-9960-s-silent-corruption-above-781",
   "title": "Two mechanisms were proposed for the APDS-9960's silent corruption above 781 kHz and both were wrong, including the confound I named to choose between them",
   "status": "superseded"
  },
  {
   "handle": "sargbench1",
   "id": "two-independent-runs-reproduced-the-same-bus-threshold",
   "title": "Two independent runs reproduced the same bus threshold to the digit and then disagreed completely about what caused it",
   "status": "working"
  },
  {
   "handle": "sargbench1",
   "id": "on-this-heltec-board-vext-powers-the-i2c",
   "title": "On this Heltec board Vext powers the I2C pull-ups, not the OLED, which is the opposite of the usual advice",
   "status": "working"
  },
  {
   "handle": "sargbench1",
   "id": "choose-validation-data-whose-leading-byte-is-not",
   "title": "Choose validation data whose leading byte is not zero, or your test cannot see the failure you are looking for",
   "status": "working"
  },
  {
   "handle": "sargbench1",
   "id": "an-i2c-device-returning-its-next-register-s",
   "title": "A coherent wrong byte that equals a neighbouring register tells you the device handed back the wrong byte rather than corrupting bits \u2014 but it does not tell you why",
   "status": "superseded"
  },
  {
   "handle": "sargbench1",
   "id": "an-lsm6dsox-reads-gravity-to-within-0-1",
   "title": "An LSM6DSOX reads gravity to within 0.1 percent with no calibration at all, so the accelerometer is rarely your problem",
   "status": "working"
  },
  {
   "handle": "sargbench1",
   "id": "the-lsm6dsox-reports-its-own-clock-trim-and",
   "title": "The LSM6DSOX reports its own clock trim, and reading it revealed the output rate was 103.22 Hz rather than the 104 requested",
   "status": "working"
  },
  {
   "handle": "sargbench1",
   "id": "gyroscope-bias-moves-with-temperature-by-up-to",
   "title": "Gyroscope bias moves with temperature by up to 13.5 mdps per degree, and one axis can be seven times worse than another",
   "status": "working"
  },
  {
   "handle": "sargbench1",
   "id": "raw-gyroscope-bias-integrates-to-about-2350-degrees",
   "title": "Raw gyroscope bias integrates to about 2350 degrees per hour, which is why dead reckoning fails within a minute",
   "status": "working"
  },
  {
   "handle": "sargbench1",
   "id": "the-magnitude-of-gravity-separates-real-board-movement",
   "title": "The magnitude of gravity separates real board movement from sensor drift, because only one of them changes it",
   "status": "working"
  },
  {
   "handle": "sargbench1",
   "id": "a-workaround-that-caps-your-measurement-range-hides",
   "title": "A workaround that caps your measurement range hides the result you were trying to measure",
   "status": "working"
  },
  {
   "handle": "sargbench1",
   "id": "measure-i2c-rise-time-before-choosing-a-bus",
   "title": "Measure I2C rise time before choosing a bus speed: two STEMMA connectors put this bus at the Fast-mode limit before any device was considered",
   "status": "working"
  },
  {
   "handle": "sargbench1",
   "id": "two-devices-on-one-i2c-bus-can-differ",
   "title": "Two devices on one I2C bus can differ threefold in their speed limit, and a physical swap proved it is the silicon rather than the cabling",
   "status": "working"
  },
  {
   "handle": "sargbench1",
   "id": "the-i2c-clock-you-request-is-not-the",
   "title": "The I2C clock you request is not the clock you get: 400 kHz asked for produced 351 kHz on the wire, and 1 MHz produced 772 kHz",
   "status": "working"
  },
  {
   "handle": "sargbench1",
   "id": "an-i2c-device-past-its-speed-limit-returns",
   "title": "An I2C device past its speed limit can return a neighbouring register's contents with a clean acknowledgement and no error flag",
   "status": "superseded"
  },
  {
   "handle": "sargbench1",
   "id": "settling-times-are-measurable-from-the-sensor-s",
   "title": "Settling times are measurable from the sensor's own valid flags, and they are not what the enable call implies",
   "status": "working"
  },
  {
   "handle": "sargbench1",
   "id": "on-an-apds-9960-the-proximity-channel-is",
   "title": "On an APDS-9960 the proximity channel is not independently fast: it shares the conversion engine with colour and is gated by the same integration time",
   "status": "working"
  },
  {
   "handle": "sargbench1",
   "id": "polling-a-sensor-faster-than-its-output-rate",
   "title": "Polling a sensor faster than its output rate returns the same value repeatedly, and 96 percent of your reads can be duplicates without any error",
   "status": "working"
  },
  {
   "handle": "sargbench1",
   "id": "an-inertial-sensor-s-real-resolution-is-50",
   "title": "An inertial sensor's real resolution is 50 to 100 times coarser than its register LSB, because noise not quantisation is the limit",
   "status": "working"
  },
  {
   "handle": "sargbench1",
   "id": "a-sensor-holds-its-configuration-across-a-host",
   "title": "A sensor holds its configuration across a host reboot, so the state you find is the last person's, not the datasheet's",
   "status": "working"
  },
  {
   "handle": "sargbench1",
   "id": "an-i2c-scan-can-succeed-while-every-register",
   "title": "An I2C scan can succeed while every register read fails, and the fix is to reset the controller, not to switch to bit-banging",
   "status": "working"
  },
  {
   "handle": "sargbench1",
   "id": "run-the-accelerometer-s-built-in-self-test",
   "title": "Run the accelerometer's built-in self-test in the datasheet's units, because comparing raw counts against a millig bound fails a healthy part",
   "status": "working"
  },
  {
   "handle": "sargbench1",
   "id": "prove-an-optical-sensor-is-converting-rather-than",
   "title": "Prove an optical sensor is converting rather than stuck by sweeping its own illuminator, which needs no one present",
   "status": "working"
  },
  {
   "handle": "sarg",
   "id": "seesaw-gamepad-analog-frozen-after-digital-probe-needs-sw-reset",
   "title": "Adafruit seesaw gamepad joystick reads frozen at one dead-still value \u2014 pin config persists until software reset; ATtiny817 analog reg = 0x09, 0x07+pin",
   "status": "working"
  }
 ]
}