I2C (Beaglebone Black) 上的 ADXL345 加速度计数据使用

ADXL345 Accelerometer data use on I2C (Beaglebone Black)

背景资料

我正在努力确保我能够 运行 在同一 I2C 总线上使用两个 ADXL345 加速度计。

据我了解,总线在快速模式下最多可以传输 400k bits/s。

为了发送1个字节的数据,有20个额外的开销。

每个加速度计读数有 6 个字节(XLow、XHigh、YLow、YHigh、ZLow、ZHigh)

我需要用两个加速度计每秒读取 1000 个读数

因此, 我每秒使用的总数据量为 336k bits/s,在我的 400k bits/s.

限制范围内

我不确定我是否正确地进行了这些计算。

问题:

我每秒传输多少数据,两个加速度计在 i2c 上每秒读取 1000 次?

你的数学好像有点跑题了;对于这个加速度计(来自数据表:https://www.sparkfun.com/datasheets/Sensors/Accelerometer/ADXL345.pdf),为了读取 6 字节的 XYZ 样本数据,您需要对寄存器执行 6 字节的突发读取。就数据传输而言,这意味着将寄存器地址写入加速度计 (0x31),然后连续读取 6 个字节。这两个传输中的每一个都需要首先发送 I2C 设备地址和 R/W 位,以及每个字节的 ACK/NAK,包括地址字节,以及 START/REPEAT START/STOP 状况。因此,总的来说,获得单个样本(即单个 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 位,因此 I2C 事务始终为 8 位 + ACK/NAK,因此总共为 9 位。另请注意,I2C 最大传输速率确实定义了设备可以处理的最大 SCK 速度,因此在快速模式下,SCK 最多为 400KHz(因此最多为 400Kbps,但由于协议的原因,您获得的实际数据会更少).因此,400KHz 的 84 位意味着我们可以在 0.21 ms 或 ~4700 samples/sec 内传输样本,假设传输中没有间隙或中断。

由于您需要每 1ms 读取 2 个样本(2 个加速度计,因此 84 位 * 2 = 164 bits/sample 或 1KHz 采样率下的 164Kbps),这至少对于快速模式 I2C 是可行的。但是,您需要注意充分利用 I2C 控制器。根据您正在处理的软件层,可能难以足够快地发出 I2C 突发读取(即 1 毫秒内 2 次突发读取事务)。在加速度计上使用 FIFO 将显着有助于延迟要求,这意味着您可以延迟最多 32 毫秒来发出 64 次突发读取(因为您有 2 个加速度计),而不是用 1 毫秒来发出两次突发读取;但是由于您需要发出新的突发读取以读取下一个样本,因此您必须注意软件在调用您用于执行 I2C 事务的 API 之间引入的延迟。