arduino低i2c读取速度;

时间:2017-06-09 09:34:51

标签: c++ performance arduino i2c

我正在使用genuino 101进行项目,我需要通过i2c读取大量数据,以填充任意大小的缓冲区。从下图中我可以看到读取请求本身只需要大约3个毫秒和写请求大约200纳秒。

Read Transactions

然而,在同一块中的读取事务之间存在非常大的时间(750+ ms)

#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 ms

我错过了什么吗?

1 个答案:

答案 0 :(得分:1)

那些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--;
         }
     }
}