IIC应用编程

linux IIC编程有两种方式:1)文件操作,read/write;2)使用构造i2c_msg结构体的方式并利用ioctl的方式读写。

如下从网上拷贝的示例为ioctl方式:

#include <stdio.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 <assert.h>  
#include <string.h>  
#include <linux/i2c.h>  
#include <linux/i2c-dev.h>  
  
int main(int argc, char **argv)  
{  
    struct i2c_rdwr_ioctl_data e2prom_data;  
    unsigned int fd;  
    unsigned int slave_address, reg_address,value;   
    //slave_address为eeprom的地址,reg_address为eeprom中存储单元的地址,范围0x0--0xFFFFFFFF,value为你要写进eeprom的值  
    int ret;  
      
    if (argc < 5){  
        printf("Usage:n%s /dev/i2c/x start_addr reg_addr valuen",argv[0]);  
        return 0;  
    }  
      
    fd = open(argv[1], O_RDWR);  
      
    if (!fd){  
        printf("Error on opening the device filen");  
        return 0;  
    }  
  
    sscanf(argv[2], "%x", &slave_address);  
    sscanf(argv[3], "%x", &reg_address);  
    sscanf(argv[4], "%x", &value);  
      
    e2prom_data.nmsgs = 2;//因为都时序要两次,所以设为2  
    e2prom_data.msgs = (struct i2c_msg *)malloc(e2prom_data.nmsgs * sizeof(struct i2c_msg));  
    if (!e2prom_data.msgs){  
        printf("Memory alloc errorn");  
        close(fd);  
        return 0;  
    }  
      
    ioctl(fd, I2C_TIMEOUT, 2);//设置超时时间  
    ioctl(fd, I2C_RETRIES, 1);//设置重发次数  
  
      
    e2prom_data.nmsgs = 1;  
    e2prom_data.msgs[0].len = 2;//信息长度为2,看写时序,eeprom的地址不算的,因为付给了addr,而len是指buf中的值的个数  
    e2prom_data.msgs[0].addr = slave_address;  
    e2prom_data.msgs[0].flags = 0;//写命令  
    e2prom_data.msgs[0].buf = (unsigned char*)malloc(2);  
    e2prom_data.msgs[0].buf[0] = reg_address;//信息值1 eeprom中存储单元的地址,即你要往哪写  
    e2prom_data.msgs[0].buf[1] = value;//信息值2,即你要写什么  
      
    ret = ioctl (fd, I2C_RDWR, (unsigned long)&e2prom_data);//好了 ,写进去吧  
    if (ret < 0){  
        printf ("ioctl write errorn");  
    }  
  
    printf("you have write x into e2prom at x addressn",value,reg_address);  
      
    sleep(1);  
      
    e2prom_data.nmsgs = 2;//读时序要两次过程,要发两次I2C消息  
    e2prom_data.msgs[0].len = 1;//信息长度为1,第一次只写要读的eeprom中存储单元的地址  
    e2prom_data.msgs[0].addr = slave_address;  
    e2prom_data.msgs[0].flags = 0;//写命令,看读时序理解  
    e2prom_data.msgs[0].buf[0] = reg_address;//信息值  
          
    e2prom_data.msgs[1].len = 1;  
    e2prom_data.msgs[1].addr = slave_address;  
    e2prom_data.msgs[1].flags = I2C_M_RD;//读命令  
    e2prom_data.msgs[1].buf = (unsigned char*)malloc(1);  
    e2prom_data.msgs[1].buf[0] = 0;//先清空要读的缓冲区  
    ret = ioctl (fd, I2C_RDWR, (unsigned long)&e2prom_data);//好了,读吧  
    if (ret < 0){  
        printf ("ioctl read errorn");  
    }  
      
    printf("read x from e2prom address xn",e2prom_data.msgs[1].buf[0], reg_address);  
      
    close(fd);  
    return 0;     
}

 

posted @ 2016-10-30 07:48  yuxi_o  阅读(332)  评论(0编辑  收藏  举报