OD2101 I2C串口应用层驱动
OD2101/OD2101A芯片为14脚TSSOP封装的CMOS器件,是目前市场上第一款提供I2C转UART接口方案的专用协议转换芯片。该芯片可 以方便用户进行I2C接口的扩展,将数据与RS232,RS485总线进行透明传输。当设计中需要扩展微处理器的串口或希望在单独I2C总线上与UART 器件进行数据交换,使用该芯片可以简单的实现方案。对于实现I2C总线的远距离传输,OD2101/OD2101A芯片也可以提供实用的解决方案。
OD2101/OD2101A芯片的I2C和UART都具有64字节的FIFO,可最大限度的保存用户数据。I2C接口采用从机模式通讯,可适应 从0~400K的I2C传输速率(如果系统需要采用I2C主机方式进行通讯,请参考OD21XX其他系列芯片)。OD2101/OD2101A有3个硬件 管脚(A0,A1,A2)来实现不同的I2C从机地址设置,最多允许8个器件公用一个I2C总线,OD2101与OD2101A唯一的不同在于固定的 I2C地址不同,这样在同一个I2C总线上,最多允许16个器件(OD2101,OD2101A各8个)进行共用。
OD2101/OD2101A芯片具有片内振荡器,可以提供UART的波特率,范围从300~115200BAUD。UART硬件接口共4根(TXD,RXD,RTS,CTS)。从UART接收的数据可以以中断的方式通知主机,保证数据的实时性。
OD2101/OD2101A具有系统关断功能,在此状态下,所有通讯接口都处于高阻态,芯片进入节电模式,这种情况下功耗可降到10μA以下,用户可以在运行中切换芯片的工作状态和关断状态。
二、 特性
z 工作电源电压2.4V~3.6V。
z 具有片内振荡器和内部复位。
z I/O口可承受5V电压。
z 0~400K的I2C时钟频率。
低电平有效中断输出。
z 300~115200BAUD的UART波特率设置范围。
z 增强型UART,具有CTS和RTS通讯控制管脚。
z I2C和UART分别具有64字节的FIFO。
z 具有关断功能,系统可实现低功耗。
z 14脚的TSSOP封装。
z 温度范围-40℃~+85℃
在Linux 下面应用层的驱动如下。没功夫拿到内核里面。
头文件:
#ifndef OD2101_H_
#define OD2101_H_
#include #include /* 定义 OD2101 波特率 */ enum{ UART_9600,UART_300,UART_600,UART_900,UART_1200, UART_1800,UART_2400,UART_3600,UART_4800,UART_7200, UART_14400,UART_19200,UART_28800,UART_38400, UART_57600,UART_115200 }; int od2101_open(int chipAddr); int od2101_setBaudRate(int fd, int value); int od2101_write(int fd, char *data, int length); int od2101_read(int fd, char *data, int length); int od2101_select(int fd); int od2101_read_byte(int fd); int od2101_close(int fd); #endif /*OD2101_H_*/ 源码: #include \"od2101.h\" #define I2C_RETRIES 0x0701 /* number of times a device address */ #define I2C_TIMEOUT 0x0702 /* set timeout - call with int */ #define I2C_TENBIT 0x0704 /* 0 for 7 bit addrs, != 0 for 10 bit */ #define I2C_SLAVE 0x0703 /* Change slave address */ #define I2C_SLAVE_FORCE 0x0706 /* Change slave address */ #define I2C_FUNCS 0x0705 /* Get the adapter functionality */ #define I2C_RDWR 0x0707 /* Combined R/W transfer (one stop only)*/ #define I2C_PEC 0x0708 /* != 0 for SMBus PEC */ #define REG_WR 0x00 /* 数据读寄存器 */ #define REG_RD 0x00 /* 数据写寄存器 */ #define REG_UARTBUF 0x01 /*UART 接收缓存接收字节数 */ #define REG_I2CBUF 0x02 /*I2C 可加载字节数 */ #define REG_CTRL 0x03 /*UART 接口控制寄存器 */ #ifdef _WIN32 int ioctl(int d, int request, ...) { return 0; } #endif int od2101_open(int chipAddr) { int fd = open(\"/dev/i2c/0\打开I2C设备 if (fd < 0) { printf(\"####i2c test device open failed####\\n\"); return (-1); } if (ioctl(fd, I2C_TENBIT, 0)<0) { //设置地址7位模式 printf(\"####i2c ioctl(fd,I2C_TENBIT,0) failed####\\n\"); close(fd); return (-1); } if (ioctl(fd, I2C_SLAVE, chipAddr>>1)<0) { ; //设置I2C从设备地址[6:0] printf(\"####i2c ioctl(fd,I2C_SLAVE,chipAddr) failed####\\n\"); close(fd); return (-1); } ioctl(fd, I2C_TIMEOUT, 10);/*超时时间*/ ioctl(fd, I2C_RETRIES, 2);/*重复次数*/ return fd; } static int readRegister(int fd, int regIndex) { char data[1]; data[0]=regIndex; if (write(fd, data, 1)<1) { return EOF; } if (read(fd, data, 1)<1) { return EOF; } return (data[0]&0xff); } static int writeRegister(int fd, int regIndex, int value) { int res; char data[2]; data[0]=regIndex; data[1]=value; res= write(fd, data,2); //printf(\"writeRegister %d %d res = %d\\n\ return res; } int od2101_setBaudRate(int fd, int value) { int regValue=readRegister(fd, REG_CTRL); /* 读取 OD2101 控制寄存器 */ if (regValue!= EOF) { writeRegister(fd, REG_CTRL, (regValue&0xf0)|value); /* 设置 OD2101UART 波特率*/ printf(\"od2101_setBaudRate size=%d \\n\ return 0; } return EOF; } int od2101_write(int fd, char *data, int length) { int i, maxWriteSize=readRegister(fd, REG_I2CBUF); /* 读取 OD2101 最大发送数 */ if (maxWriteSize } if (length>0) { for (i=0; i } } return length; } int od2101_read_byte(int fd){ return readRegister(fd, REG_RD);//读串口内容 } int od2101_read(int fd, char *data, int length) { int i, maxReadSize=readRegister(fd, REG_UARTBUF); /* 读取 OD2101 最大接收数 */ if(maxReadSize>0) printf(\"max size=%d \\n\ if (maxReadSize } if (length>0) { for (i=0; i } } return length; } int od2101_select(int fd) { int maxReadSize=readRegister(fd, REG_UARTBUF); /* 读取 OD2101 最大接收数 */ return maxReadSize; } int od2101_close(int fd){ close(fd); } 因篇幅问题不能全部显示,请点此查看更多更全内容