如何使用带raspberry pi的i2c程序配置霍尔效应传感器(si7210)(C语言)
How to configure Hall effect sensor (si7210) using i2c program with raspberry pi (C language)
我想用 I2C 配置霍尔效应传感器,但我真的不知道如何管理它。
我真的不知道我必须在每个寄存器中输入哪个值,但这不是最大的问题。
事实上,我想阅读寄存器以修改它们以了解我可以更改的内容。
为此,我编写了 2 个程序,分别将 write/read 写入寄存器。
但我远不是专家,我不喜欢关于如何更改我的代码以使其正常工作的一些建议和建议。
包括两个文件
#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, ®ister_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;
}
我们无法知道写入程序是否有效,因为读取程序 returns
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
希望能帮到你,非常感谢,
约维托
阅读程序终于完美运行了。
只是那条线路有问题。
register_addr = i >> 8;
我不知道为什么我右移了 8 位
所以我将这一行替换为
register_addr = i;
所以我得到了预期的return(值对应于那些预期的值)
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
你知道这可能来自哪里吗?
我想用 I2C 配置霍尔效应传感器,但我真的不知道如何管理它。 我真的不知道我必须在每个寄存器中输入哪个值,但这不是最大的问题。 事实上,我想阅读寄存器以修改它们以了解我可以更改的内容。
为此,我编写了 2 个程序,分别将 write/read 写入寄存器。 但我远不是专家,我不喜欢关于如何更改我的代码以使其正常工作的一些建议和建议。
包括两个文件
#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, ®ister_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;
}
我们无法知道写入程序是否有效,因为读取程序 returns
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
希望能帮到你,非常感谢, 约维托
阅读程序终于完美运行了。
只是那条线路有问题。
register_addr = i >> 8;
我不知道为什么我右移了 8 位
所以我将这一行替换为
register_addr = i;
所以我得到了预期的return(值对应于那些预期的值)
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
你知道这可能来自哪里吗?