Чтение огромного количества данных через i2c - PullRequest
2 голосов
/ 05 апреля 2020

Я пытаюсь получить огромное количество данных через i2 c. Вот мой код Основная проблема заключается в том, что требуется более 2 секунд, когда мне нужно, чтобы сделать это менее чем за 0,5 сек c. Вот устройство: https://www.st.com/resource/en/datasheet/lsm6ds33.pdf

изображение с интерфейсом i2 c

#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h>
#include <linux/i2c-dev.h>
#include <sys/ioctl.h>
#include <time.h>
#include <sys/time.h>
#include <fcntl.h>
#include <stdint.h>
#include <stddef.h>

#define FIFO_DATA_OUT_L 0x3E
#define FIFO_DATA_OUT_H 0X3F

struct timeval stop, start;
int main()
{
    uint8_t addressL = FIFO_DATA_OUT_L;
    uint8_t addressH = FIFO_DATA_OUT_H;
    uint8_t resultL;
    uint8_t resultH;
    int16_t result;
    gettimeofday(&start,NULL);
    int fd;
    if ((fd = open("/dev/i2c-0",O_RDWR))< 0)
    {
        perror("failed to connect to i2c");
        exit(0);
    }
    ioctl(fd,I2C_SLAVE,0x6b);// Setting slave address
    long  i;
    for (i=0; i< 2499; i++)
    {
        write(fd,&addressL,1);
        read(fd,&resultL,1);
        write(fd,&addressH,1);
        read(fd,&resultH,1);
        result = (resultH << 8) | resultL;
    }
    gettimeofday(&stop,NULL);
    printf("Time elapsed: %d \n",stop.tv_sec-start.tv_sec);
    return;
}

Интересно, есть ли возможность чтобы сделать вещи быстрее. Приветствия.

1 Ответ

0 голосов
/ 05 апреля 2020

Я думаю, что ваш размер FIFO составляет 2 байта, тогда вы можете писать / читать 2 байта каждый раз вместо 1.

#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h>
#include <linux/i2c-dev.h>
#include <sys/ioctl.h>
#include <time.h>
#include <sys/time.h>
#include <fcntl.h>
#include <stdint.h>
#include <stddef.h>

#define FIFO_DATA_OUT_L 0x3E
#define FIFO_DATA_OUT_H 0X3F

struct timeval stop, start;
int main()
{
    uint8_t addressL = FIFO_DATA_OUT_L;
    uint8_t addressH = FIFO_DATA_OUT_H;
    uint16_t result;

    gettimeofday(&start,NULL);
    int fd;
    if ((fd = open("/dev/i2c-0",O_RDWR))< 0)
    {
        perror("failed to connect to i2c");
        exit(0);
    }
    ioctl(fd,I2C_SLAVE,0x6b);// Setting slave address
    long  i;
    for (i=0; i< 1250; i++)
    {
        write(fd,&addressL,2);
        read(fd,&result,2);
    }
    gettimeofday(&stop,NULL);
    printf("Time elapsed: %d \n",stop.tv_sec-start.tv_sec);
    return;
}
...