sensor型號:OS04L10,sensor引腳以及時鐘要先配置好,源碼如下:
#include <fcntl.h>
#include <linux/i2c-dev.h>
#include <linux/i2c.h>
#include <stdint.h>
#include <stdio.h>
#include <sys/ioctl.h>
#include <unistd.h>#define I2C_DEV "/dev/i2c-0"
#define SENSOR_I2C_ADDR 0x3c // 0x78>>1int i2c_write_reg(int fd, uint8_t reg, uint8_t val)
{uint8_t buf[2] = { reg, val };if (write(fd, buf, 2) != 2)return -1;return 0;
}// SCCB兼容的單字節讀
int i2c_sccb_read_reg(int fd, uint8_t reg, uint8_t* val)
{struct i2c_rdwr_ioctl_data rdwr;struct i2c_msg msgs[2];uint8_t reg_buf = reg;// 第一幀:寫寄存器地址(無STOP,發repeated start)msgs[0].addr = SENSOR_I2C_ADDR;msgs[0].flags = 0; // writemsgs[0].len = 1;msgs[0].buf = ®_buf;// 第二幀:讀數據msgs[1].addr = SENSOR_I2C_ADDR;msgs[1].flags = I2C_M_RD;msgs[1].len = 1;msgs[1].buf = val;rdwr.msgs = msgs;rdwr.nmsgs = 2;if (ioctl(fd, I2C_RDWR, &rdwr) < 0)return -1;return 0;
}int read_sensor_chip_id(int fd, uint32_t* chip_id)
{uint8_t id[4];// 1. 先設置Page0if (i2c_write_reg(fd, 0xFD, 0x00) < 0)return -1;// 2. 連續讀0x02~0x05for (int i = 0; i < 4; i++)if (i2c_sccb_read_reg(fd, 0x02 + i, &id[i]) < 0)return -1;*chip_id = (id[0] << 24) | (id[1] << 16) | (id[2] << 8) | id[3];return 0;
}int get()
{int fd = open(I2C_DEV, O_RDWR);if (fd < 0) {perror("open");return -1;}if (ioctl(fd, I2C_SLAVE, SENSOR_I2C_ADDR) < 0) {perror("ioctl");close(fd);return -1;}uint32_t chip_id;if (read_sensor_chip_id(fd, &chip_id) == 0)printf("Sensor chip id: 0x%08x\n", chip_id);elseprintf("Read chip id failed!\n");close(fd);return 0;
}