linux I2C 读写 tlv320dac3100
#include <stdio.h> #include <stdlib.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <string.h> #include <linux/i2c.h> #include <linux/i2c-dev.h> #define DAC3100_DEV "/dev/i2c-2" #define DAC3100_ADDR 0x18 static unsigned char g_page = 0xFF; void dac3100_change_page( int fd, unsigned char page) { int err; struct i2c_rdwr_ioctl_data data; struct i2c_msg msg; if (g_page == page) { return ; } data.nmsgs = 1; data.msgs = &msg; msg.addr = DAC3100_ADDR; msg.flags = 0; msg.len = 2; msg.buf = (unsigned char *) malloc (2); msg.buf[0] = 0; msg.buf[1] = page; err = ioctl (fd, I2C_RDWR, (unsigned long )&data); if (err < 0) { printf ( "ERR: I2C_RDWR => %d\n" , err); } g_page = page; free (msg.buf); } unsigned char dac3100_read( int fd, unsigned char page, unsigned char reg) { int err; struct i2c_rdwr_ioctl_data data; struct i2c_msg msg[2]; unsigned char rst; dac3100_change_page(fd, page); data.nmsgs = 2; data.msgs = msg; msg[0].addr = DAC3100_ADDR; msg[0].flags = 0; msg[0].len = 1; msg[0].buf = ® msg[1].addr = DAC3100_ADDR; msg[1].flags = I2C_M_RD; msg[1].len = 1; msg[1].buf = &rst; err = ioctl(fd, I2C_RDWR, (unsigned long )&data); if (err < 0) { printf ( "ERR: DAC3100 READ => %d\n" , err); } return rst; } int main( int argc, char ** argv) { int fd, err; int page, reg, pcnt = 3; unsigned char pages[] = {0, 1, 3}; fd = open(DAC3100_DEV, 0, O_RDWR); if (fd < 0) { printf ( "ERR: device open failed!" ); return -1; } err = ioctl(fd, I2C_TENBIT, 0); if (err < 0) { printf ( "ERR: IOCTL I2C_TENBIT => %d\n" , err); } for (page = 0; page < pcnt; page++) { printf ( "------- PAGE %d -------\n" , pages[page]); for (reg = 0; reg < 128; reg++) { printf ( "%02X " , dac3100_read(fd, pages[page], reg)); if ((reg % 8) == 7) { printf ( "\n" ); } } } close(fd); return 0; } |
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步