arduino 低 i2c 读取速度;
arduino low i2c read speed;
我目前正在使用 genuino 101 进行一个项目,我需要通过 i2c 读取大量数据,以填充任意大小的 buffer.from 下图我可以看到读取请求本身只需要大约 3 毫秒,写入请求大约需要 200 纳秒。
然而,同一块中的读取交易之间存在非常长的时间(750+ 毫秒)
#define RD_BUF_SIZE 32
void i2cRead(unsigned char device, unsigned char memory, int len, unsigned char * rdBuf)
{
ushort bytesRead = 0;
ushort _memstart = memory;
while (bytesRead < len)
{
Wire.beginTransmission((int)device);
Wire.write(_memstart);
Wire.endTransmission();
Wire.requestFrom((int)device, BLCK_SIZE);
int i = 0;
while (Wire.available())
{
rdBuf[bytesRead+i] = Wire.read();
i++;
}
bytesRead += BLCK_SIZE;
_memstart += BLCK_SIZE;
}
}
根据我的理解,这不应该花那么长时间,除非添加到 memstart 和 bytesRead 花费的时间非常长。根据我对时间复杂度的理解,可以说是有限的,这个函数的时间复杂度为 O(n),在最好的情况下,128 字节的查询只需要大约 12 毫秒
我错过了什么吗?
那700ms不是你函数中那几条指令的执行时间造成的。这些应该在微秒内完成。您可能遇到缓冲区溢出,或者其他设备可能延迟传输,或者存在另一个与缓冲区溢出无关的错误。
这是我的做法:
void i2cRead(unsigned char device, unsigned char memory, int len, unsigned char * rdBuf, int bufLen)
{
ushort _memstart = memory;
if ( bufLen < len ) {
len = bufLen;
}
while (len > 0)
{
Wire.beginTransmission((int)device);
Wire.write(_memstart);
Wire.endTransmission();
int reqSize = 32;
if ( len < reqSize ) {
reqSize = len;
}
Wire.requestFrom((int)device, reqSize);
while (Wire.available() && (len != 0))
{
*(rdBuf++) = Wire.read();
_memstart++;
len--;
}
}
}
我目前正在使用 genuino 101 进行一个项目,我需要通过 i2c 读取大量数据,以填充任意大小的 buffer.from 下图我可以看到读取请求本身只需要大约 3 毫秒,写入请求大约需要 200 纳秒。
然而,同一块中的读取交易之间存在非常长的时间(750+ 毫秒)
#define RD_BUF_SIZE 32
void i2cRead(unsigned char device, unsigned char memory, int len, unsigned char * rdBuf)
{
ushort bytesRead = 0;
ushort _memstart = memory;
while (bytesRead < len)
{
Wire.beginTransmission((int)device);
Wire.write(_memstart);
Wire.endTransmission();
Wire.requestFrom((int)device, BLCK_SIZE);
int i = 0;
while (Wire.available())
{
rdBuf[bytesRead+i] = Wire.read();
i++;
}
bytesRead += BLCK_SIZE;
_memstart += BLCK_SIZE;
}
}
根据我的理解,这不应该花那么长时间,除非添加到 memstart 和 bytesRead 花费的时间非常长。根据我对时间复杂度的理解,可以说是有限的,这个函数的时间复杂度为 O(n),在最好的情况下,128 字节的查询只需要大约 12 毫秒
我错过了什么吗?
那700ms不是你函数中那几条指令的执行时间造成的。这些应该在微秒内完成。您可能遇到缓冲区溢出,或者其他设备可能延迟传输,或者存在另一个与缓冲区溢出无关的错误。
这是我的做法:
void i2cRead(unsigned char device, unsigned char memory, int len, unsigned char * rdBuf, int bufLen)
{
ushort _memstart = memory;
if ( bufLen < len ) {
len = bufLen;
}
while (len > 0)
{
Wire.beginTransmission((int)device);
Wire.write(_memstart);
Wire.endTransmission();
int reqSize = 32;
if ( len < reqSize ) {
reqSize = len;
}
Wire.requestFrom((int)device, reqSize);
while (Wire.available() && (len != 0))
{
*(rdBuf++) = Wire.read();
_memstart++;
len--;
}
}
}