Как настроить датчик эффекта Холла (si7210) с помощью программы i2c с Raspberry Pi (язык C) - PullRequest
0 голосов
/ 14 мая 2019

Я бы хотел настроить датчик эффекта Холла с I2C, но я не совсем понимаю, как им управлять. Я действительно не знаю, какое значение я должен ввести в каждом регистре, но это не самая большая проблема. Действительно, я хотел бы прочитать регистры, чтобы изменить их, чтобы иметь представление о том, что я мог бы изменить.

Для этого я написал 2 программы, соответственно для записи / чтения в регистры. Но я далеко не эксперт, и мне не хотелось бы рекомендаций и советов о том, как я могу изменить свой код, чтобы он работал должным образом.

включает в себя оба файла

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

Написать:

int file_i2c;

uint8_t buffer[2] = { 0 };

int addr = 0x31;

char *end;
char buf[12];

int main(void)
{

    //----- OPEN THE I2C BUS -----
    char *filename = (char *)"/dev/i2c-1";
    if ((file_i2c = open(filename, O_RDWR)) < 0)
    {
        return EXIT_FAILURE;
    }

    if (ioctl(file_i2c, I2C_SLAVE, addr) < 0)
    {
        return EXIT_FAILURE;
    }

    int length = 0;
    for( int i = 0xC0 ; i<0xE5 ; i++)
    {
        if( i < 0xD1 || i > 0xE0)
        {
            buffer[0] = i;
            printf("Rgister value for 0x%02X : ",buffer[0]);
            do {
                    if (!fgets(buf, sizeof buf, stdin))
                        break;

                    // remove \n
                    buf[strlen(buf) - 1] = 0;
                    buffer[1] = strtol(buf, &end, 2);
            } while (end != buf + strlen(buf));
            printf("\n");
            length = 2; 
            if (write(file_i2c, buffer, length) != length)      
            {
                printf("Failed to write to the i2c bus.\n");
            }
        }
    }

    close(file_i2c);
    return EXIT_SUCCESS;
}

Чтение:

int file_i2c;

int addr = 0x31;

int main(void)
{

    //----- OPEN THE I2C BUS -----
    char *filename = (char *)"/dev/i2c-1";
    if ((file_i2c = open(filename, O_RDWR)) < 0)
    {
        return EXIT_FAILURE;
    }

    if (ioctl(file_i2c, I2C_SLAVE, addr) < 0)
    {
        return EXIT_FAILURE;
    }

    uint8_t register_addr;
    uint8_t str;
    for( int i = 0xC0 ; i<0xE5 ; i++)
    {
        if( i < 0xD1 || i > 0xE0)
        {
            register_addr = i >> 8;
            if(write(file_i2c, &register_addr, 1) == 1)
            {
                if (read(file_i2c, &str, 1) != 1)   
                {
                    fprintf(stderr,"Failed to read\n");
                }
                else
                {
                    printf("data on 0x%02X : 0x%02X\n",i,str);
                }
            }
        }
    }
    close(file_i2c);
    return EXIT_SUCCESS;
}

мы не можем знать, работает ли пишущая программа, потому что читающая программа возвращает

data on 0xC0 : 0x00
data on 0xC1 : 0x00
data on 0xC2 : 0x00
data on 0xC3 : 0x00
data on 0xC4 : 0x00
data on 0xC5 : 0x00
data on 0xC6 : 0x00
data on 0xC7 : 0x00
data on 0xC8 : 0x00
data on 0xC9 : 0x00
data on 0xCA : 0x00
data on 0xCB : 0x00
data on 0xCC : 0x00
data on 0xCD : 0x00
data on 0xCE : 0x00
data on 0xCF : 0x00
data on 0xD0 : 0x00
data on 0xE1 : 0x00
data on 0xE2 : 0x00
data on 0xE3 : 0x00
data on 0xE4 : 0x00

Надеюсь, вы сможете помочь, большое спасибо, yocvito

1 Ответ

0 голосов
/ 15 мая 2019

Наконец, программа чтения работает отлично.

была только проблема в этой строке.

register_addr = i >> 8;

Я сдвинулся вправо на 8 бит, не зная, почему

поэтому я заменил эту строку на

register_addr = i;

Итак, у меня ожидаемый доход (значения соответствуют ожидаемым)

data on 0xC0 : 0x14
data on 0xC1 : 0x00
data on 0xC2 : 0x00
data on 0xC3 : 0x00
data on 0xC4 : 0x02
data on 0xC5 : 0x00
data on 0xC6 : 0xB0
data on 0xC7 : 0x12
data on 0xC8 : 0xE6
data on 0xC9 : 0xBD
data on 0xCA : 0xD1
data on 0xCB : 0x58
data on 0xCC : 0xB9
data on 0xCD : 0x00
data on 0xCE : 0x05
data on 0xCF : 0x33
data on 0xD0 : 0x00
data on 0xE1 : 0x00
data on 0xE2 : 0x00
data on 0xE3 : 0x00
data on 0xE4 : 0x00

Что касается пишущей программы, она уже работала (он хорошо писал в указанных регистрах). Но записанные значения неверны (за исключением первого регистра).

Запись:

Valeur de registre pour 0xC0 : 00010100

Valeur de registre pour 0xC1 : 11111111

Valeur de registre pour 0xC2 : 11111111

Чтение:

data on 0xC0 : 0x14
data on 0xC1 : 0x7F
data on 0xC2 : 0x1F

У вас есть идеи, откуда это может взяться?

...