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



背景信息

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

据我所知,该总线在快速模式下可以传输高达400k比特/秒的数据。

为了发送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),为了读取XYZ样本数据的6字节,您需要执行寄存器的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.21ms或约4700个样本/秒内传输样本。

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

最新更新