📄 test_i2c.c
字号:
/* created by hzh, to support AT24C02 read/write */#include <stdio.h>#include <stdlib.h>#include <fcntl.h>#include <errno.h>#include <unistd.h>#include <linux/fb.h>#include <sys/mman.h>#include <sys/ioctl.h>#define I2C_SLAVE 0x0703 /* Change slave address */#define I2C_BUS_MODE 0x0780#define EEPROM_I2C_ADDR 0x50void udelay(int usec){ fd_set rfds; struct timeval tv; FD_ZERO(&rfds); FD_SET(0, &rfds); tv.tv_sec = 0; tv.tv_usec = usec; select(1, &rfds, NULL, NULL, &tv);}void mdelay(int msec){// int i; // for(i=0; i<msec; i++)// udelay(1000); udelay(msec*1000);}static int i2c_write(int fd, __u8 reg, __u8 val){ int retries; __u8 data[2]; data[0] = reg; data[1] = val; for(retries=5; retries; retries--) { if(write(fd, data, 2)==2) return 0; mdelay(10); } return -1;}static int i2c_read(int fd, __u8 reg, __u8 *val){ int retries; for(retries=5; retries; retries--) if(write(fd, ®, 1)==1) if(read(fd, val, 1)==1) return 0; return -1;}int main(int argc, char *argv[]){ int i, count, fd; __u8 buf[256]; fd = open("/dev/i2c/0", O_RDWR); if(fd<0) { fd = open("/dev/misc/i2c", O_RDWR); if(fd<0) { printf("fail to open i2c adapter device!\n"); return -1; } } if(ioctl(fd, I2C_SLAVE, EEPROM_I2C_ADDR)<0) { printf("fail to set i2c device slave address!\n"); close(fd); return -1; } printf("set slave address to 0x%x success!\n", EEPROM_I2C_ADDR); if(ioctl(fd, I2C_BUS_MODE, 1)<0) printf("set bus mode fail!\n"); else printf("set bus mode ok!\n"); for(i=0; i<sizeof(buf); i++) if(i2c_write(fd, i, i)) break; printf("write %d bytes.\n", i); for(i=0; i<sizeof(buf); i++) buf[i] = 0; for(i=0; i<sizeof(buf); i++) if(i2c_read(fd, i, buf+i)) break; printf("read %d bytes.\n", i); count = i; for(i=0; i<count; i++) printf("%02x %c", buf[i], ((i+1)%16)?',':'\n'); close(fd); return 0;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -