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

📄 usbeeprom.c

📁 周立功magic2410实验箱源码 第6章Linux高级实验(part1) 6.1 Linux内核编译实验 6.2 Linux根文件系统实验 6.3 CAT1025读/写实验. 6.4 ZL
💻 C
字号:
#include <stdio.h>#include <unistd.h>#include <fcntl.h>                       /* 文件操作 */#include <sys/ioctl.h>				  /* ioctl()函数 */#include "i2c.h"#include "usbdev.h"#define I2C_ADDR			 0xA0		 /* CAT1025 的I2C地址 */#define PAGE_SIZE_CAT1025	 16			 /* CAT1025 的页面大小:16字节 */#define CMD_READ_CAT1025	 0x01		 /* 读CAT1025 命令 */#define CMD_WRITE_CAT1025	 0x02		 /* 写CAT1025 命令 */int initialize_i2cdev(unsigned char slaveaddr);int readcat1025(int fd, unsigned char offset, int len, unsigned char *recbuff);int writecat1025(int fd, unsigned char offset, int len, unsigned char *sendbuff);int main(){	unsigned char buff[259];	int i2cfd, usbfd;	int len, ret;		/* 初始化i2c: 打开i2c驱动, 设置从机地址 */	i2cfd = initialize_i2cdev(0xA0);							if (i2cfd < 0)		exit(-1);	usbfd = open("/dev/usbdev1", O_RDWR);						/* 打开usb驱动程序的从设备1 */	    if(usbfd == -1)    {        printf("\nCan't open usb device!\n");        exit(-1);    }	ret = ioctl(usbfd, USBDEV_SET_WRITE_TIMEOUT, 1000);			/* 设置写端点超时时间 */    if (ret < 0)    {	    	printf("\nSet write endpoint timeout fail!\n");    	exit(-1);	 	}        while(1)    {		ret = read(usbfd, buff, sizeof(buff));					/* 接收USB总线数据 */		if (ret < 0)		{			close(i2cfd);			close(usbfd);				exit(-1);				}						if (ret == sizeof(buff))		{			if (buff[0] == CMD_READ_CAT1025)			{				len = (buff[1] << 8) + buff[2];  				ret = readcat1025(i2cfd, 0, len, &buff[3]);		/* 读CAT1025 */				if (ret >= 0)				{					buff[1] = ret / 256;					buff[2] = ret % 256;					ret = write(usbfd, buff, sizeof(buff));		/* 发送数据到PC */					if (ret < 0)					{						printf("usb write endpoint fail!\n");						close(i2cfd);						close(usbfd);						exit(-1);					}				}				else				{					printf("Read CAT1025 fail!\n");					close(i2cfd);					close(usbfd);					exit(-1);					}							}//end of if (buff[0] == CMD_READ_CAT1025)						if (buff[0] == CMD_WRITE_CAT1025)			{				len = (buff[1] << 8) + buff[2];				ret = writecat1025(i2cfd, 0, len, &buff[3]);	/* 写CAT1025 */				if (ret >= 0)				{					buff[1] = ret / 256;					buff[2] = ret % 256;					ret = write(usbfd, buff, sizeof(buff));		/* 发送响应帧到PC */					if (ret < 0)					{							printf("usb write endpoint fail!\n");						close(i2cfd);						close(usbfd);						exit(-1);					}					}				else				{					printf("Write CAT1025 fail!\n");					close(i2cfd);					close(usbfd);										exit(-1);					}				}//end of if (buff[0] == CMD_WRITE_CAT1025)			 				}//end of if (ret == sizeof(buff))			}//end of while(1)		close(i2cfd);	close(usbfd);		return 0;}/*********************************************************************************************************** Function name: initialize_i2cdev** Descriptions:  open I2C device, set slave address **                打开I2C设备,设置从机地址	** Input: 		  unsigned char slaveaddr : 从机地址		unsigned char slaveaddr : I2C slave address** Output: 		  0:   正确    >0:   错误码		  	 		0:  right		>0:  error code** Created by:    Ming Yuan Zheng 郑明远 ** Created Date:  2006-01-09 **-------------------------------------------------------------------------------------------------------** Modified by:** Modified Date: **------------------------------------------------------------------------------------------------------********************************************************************************************************/int initialize_i2cdev(unsigned char slaveaddr){	int fd, ret; 		fd = open("/dev/i2c/0", O_RDWR);						/* 打开I2C总线控制器驱动 */	if (fd == -1)	{			printf("Can't open i2c device!\n");		return -1;		}	ret = ioctl(fd, I2C_TENBIT, 0);							/* 设置I2C从机地址为7bit */	if (ret != 0)	{		printf("Can't set slave address bit number!\n");			close(fd);		return -1;	}		ret = ioctl(fd, I2C_SLAVE, slaveaddr >> 1);				/* 设置I2C从机地址 */	if (ret != 0)	{		printf("Can't set slave address!\n");		close(fd);			return -1;	}		return fd;}// 读 CAT1025int readcat1025(int fd, unsigned char offset, int len, unsigned char *recbuff){	int actlen;		if (len > 256)		return -1;			actlen = write(fd, &offset, 1);				/* 发送从机地址 */	if (actlen != 1)		return -1;		actlen = read(fd, recbuff, len);   			/* 读取数据 */	if (actlen < 0)		return -1;											return actlen;								/* 返回实际读到的字节数 */}// 写 CAT1025int writecat1025(int fd, unsigned char offset, int len, unsigned char *sendbuff){	unsigned char pages, nums, i;	unsigned char buff[PAGE_SIZE_CAT1025 + 1];						/* 写入缓冲区 */ 	int ret = 0, actlen = 0;		if (len > 256)		return -1;			pages = len / PAGE_SIZE_CAT1025;								/* CAT1025一次只能写一页,一页为16字节 */	nums  = len % PAGE_SIZE_CAT1025;								/* 不够整数页的字节数 */	buff[0] = offset;					    						/* buff[0]为写入偏移地址 */	for (i = 0; i < pages; i++)	{		memcpy(&buff[1], sendbuff, PAGE_SIZE_CAT1025);		  		/* 将要写入的数据复制到写入缓冲区 */		actlen = write(fd, buff, PAGE_SIZE_CAT1025 + 1);		if (actlen < 0)			return -1;				ret += actlen - 1;   									/* 记录已写入的字节数 */		usleep(10000);		  			   							/* 延时10ms的时间让CAT1025 */												  				    /* 内部执行写操作 */   		sendbuff += PAGE_SIZE_CAT1025;	   	buff[0]  += PAGE_SIZE_CAT1025;	}	if (nums > 0)	{																/* 下面写不够整数页的字节数 */		memcpy(&buff[1], sendbuff, nums);		actlen = write(fd, buff, nums + 1);		if (actlen < 0)			return -1;				ret += actlen - 1;			usleep(10000); 	}		return ret;													/* 返回实际写入的字节数 */}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -