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 思路是使 ...
随机推荐
- 工厂方法(factory method)
动机(Motivation) 在软件系统中,经常面临着“某个对象”的创建工作:由需求的变化,这个对象经常面临着剧烈的变化,但是它却拥有比较稳定的接口.如何应对这种变化?如何提供一种“封装机制”来隔离出 ...
- Android Studio 1.5错误
Error:Unable to start the daemon process: could not reserve enough space for object heap. Please ass ...
- phpdesigner 的配置
PHPDesigner 1.语言点击“view->language->”选择2.配置localhost点击“工具->配置->调试->本地”local服务器路径写自己的工作 ...
- eclipse新建安卓项目点击finish后窗口无法关闭
eclipse新建安卓项目点击finish后窗口不会自动关闭,而且工程会有很多报错: 如图,这个页面点击finish一直无法关闭,后来试了试,才发现是因为新建项目的第一个页面的sdk版本的问题: 这里 ...
- reverse-daily(1)-audio_visual_receiver_code
本人第一篇随笔,就以一篇CTF逆向分析的文章开始吧! 链接:http://pan.baidu.com/s/1eS6xFIa 密码:u14d 因为re的分析比较琐碎,所以主要就挑一些重点东西来说. 据说 ...
- C++中的初始化
C++中的RAII机制指明”对象创建时通过构造函数进行初始化,析构时通过析构函数释放资源”,但实际中因类无构造函数时编译器将自动合成一个默认构造函数,该构造函数只服务于自身编译器构造需要而不负责对象成 ...
- Python 调用百度翻译API
由于实习公司这边做的是日文app,有时要看看用户反馈,对于我这种五十音图都没记住的人,表示百度翻译确实还可以.但不想每次都复制粘贴啊,google被墙也是挺蛋疼的事,所以用python结合baidu ...
- x-code快捷键
关于xcode 可设偏好设置 command+,清空缓存 可设隐藏xcode command+h隐藏其它 command+option+h显示全部 可设退出xcode command+q 文件相关: ...
- Shell基础-Bash变量-用户自定义变量
变量设置规则: 变量名称可以由字母.下划线和数字组成,但是不能由数字开头. 在Bash中变量的默认类型是字符串类型,若需要进行数值运算,则需指定变量类型为数值型.变量用等号链接,且两边不能有空格.若需 ...
- 由于xrdp、gnome和unity之间的兼容性问题,在
由于xrdp.gnome和unity之间的兼容性问题,在Ubuntu 14.04版本中仍然无法使用xrdp登陆gnome或unity的远程桌面,现象是登录后只有黑白点为背景,无图标也无法操作.与13. ...