IMX6 PCA9698应用层读写库
.c
#include <stdio.h>
#include <string.h>
#include <linux/types.h>
#include <stdlib.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/ioctl.h>
#include <errno.h>
#include <linux/i2c-dev.h>
#include <linux/i2c.h>
#include "PCA9698.h"
/************************************************************************
* 函数说明:
* 往i2c设备写数据,写一个字节
* 参数说明:
* 1. fd: 文件描述符
* 2. addr: i2c设备地址
* 3. offset: i2c设备内寄存器偏移地址
* 4. buf: 要写入的字节
* 返回值:
* 正常返回0,出错,返回错误码;
************************************************************************/
int PCA9698_write_oneport (int fd, int addr, int offset, unsigned char buf) {
;
struct i2c_rdwr_ioctl_data PCA9698_data;
PCA9698_data.nmsgs = ; /* 每次只写一个字节 */
PCA9698_data.msgs = (struct i2c_msg*)malloc(PCA9698_data.nmsgs*sizeof(struct i2c_msg));
if(!PCA9698_data.msgs)
{
perror("PCA9698_write_oneport function malloc error.\n");
;
}
ioctl(fd,I2C_TIMEOUT,); /*超时时间*/
ioctl(fd,I2C_RETRIES,); /*重复次数*/
(PCA9698_data.msgs[]).buf = (unsigned );
(PCA9698_data.msgs[]).len = ;
(PCA9698_data.msgs[]).addr = addr; //i2c 设备地址
(PCA9698_data.msgs[]).flags = ; //write
(PCA9698_data.msgs[]).buf[] = (unsigned char)(offset&0x7f); // i2c 写入目标的地址
(PCA9698_data.msgs[]).buf[] = (unsigned char)buf; //the data to write
ret = ioctl(fd, I2C_RDWR, (unsigned long)&PCA9698_data);
) {
perror("PCA9698_write_oneport ioctl error\n");
return ret;
}
]).buf);
free(PCA9698_data.msgs);
return ret;
}
/*************************************************************************
* 函数说明:
* 从i2c设备读数据,读一个字节
* 参数说明:
* 1. fd: 文件描述符
* 2. addr: i2c设备地址
* 3. offset: i2c设备内寄存器偏移地址
* 4. buf: 保存读出的字节指针
* 返回值:
* 正常返回0,出错,返回错误码;
************************************************************************/
int PCA9698_read_oneport (int fd, int addr, int offset, unsigned char *buf) {
int ret;
struct i2c_rdwr_ioctl_data PCA9698_data;
PCA9698_data.nmsgs = ;
PCA9698_data.msgs = (struct i2c_msg*)malloc(PCA9698_data.nmsgs*sizeof(struct i2c_msg));
if(!PCA9698_data.msgs) {
perror("PCA9698_read_oneport functionmalloc error\n");
exit();
}
ioctl(fd,I2C_TIMEOUT,); /*超时时间*/
ioctl(fd,I2C_RETRIES,); /*重复次数*/
(PCA9698_data.msgs[]).len = ; //i2c 目标数据的地址
(PCA9698_data.msgs[]).addr = addr; // i2c 设备地址
(PCA9698_data.msgs[]).flags = ; //write
(PCA9698_data.msgs[]).buf = (unsigned );
(PCA9698_data.msgs[]).buf[] = (unsigned char)(offset&0x7f); //i2c 数据地址
(PCA9698_data.msgs[]).len = ; //读出的数据
(PCA9698_data.msgs[]).addr = addr; // i2c 设备地址
(PCA9698_data.msgs[]).flags = I2C_M_RD; //read
(PCA9698_data.msgs[]).buf = (unsigned );//存放返回值的地址。
(PCA9698_data.msgs[]).buf[] = ; //初始化读缓冲
ret = ioctl(fd, I2C_RDWR, (unsigned long)&PCA9698_data);
) {
perror("PCA9698_read_oneport ioctl error.\n");
return ret;
}
//printf("buff[0] = %x\n",PCA9698_data.msgs[1].buf[0]);
*buf = PCA9698_data.msgs[].buf[];
]).buf);
]).buf);
free(PCA9698_data.msgs);
return ret;
}
/************************************************************************
* 函数说明:
* 往i2c设备写数据,写一系列字节
* 参数说明:
* 1. fd: 文件描述符
* 2. addr: i2c设备地址
* 3. offset: i2c设备内寄存器偏移地址
* 4. buf: 要写入的字节
* 返回值:
* 正常返回0,出错,返回错误码;
************************************************************************/
int PCA9698_write_ports (int fd, int addr, int offset, unsigned char *buf) {
;
;
struct i2c_rdwr_ioctl_data PCA9698_data;
PCA9698_data.nmsgs = ; /* 每次只写一个字节 */
PCA9698_data.msgs = (struct i2c_msg*)malloc(PCA9698_data.nmsgs*sizeof(struct i2c_msg));
if(!PCA9698_data.msgs)
{
perror("PCA9698_write_ports function malloc error.\n");
;
}
ioctl(fd,I2C_TIMEOUT,); /*超时时间*/
ioctl(fd,I2C_RETRIES,); /*重复次数*/
(PCA9698_data.msgs[]).buf = (unsigned );
(PCA9698_data.msgs[]).len = ;
(PCA9698_data.msgs[]).addr = addr; //i2c 设备地址
(PCA9698_data.msgs[]).flags = ; //write
(PCA9698_data.msgs[]).buf[] = (unsigned char)(offset|0x80); // i2c 写入目标的地址
;num<;num++)
(PCA9698_data.msgs[]).buf[+num] = (unsigned char)*(buf+num); //the data to write
ret = ioctl(fd, I2C_RDWR, (unsigned long)&PCA9698_data);
) {
perror("PCA9698_write_ports ioctl error\n");
return ret;
}
]).buf);
free(PCA9698_data.msgs);
return ret;
}
/*************************************************************************
* 函数说明:
* 从i2c设备读数据,读一系列字节
* 参数说明:
* 1. fd: 文件描述符
* 2. addr: i2c设备地址
* 3. offset: i2c设备内寄存器偏移地址
* 4. buf: 保存读出的字节指针
* 返回值:
* 正常返回0,出错,返回错误码;
************************************************************************/
int PCA9698_read_ports (int fd, int addr, int offset, unsigned char *buf) {
int ret;
;
struct i2c_rdwr_ioctl_data PCA9698_data;
PCA9698_data.nmsgs = ;
PCA9698_data.msgs = (struct i2c_msg*)malloc(PCA9698_data.nmsgs*sizeof(struct i2c_msg));
if(!PCA9698_data.msgs) {
perror("PCA9698_read_ports functionmalloc error\n");
exit();
}
ioctl(fd,I2C_TIMEOUT,); /*超时时间*/
ioctl(fd,I2C_RETRIES,); /*重复次数*/
(PCA9698_data.msgs[]).len = ; //i2c 目标数据的地址
(PCA9698_data.msgs[]).addr = addr; // i2c 设备地址
(PCA9698_data.msgs[]).flags = ; //write
(PCA9698_data.msgs[]).buf = (unsigned );
(PCA9698_data.msgs[]).buf[] = (unsigned char)(offset|0x80); //i2c 数据地址
(PCA9698_data.msgs[]).len = ; //读出的数据
(PCA9698_data.msgs[]).addr = addr; // i2c 设备地址
(PCA9698_data.msgs[]).flags = I2C_M_RD; //read
(PCA9698_data.msgs[]).buf = (unsigned );//存放返回值的地址。
;num<;num++)
(PCA9698_data.msgs[]).buf[num] = ; //初始化读缓冲
ret = ioctl(fd, I2C_RDWR, (unsigned long)&PCA9698_data);
) {
perror("PCA9698_read_ports ioctl error.\n");
return ret;
}
//printf("buff[0] = %x\n",PCA9698_data.msgs[1].buf[0]);
;num<;num++)
*(buf+num) = PCA9698_data.msgs[].buf[num];
]).buf);
]).buf);
free(PCA9698_data.msgs);
return ret;
}
/************************************************************************
* 函数说明:
* 往i2c设备写数据,写一位
* 参数说明:
* 1. fd: 文件描述符
* 2. p_i: 端口号 0对应P0_0,11对应P1_1
* 3. H_L:高低 --1 -0
* 返回值:
* 正常返回0,出错,返回错误码;
*注意:
* 使用前需要使用PCA9698_write_oneport或者PCA9698_write_ports做方向初始化
************************************************************************/
int PCA9698_write_onebit (int fd, int p_i, unsigned char H_L) {
;
unsigned char buf;
unsigned char temp;
int offset_in;
int offset_out;
struct i2c_rdwr_ioctl_data PCA9698_data;
//解析地址以及数据
)
{
:
offset_in=PCA9688_P0_REG_IN;
offset_out=PCA9688_P0_REG_OUT;
break;
:
offset_in=PCA9688_P1_REG_IN;
offset_out=PCA9688_P1_REG_OUT;
//printf("P1\n");
break;
:
offset_in=PCA9688_P2_REG_IN;
offset_out=PCA9688_P2_REG_OUT;
break;
:
offset_in=PCA9688_P3_REG_IN;
offset_out=PCA9688_P3_REG_OUT;
break;
:
offset_in=PCA9688_P4_REG_IN;
offset_out=PCA9688_P4_REG_OUT;
break;
}
ret=PCA9698_read_oneport (fd,PCA9698_ADDR,offset_in,&buf);
)
{
perror("get data from port err\n");
return ret;
}
)
{
:temp=0x01;break;
:temp=0x02;break;
:temp=0x04;break;
:temp=0x08;break;
:temp=0x10;break;
:temp=0x20;break;
:temp=0x40;break;
:temp=0x80;break;
}
)
buf|=temp;
)
buf&=~temp;
else
;
PCA9698_data.nmsgs = ; /* 每次只写一个字节 */
PCA9698_data.msgs = (struct i2c_msg*)malloc(PCA9698_data.nmsgs*sizeof(struct i2c_msg));
if(!PCA9698_data.msgs)
{
perror("PCA9698_write_onebit function malloc error.\n");
;
}
ioctl(fd,I2C_TIMEOUT,); /*超时时间*/
ioctl(fd,I2C_RETRIES,); /*重复次数*/
(PCA9698_data.msgs[]).buf = (unsigned );
(PCA9698_data.msgs[]).len = ;
(PCA9698_data.msgs[]).addr = PCA9698_ADDR; //i2c 设备地址
(PCA9698_data.msgs[]).flags = ; //write
(PCA9698_data.msgs[]).buf[] = (unsigned char)(offset_out&0x7f); // i2c 写入目标的地址
(PCA9698_data.msgs[]).buf[] = (unsigned char)buf; //the data to write
ret = ioctl(fd, I2C_RDWR, (unsigned long)&PCA9698_data);
) {
perror("PCA9698_write_onebit ioctl error\n");
return ret;
}
]).buf);
free(PCA9698_data.msgs);
return ret;
}
/*************************************************************************
* 函数说明:
* 从i2c设备读数据,读一位
* 参数说明:
* 1. fd: 文件描述符
* 2. p_i: 端口号 0对应P0_0,11对应P1_1
* 3. value:返回值 高低--1-0
* 返回值:
* 正常返回0,出错,返回错误码;
*注意:
* 使用前需要使用PCA9698_write_oneport或者PCA9698_write_ports做方向初始化
************************************************************************/
int PCA9698_read_onebit (int fd, int p_i, unsigned char *value) {
int ret;
struct i2c_rdwr_ioctl_data PCA9698_data;
int offset;
unsigned char temp;
//解析地址以及数据
)
{
:
offset=PCA9688_P0_REG_IN;
break;
:
offset=PCA9688_P1_REG_IN;
break;
:
offset=PCA9688_P2_REG_IN;
break;
:
offset=PCA9688_P3_REG_IN;
break;
:
offset=PCA9688_P4_REG_IN;
break;
}
PCA9698_data.nmsgs = ;
PCA9698_data.msgs = (struct i2c_msg*)malloc(PCA9698_data.nmsgs*sizeof(struct i2c_msg));
if(!PCA9698_data.msgs) {
perror("PCA9698_read_onebit functionmalloc error\n");
exit();
}
ioctl(fd,I2C_TIMEOUT,); /*超时时间*/
ioctl(fd,I2C_RETRIES,); /*重复次数*/
(PCA9698_data.msgs[]).len = ; //i2c 目标数据的地址
(PCA9698_data.msgs[]).addr = PCA9698_ADDR; // i2c 设备地址
(PCA9698_data.msgs[]).flags = ; //write
(PCA9698_data.msgs[]).buf = (unsigned );
(PCA9698_data.msgs[]).buf[] = (unsigned char)(offset&0x7f); //i2c 数据地址
(PCA9698_data.msgs[]).len = ; //读出的数据
(PCA9698_data.msgs[]).addr = PCA9698_ADDR; // i2c 设备地址
(PCA9698_data.msgs[]).flags = I2C_M_RD; //read
(PCA9698_data.msgs[]).buf = (unsigned );//存放返回值的地址。
(PCA9698_data.msgs[]).buf[] = ; //初始化读缓冲
ret = ioctl(fd, I2C_RDWR, (unsigned long)&PCA9698_data);
) {
perror("PCA9698_read_onebit ioctl error.\n");
return ret;
}
//printf("buff[0] = %x\n",PCA9698_data.msgs[1].buf[0]);
temp = PCA9698_data.msgs[].buf[];
)
{
:*value=temp&0x01;break;
:*value=(temp>>)&0x01;break;
:*value=(temp>>)&0x01;break;
:*value=(temp>>)&0x01;break;
:*value=(temp>>)&0x01;break;
:*value=(temp>>)&0x01;break;
:*value=(temp>>)&0x01;break;
:*value=(temp>>)&0x01;break;
}
]).buf);
]).buf);
free(PCA9698_data.msgs);
return ret;
}
/************************************************************************
* 函数说明:
* 往i2c设备写数据,设置中断
* 参数说明:
* 1. fd: 文件描述符
* 2.port 0-4
* 3.state 0-on 1-off
* 返回值:
* 正常返回0,出错,返回错误码;
*注意:
* 中断仅当IO输入时有效,发生中断后,读取输入寄存器,中断自动清除
************************************************************************/
int PCA9698_set_int (int fd, int port,unsigned char state) {
;
int offset;
unsigned char temp;
switch(port)
{
:offset=PCA9688_P0_REG_INT;break;
:offset=PCA9688_P1_REG_INT;break;
:offset=PCA9688_P2_REG_INT;break;
:offset=PCA9688_P3_REG_INT;break;
:offset=PCA9688_P4_REG_INT;break;
}
)
temp=0x00;
)
temp=0xff;
ret=PCA9698_write_oneport(fd,PCA9698_ADDR,offset,temp);
return ret;
}
/************************************************************************
* 函数说明:
* 往i2c设备写数据,设置中断
* 参数说明:
* 1. fd: 文件描述符
* 2.port 0-4
* 3.buf P0 0-7 P1 10-17
* 返回值:
* 正常返回0,出错,返回错误码;
*注意:
* 放在IO中断服务程序中,查询IN状态,返回产生中断的IO的键值
************************************************************************/
int PCA9698_int_irq (int fd, int port,int *buf) {
;
int offset;
unsigned char temp;
]={-,-,-,-,-,-,-,-};
,i=,j=;
switch(port)
{
:offset=PCA9688_P0_REG_IN;break;
:offset=PCA9688_P1_REG_IN;break;
:offset=PCA9688_P2_REG_IN;break;
:offset=PCA9688_P3_REG_IN;break;
:offset=PCA9688_P4_REG_IN;break;
}
ret=PCA9698_read_oneport(fd,PCA9698_ADDR,offset,&temp);
//printf("temp=%d\n",temp);
;num<;num++)
{
if((temp>>num)&0x01)
{
temp1[i]=num;
//printf("temp1[%d]=%d\n",i,num);
i++;
}
}
;j<i;j++)
temp1[j]=temp1[j]+port*;
-i;j++)
temp1[j]=-;
;num<;num++)
{
*(buf+num)=temp1[num];
//printf("temp1[%d]=%d\n",num,temp1[num]);
}
return ret;
}
.h
/************************************************************************************** * 声明: * 这个函数库主要用于i2c读写PCA9698,提供了以下功能: * * write by tla001 2016-1-30 **************************************************************************************/ #ifndef __PCA9698_H__ #define __PCA9698_H__ /** *AD0 AD1 AD2 PCA9698_ADDR *0 0 0 0x40 *1 1 1 0x4E */ #define PCA9698_ADDR 0x40>>1 /**********control register addr*********************************** * *PCA9688_CON_OUTMODE 输出结构配置寄存器--控制端口配置为开漏或图腾 *PCA9688_CON_ALLBANK 控制全组寄存器--所有IO输出相同电平 *PCA9688_CON_MODESEL 模式选择寄存器--16种模式 * ********************************************************************/ #define PCA9688_CON_OUTMODE 0x28 #define PCA9688_CON_ALLBANK 0x29 #define PCA9688_CON_MODESEL 0x2a /**********port register addr**************************************** * *REG_IN 只读寄存器, 反应输入逻辑电平的状态 *REG_OUT 设置相应端口的输出状态 *REG_TURN 使相应的输出寄存器的极性发生反转 *REG_SET 设置 I/O 口为输出或输入 *REG_INT 设置相应输入端口响应中断 * **********************************************************************/ #define PCA9688_P0_REG_IN 0x00 #define PCA9688_P0_REG_OUT 0x08 #define PCA9688_P0_REG_TURN 0x10 #define PCA9688_P0_REG_SET 0x18 #define PCA9688_P0_REG_INT 0x20 #define PCA9688_P1_REG_IN 0x01 #define PCA9688_P1_REG_OUT 0x09 #define PCA9688_P1_REG_TURN 0x11 #define PCA9688_P1_REG_SET 0x19 #define PCA9688_P1_REG_INT 0x21 #define PCA9688_P2_REG_IN 0x02 #define PCA9688_P2_REG_OUT 0x0a #define PCA9688_P2_REG_TURN 0x12 #define PCA9688_P2_REG_SET 0x1a #define PCA9688_P2_REG_INT 0x22 #define PCA9688_P3_REG_IN 0x03 #define PCA9688_P3_REG_OUT 0x0b #define PCA9688_P3_REG_TURN 0x13 #define PCA9688_P3_REG_SET 0x1b #define PCA9688_P3_REG_INT 0x23 #define PCA9688_P4_REG_IN 0x04 #define PCA9688_P4_REG_OUT 0x0c #define PCA9688_P4_REG_TURN 0x14 #define PCA9688_P4_REG_SET 0x1c #define PCA9688_P4_REG_INT 0x24 #define array_size(array_buffer) (sizeof(array_buffer)/sizeof(*array_buffer)) int PCA9698_write_oneport (int fd, int addr, int offset, unsigned char buf); int PCA9698_read_oneport (int fd, int addr, int offset, unsigned char *buf); int PCA9698_write_ports (int fd, int addr, int offset, unsigned char *buf); int PCA9698_read_ports (int fd, int addr, int offset, unsigned char *buf); int PCA9698_read_onebit (int fd, int p_i, unsigned char *value); int PCA9698_write_onebit (int fd, int p_i, unsigned char H_L); int PCA9698_int_irq (int fd, int port,int *buf); int PCA9698_set_int (int fd, int port,unsigned char state); #endif //__PCA9698_H__
test
#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <linux/i2c-dev.h>
#include <linux/i2c.h>
#include "PCA9698.h"
int main ( int argc, char ** argv ) {
int fd,ret;
unsigned char buf;
;
fd = open( "/dev/i2c-2", O_RDWR );
) {
perror( "open error\n" );
;
}
ret==ioctl(fd,I2C_TENBIT,);
//ret==ioctl(fd,I2C_SLAVE,PCA9698_ADDR);
/***保留写法***没测试****
ret==ioctl(fd,I2C_SLAVE,PCA9698_ADDR>>1);
if(ret<0)
{
printf("set slave addr err:%d\n",ret);
return -1;
}
ret==ioctl(fd,I2C_TENBIT,0);
if(ret<0)
{
printf("set slave addr 8bit err:%d\n",ret);
return -1;
}
else
printf("set slave addr 8bit succeed\n");
ret=write(fd,PCA9688_P0_REG_SET,1);
printf("reg_set %d\n",ret);
ret=write(fd,0x00,1);
printf("reg_set data %d\n",ret);
while(1)
{
for(num=0;num<5;num++)
{
//sleep(1);
ret=write(fd,PCA9688_P0_REG_OUT+num,1);
printf("reg_out %d\n",ret);
ret=write(fd,0x00,1);
printf("reg_out data %d\n",ret);
sleep(1);
write(fd,PCA9688_P0_REG_OUT+num,1);
write(fd,0xff,1);
//sleep(1);
write(fd,PCA9688_P0_REG_OUT+num,1);
read(fd,buf,1);
printf("num %d buf=%d\n",num,buf);
}
}
***************/
/********************一次读写一个端口测试**********************************************
ret=PCA9698_write_oneport(fd,PCA9698_ADDR,PCA9688_P0_REG_SET,0x00);
if(ret<0)
{
printf("init err ret=%d\n",ret);
//return 0;
}
while(1)
{
sleep(1);
ret=PCA9698_write_oneport(fd,PCA9698_ADDR,PCA9688_P0_REG_OUT,0x00);
if(ret<0)
{
printf("init err ret1=%d\n",ret);
}
sleep(1);
ret=PCA9698_write_oneport(fd,PCA9698_ADDR,PCA9688_P0_REG_OUT,0xff);
if(ret<0)
{
printf("init err ret2=%d\n",ret);
}
sleep(1);
ret=PCA9698_read_oneport (fd, PCA9698_ADDR,PCA9688_P0_REG_IN,&buf);
if(ret<0)
{
printf("init err ret3=%d\n",ret);
}
printf("buf=%d\n",buf);
}
**************************************************************************/
/********************一次读写所有端口测试**********************************************
unsigned char data1[5]={0x00,0x00,0x00,0x00,0x00};
unsigned char data2[5]={0xff,0xff,0xff,0xff,0xff};
unsigned char data3[5]={0};
ret=PCA9698_write_ports(fd,PCA9698_ADDR,PCA9688_P0_REG_SET,data1);
if(ret<0)
{
printf("init err ret=%d\n",ret);
//return 0;
}
while(1)
{
sleep(1);
ret=PCA9698_write_ports(fd,PCA9698_ADDR,PCA9688_P0_REG_OUT,data1);
if(ret<0)
{
printf("init err ret1=%d\n",ret);
}
ret=PCA9698_read_ports (fd, PCA9698_ADDR,PCA9688_P0_REG_IN,data3);
if(ret<0)
{
printf("init err ret3=%d\n",ret);
}
for(num=0;num<5;num++)
printf("buf %d=%d\n",num,*(data3+num));
sleep(1);
ret=PCA9698_write_ports(fd,PCA9698_ADDR,PCA9688_P0_REG_OUT,data2);
if(ret<0)
{
printf("init err ret2=%d\n",ret);
}
sleep(1);
ret=PCA9698_read_ports (fd, PCA9698_ADDR,PCA9688_P0_REG_IN,data3);
if(ret<0)
{
printf("init err ret3=%d\n",ret);
}
for(num=0;num<5;num++)
printf("buf %d=%d\n",num,*(data3+num));
}
**************************************************************************/
/********************一次读写一个bit**********************************************/
;
//unsigned char value_=0;
]={};
ret=PCA9698_write_oneport(fd,PCA9698_ADDR,PCA9688_P0_REG_SET,0x00);
ret=PCA9698_write_oneport(fd,PCA9698_ADDR,PCA9688_P1_REG_SET,0x00);
//设置P4口输入,开启中断
ret=PCA9698_write_oneport(fd,PCA9698_ADDR,PCA9688_P4_REG_SET,0xff);
ret=PCA9698_set_int (fd,,);
)
{
printf("init err ret=%d\n",ret);
//return 0;
}
)
{
pin=;
sleep();
ret=PCA9698_write_onebit(fd,pin,);
ret=PCA9698_read_onebit (fd,pin,&buf);
printf("P%d=%d\n",pin,buf);
sleep();
ret=PCA9698_write_onebit(fd,pin,);
ret=PCA9698_read_onebit (fd,pin,&buf);
printf("P%d=%d\n",pin,buf);
pin=;
sleep();
ret=PCA9698_write_onebit(fd,pin,);
ret=PCA9698_read_onebit (fd,pin,&buf);
printf("P%d=%d\n",pin,buf);
sleep();
ret=PCA9698_write_onebit(fd,pin,);
ret=PCA9698_read_onebit (fd,pin,&buf);
printf("P%d=%d\n",pin,buf);
pin=;
sleep();
ret=PCA9698_write_onebit(fd,pin,);
ret=PCA9698_read_onebit (fd,pin,&buf);
printf("P%d=%d\n",pin,buf);
sleep();
ret=PCA9698_write_onebit(fd,pin,);
ret=PCA9698_read_onebit (fd,pin,&buf);
printf("P%d=%d\n",pin,buf);
sleep();
ret=PCA9698_int_irq (fd, ,data3);
;num<;num++)
{
)
printf("int=%d\n",data3[num]);
}
}
/**************************************************************************/
close( fd );
;
}
IMX6 PCA9698应用层读写库的更多相关文章
- CI框架在模型中切换读写库和读写库
如果你想在控制器中切换在application/config/database.php中配置好的数据库group,那么你可以参考这篇博客:CI框架在控制器中切换读写库和读写库 如果你是希望在模型中切换 ...
- CI框架在控制器中切换读写库和读写库
CodeIgniter框架版本:3.1.7 ,php版本:5.6.* ,mysql版本:5.6 在Ci框架中,可以在application/config/database.php中配置多个group, ...
- Apache POI:Excel读写库
1)Apache POI 简介 Apache POI是用Java编写的免费开源的跨平台的 Java API,Apache POI提供API给Java程式对Microsoft Office格式档案读和写 ...
- sqlalchemy配置多读写库多连接后的关系设置
前言 一般来说,解决sqlalchemy 连接多个库的最简单的方式是新建两个或多个db.session 相互没有关联,modle配置不同的db.session来连接,这样的话,relationship ...
- Linux在应用层读写寄存器的方法
可以通过操作/dev/mem设备文件,以及mmap函数,将寄存器的地址映射到用户空间,直接在应用层对寄存器进行操作,示例如下: #include <stdio.h> #include &l ...
- 基于Go语言的xmind读写库,我主要用来把有道云笔记思维导图转为xmind
项目地址 xmind 基于go语言的xmind接口 使用方法参考: example 本库主要加载xmind文件为json结构,保存文件时也用的json结构而不是xml结构 本库只做了最基本的主题添加功 ...
- Linux在应用层读写寄存器的方法。。。
参考链接:http://blog.csdn.net/liukang325/article/details/26601811 /dev/mem:物理内存的全镜像.可以用来访问物理内存.由于应用运行都在用 ...
- 在应用层通过spring特性解决数据库读写分离
如何配置mysql数据库的主从? 单机配置mysql主从:http://my.oschina.net/god/blog/496 常见的解决数据库读写分离有两种方案 1.应用层 http://neore ...
- [Spring] - 读写分离
使用Spring可以做到在应用层中实现数据库的读写分离. 参考文档: http://blog.csdn.net/lifuxiangcaohui/article/details/7280202 思路是使 ...
随机推荐
- 修改 UISearchBar cancelButton 样式
今天收到个问题,老大让我修改UISearchBar cancelButton的样式本来以为很简单的一个活,没想到让我长知识了. 开始在网上搜到的方法和我想象的一样,通过遍历Subviews获得butt ...
- 项目中使用oracle序列
在数据库设计的时候我们可以将表的ID定义为String 然后我们可以使用序列来得到唯一的ID 手写一个mapper: <?xml version="1.0" encoding ...
- 《Java中的不可变类》
//不可变类举例: /* 下面程序试图定义一个不可变类Person类,但=因为Person类包含一个引用类型的成员变量, 且这个引用类是可变类,所以导致Person类也变成了可变类. */ class ...
- Multiply game_线段树
Problem Description Tired of playing computer games, alpc23 is planning to play a game on numbers. B ...
- CSS值得关注的那些事?
CSS值得关注的那些事? CSS层叠样式表的出现,使得样式表现层与HTML结构层分离,CSS样式与HTML结构层次清晰,一目了然.给我们前端开发者带来诸多的便利,然而,在实际前端开发中,还是有相当多的 ...
- JavaScript中的document.cookie的使用
转:http://blog.csdn.net/liuyong0818/article/details/4807473 我们已经知道,在 document 对象中有一个 cookie 属性.但是 Coo ...
- win10 64bits信捷触摸屏download usb口驱动程序的安装
[问题描述] win10 64bits,信捷触摸屏开发软件,下载的时候需要安装驱动程序. 用的以前的win7 64bits的驱动程序,直接双击安装,显示无法操作注册表,需要管理员模式. 使用管理员权限 ...
- [原创]cocos2d-x研习录-第二阶 概念类之摄相机类(CCCamera)
在Cocos2D-x中,每个CCNode都拥有一个摄像机类CCCamera.只有通过CCCamera,CCNode才会被渲染出来.当CCNode发生缩放.旋转和位置变化时,都需要覆盖CCCamera, ...
- 论文笔记之:Deep Recurrent Q-Learning for Partially Observable MDPs
Deep Recurrent Q-Learning for Partially Observable MDPs 摘要:DQN 的两个缺陷,分别是:limited memory 和 rely on b ...
- docker2
https://github.com/docker/distribution daocloud 数人云 时速云 http://jpetazzo.github.io/2014/06/23/docker- ...