怪兽同学 发表于 2022-10-18 09:55:44

Linux 下测试 I2C 通讯

本帖最后由 怪兽同学 于 2022-10-18 10:01 编辑

输入:
root@firefly:/usr/local# gcc test.c -o i2c-test
root@firefly:/usr/local# ./i2c-test 107 /dev/i2c-1 1

预计输出:
Device addr: 0x6b
Device name: /dev/i2c-1
Bit select: 10 bit

Received data: 0x69 0x00 0x00 0x04 0x00 0x00 0x00 0x00
End

实际输出:
Device addr: 0x6b
Device name: /dev/i2c-1
Bit select: 10 bit
####i2c test device open failed####

问题:
fd_open失败,在/usr/local路径下未找到/dev文件夹,不知道该如何运行此代码,求大神指教
//fd = open(argv, O_RDWR);// I2C_DEV /dev/i2c-0

原文地址:blog.chinaunix.net/uid-15732309-id-5818382.html
代码如下:
#include <stdio.h>

2.#include <fcntl.h>

3.#include <unistd.h>

4.#include <stdlib.h>

5.#include <sys/types.h>

6.#include <sys/ioctl.h>

7.#include <linux/i2c.h>

8.#include <linux/i2c-dev.h>

9.

10.

11.#define I2C_DEV "/dev/i2c-1"

12.#define CHIP_ADDR 0xD6

13.

14.

15. int main(int argc, char *argv[])

16. {

17.    int i = 0, fd = -1;

18.    int bits = 0;

19.    int chipAddr = 0xd6;

20.    unsigned char buf={0x0f};

21.    unsigned char recbuf;

22.

23.

24.    if(argc <= 1)

25.    {

26.      printf("Usage: i2ctest device_addr device_name bitsel \n");

27.      return -1;

28.    }

29.

30.

31.    chipAddr = atoi(argv);

32.    printf("Device addr: 0x%x \n", chipAddr);

33.

34.

35.    printf("Device name: %s \n", argv);

36.

37.

38.    bits = atoi(argv);

39.    if(bits == 0 || bits == 1)

40.      printf("Bit select: %s \n", bits == 0? "7 bit": "10 bit" );

41.    else

42.    {

43.      printf("bits error \n");

44.      return -1;

45.    }

46.

47.    fd = open(argv, O_RDWR);// I2C_DEV /dev/i2c-0

48.    if(fd < 0)

49.    {

50.      printf("####i2c test device open failed####\n");

51.      return -1;

52.    }

53.

54.

55.    // I2C_TENBIT:对应的arg取值为0:从机地址为7 bit;对应的arg取值为1:从机地址为10bit

56.    ioctl(fd, I2C_TENBIT, bits); //not 10bit

57.    ioctl(fd, I2C_SLAVE, chipAddr); //设置I2C从设备地址

58.

59.

60.    write(fd,buf,1); /* 发送子地址0 */

61.    usleep(200000);

62.    read(fd, recbuf, 8);

63.

64.

65.    printf("\nReceived data: ");

66.    for(i = 0; i < 8; i++)

67.    {

68.      printf("0x%02x ", recbuf);

69.    }

70.    printf("\nEnd \n");

71.    return 0;

72. }

两手空空儿 发表于 2022-10-18 11:05:17

本帖最后由 两手空空儿 于 2022-10-18 11:07 编辑

BBS有非常好的发代码的方式,楼主可以试试,你这个格式实在是。。。。。
你还加了行号,别人复制过来都没法用

kishere 发表于 2022-10-18 12:27:18

看看/dev 底下是不是有/dev/i2c-1这个设备,我试了下如果输入一个不存在的设备就和你的错误一样了

怪兽同学 发表于 2022-10-18 12:28:41

两手空空儿 发表于 2022-10-18 11:05
BBS有非常好的发代码的方式,楼主可以试试,你这个格式实在是。。。。。
你还加了行号,别人复制过来都没 ...

好的谢谢,我放了原文链接,你可以看看

怪兽同学 发表于 2022-10-18 12:29:30

kishere 发表于 2022-10-18 12:27
看看/dev 底下是不是有/dev/i2c-1这个设备,我试了下如果输入一个不存在的设备就和你的错误一样了

问题是我没有在/usr/local下找到/dev这个路径

kishere 发表于 2022-10-18 12:31:05

根目录下的dev,/dev是绝对路径不是相对路径
./才是相对路径

kishere 发表于 2022-10-18 12:35:23

怪兽同学 发表于 2022-10-18 12:29
问题是我没有在/usr/local下找到/dev这个路径


看这里/dev下的设备有没有你输入的设备名称

怪兽同学 发表于 2022-10-19 08:16:22

kishere 发表于 2022-10-18 12:35
看这里/dev下的设备有没有你输入的设备名称

没有找到,这个I2C不是默认Linux系统就有的吗,还是说需要安装才可以

kishere 发表于 2022-10-20 17:06:57

怪兽同学 发表于 2022-10-19 08:16
没有找到,这个I2C不是默认Linux系统就有的吗,还是说需要安装才可以

你是用的嵌入式开发板还是啥?

china2022 发表于 2022-10-20 23:21:25

还不错

怪兽同学 发表于 2022-10-21 09:52:29

kishere 发表于 2022-10-20 17:06
你是用的嵌入式开发板还是啥?

我就用了一个服务器,插了一个CPU,俩memory,一个m.2装了Linux系统

kishere 发表于 2022-10-21 10:33:49

怪兽同学 发表于 2022-10-21 09:52
我就用了一个服务器,插了一个CPU,俩memory,一个m.2装了Linux系统

一般嵌入式开发板硬件官方都会自己带I2C驱动,你这自己装的怕是只能自己写驱动程序了。。。

怪兽同学 发表于 2022-10-21 13:01:28

kishere 发表于 2022-10-21 10:33
一般嵌入式开发板硬件官方都会自己带I2C驱动,你这自己装的怕是只能自己写驱动程序了。。。

好吧,,

怪兽同学 发表于 2022-10-21 13:03:29

kishere 发表于 2022-10-21 10:33
一般嵌入式开发板硬件官方都会自己带I2C驱动,你这自己装的怕是只能自己写驱动程序了。。。

再请教您一个问题,请问python代码怎么实现在windows、Linux系统上查询系统一共有可支持多少个CPU及Memory插槽,以及目前已经插了几个CPU,几根Memory,分别是哪几根(或者是在哪个插槽插的)

kishere 发表于 2022-10-21 19:16:16

怪兽同学 发表于 2022-10-21 13:03
再请教您一个问题,请问python代码怎么实现在windows、Linux系统上查询系统一共有可支持多少个CPU及Memor ...

查插槽这我是真不知道{:10_266:}
页: [1]
查看完整版本: Linux 下测试 I2C 通讯