如何使用带有树莓派(C语言)的i2c程序配置霍尔效应传感器(si7210)

约克维托

我想用 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

约克维托

最后,阅读程序完美运行。

只是那条线上有问题。

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

你知道这可能来自哪里吗?

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何在Arduino Uno中为带有i2c 16x2 LCD的DHT11,pH传感器编码?

来自分类Dev

如何使用STM32CUBEF4 HAL库通过i2c读出传感器数据?

来自分类Dev

i2c使用Netduino从传感器读取数据

来自分类Dev

使用i2C接口读取ADT7420温度传感器

来自分类Dev

在树莓派 Ubuntu 上启用 i2c

来自分类Dev

尝试在RPI上使用i2c和bcm2835读取光传感器-TSL2561

来自分类Dev

尝试在RPI上使用i2c和bcm2835读取光传感器-TSL2561

来自分类Dev

将I2C传感器(DS1624)读数转换为数字

来自分类Dev

I2C总线上的传感器设备树条目

来自分类Dev

I2C/SMBus 上的传感器检测警告

来自分类Dev

温度传感器 /w 树莓派 3

来自分类Dev

arduino 无法打开树莓派的红外传感器

来自分类Dev

在树莓派中使用超声波传感器测量距离

来自分类Dev

pic32和MPL3115A2高度/压力传感器之间的I2C通信

来自分类Dev

pic32和MPL3115A2高度/压力传感器之间的I2C通信

来自分类Dev

MSP430 I2C读取SDP610压差传感器问题

来自分类Dev

i2cdetect无法识别TCA9548A I2C多路复用器后面的VL6180X传感器

来自分类Dev

树莓派4上的红色节点尝试使用i2c扫描节点,但它返回3个地址,这不是我连接的地址?

来自分类Dev

上树莓裨使用Python最有效的方式来存储数据从传感器

来自分类Dev

Python:用树莓派将传感器数据推送到xively时出错TypeError:__init __()

来自分类Dev

将传感器数据树莓派保存到数据库

来自分类Dev

iOS:在Objective-c中带有接近传感器的应用

来自分类Dev

带有arduino的流量传感器

来自分类Dev

如何通过C ++程序与Ubuntu Touch中的Nexus 4传感器接口?

来自分类Dev

如何使用光敏传感器?

来自分类Dev

每秒获取传感器的值c ++

来自分类Dev

使用带有 PIR 传感器的毫秒检测连续运动

来自分类Dev

带有arduino的挠性传感器

来自分类Dev

如何使脉搏传感器防水?或者有防水的脉搏传感器吗?

Related 相关文章

  1. 1

    如何在Arduino Uno中为带有i2c 16x2 LCD的DHT11,pH传感器编码?

  2. 2

    如何使用STM32CUBEF4 HAL库通过i2c读出传感器数据?

  3. 3

    i2c使用Netduino从传感器读取数据

  4. 4

    使用i2C接口读取ADT7420温度传感器

  5. 5

    在树莓派 Ubuntu 上启用 i2c

  6. 6

    尝试在RPI上使用i2c和bcm2835读取光传感器-TSL2561

  7. 7

    尝试在RPI上使用i2c和bcm2835读取光传感器-TSL2561

  8. 8

    将I2C传感器(DS1624)读数转换为数字

  9. 9

    I2C总线上的传感器设备树条目

  10. 10

    I2C/SMBus 上的传感器检测警告

  11. 11

    温度传感器 /w 树莓派 3

  12. 12

    arduino 无法打开树莓派的红外传感器

  13. 13

    在树莓派中使用超声波传感器测量距离

  14. 14

    pic32和MPL3115A2高度/压力传感器之间的I2C通信

  15. 15

    pic32和MPL3115A2高度/压力传感器之间的I2C通信

  16. 16

    MSP430 I2C读取SDP610压差传感器问题

  17. 17

    i2cdetect无法识别TCA9548A I2C多路复用器后面的VL6180X传感器

  18. 18

    树莓派4上的红色节点尝试使用i2c扫描节点,但它返回3个地址,这不是我连接的地址?

  19. 19

    上树莓裨使用Python最有效的方式来存储数据从传感器

  20. 20

    Python:用树莓派将传感器数据推送到xively时出错TypeError:__init __()

  21. 21

    将传感器数据树莓派保存到数据库

  22. 22

    iOS:在Objective-c中带有接近传感器的应用

  23. 23

    带有arduino的流量传感器

  24. 24

    如何通过C ++程序与Ubuntu Touch中的Nexus 4传感器接口?

  25. 25

    如何使用光敏传感器?

  26. 26

    每秒获取传感器的值c ++

  27. 27

    使用带有 PIR 传感器的毫秒检测连续运动

  28. 28

    带有arduino的挠性传感器

  29. 29

    如何使脉搏传感器防水?或者有防水的脉搏传感器吗?

热门标签

归档