您的当前位置:首页OD2101 I2C串口应用层驱动

OD2101 I2C串口应用层驱动

2024-05-23 来源:飒榕旅游知识分享网


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 (maxWriteSizelength=maxWriteSize;

}

if (length>0) {

for (i=0; iwriteRegister(fd, REG_WR, data[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 (maxReadSizelength=maxReadSize;

}

if (length>0) {

for (i=0; idata[i]=readRegister(fd, REG_RD);//读串口内容

}

}

return length;

}

int od2101_select(int fd) {

int maxReadSize=readRegister(fd, REG_UARTBUF); /* 读取 OD2101 最大接收数 */

return maxReadSize;

}

int od2101_close(int fd){

close(fd);

}

因篇幅问题不能全部显示,请点此查看更多更全内容