⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 test_i2c.c

📁 基于linux xcale平台linux系统下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, &reg, 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 + -