Ваша математика, кажется, немного не в порядке; для этого акселерометра (из таблицы: https://www.sparkfun.com/datasheets/Sensors/Accelerometer/ADXL345.pdf), чтобы прочитать 6 байтов данных образца XYZ, необходимо выполнить 6-байтовое пакетное считывание регистров. С точки зрения передачи данных это означает запись адреса регистра в акселерометр (0x31
), а затем непрерывное считывание 6 байтов. Для каждой из этих двух передач требуется сначала отправить адрес устройства I2 C и бит R / W, а также ACK / NAK на байт, включая байты адреса, а также условия START / REPEAT START / STOP. Итак, в целом, индивидуальный перенос для получения одной выборки (ie, один вектор ускорения XYZ) выглядит следующим образом:
Start (*) | Device Address: 0x1D (7) | Write: 0 (1) | ACK (1) | Register Address: 0x31 (8) | ACK (1) | Repeat Start (*) | Device Address: 0x1D (7) | Read: 1 (1) | ACK (1) | DATA0 (8) | ACK(1) | DATA1 (8) | ACK (1) | ... | DATA5 (8) | NAK (1) | Stop (*)
Если сложить все это, мы получим 81 + 3 бита данных, которые должны быть переданы. Во-первых, обратите внимание, что START, REPEAT START и STOP на самом деле могут не занимать каждый бит времени, но для простоты мы можем предположить, что они это делают. Также обратите внимание, что хотя адрес устройства составляет всего 7 бит, вам всегда нужно добавить бит READ / WRITE, поэтому транзакция I2 C всегда равна 8 битам + ACK / NAK, то есть всего 9 битов. Также обратите внимание, что максимальная скорость передачи I2 C действительно определяет максимальную скорость SCK, которую устройство может обрабатывать, поэтому в быстром режиме SCK составляет не более 400 кГц (т.е. не более 400 Кбит / с, но из-за протокола вы получите меньше в реальных данных). Таким образом, 84 бита на частоте 400 кГц означают, что мы можем передать сэмпл за 0,21 мс или ~ 4700 сэмплов / сек c при условии отсутствия промежутков или перерывов при передаче.
Поскольку необходимо считывать 2 сэмпла каждые 1 мс (2 акселерометры, то есть 84 бит * 2 = 164 бит / сэмпл или 164 кбит / с при частоте дискретизации 1 кГц), это должно быть как минимум возможно в быстром режиме I2 C. Однако вам нужно быть осторожным, чтобы полностью использовать контроллер I2 C. В зависимости от уровня программного обеспечения, с которым вы работаете, может быть достаточно быстро выполнить пакетное чтение I2 C (ie, 2 пакетных чтения в течение 1 мс). Использование FIFO на акселерометре могло бы значительно помочь в требовании к задержке, то есть вместо того, чтобы иметь 1 мс для выдачи двух пакетных чтений, вы можете отложить до 32 мс для выдачи 64 пакетных чтений (поскольку у вас есть 2 акселерометра); но так как вам нужно выдать новое пакетное чтение, чтобы прочитать следующий пример, вы должны быть осторожны с задержкой, вносимой программным обеспечением между вызовами любого API, который вы используете для выполнения транзакций I2 C.