📄 usbeeprom.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 + -