日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > linux >内容正文

linux

linux i2c编程

發布時間:2023/12/15 linux 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 linux i2c编程 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

?

有三種方式實現linux i2c用戶態編程,讀寫i2c外設。

?

1. ioctl

ioctl(file, I2C_RDWR, struct i2c_rdwr_ioctl_data *msgset)

?

#include <stdio.h> #include <unistd.h> #include <stdlib.h> #include <sys/ioctl.h> #include <fcntl.h> #include <linux/i2c-dev.h> #include <linux/i2c.h>#define CHIP "/dev/i2c-0" #define I2C_DEVICE_ADDR 0x56 //eeprom addrstatic int iic_write(int i2c_fd, int device_addr, unsigned int reg_address ,unsigned int reg_val) {struct i2c_rdwr_ioctl_data work_queue;int ret = 0;work_queue.nmsgs = 1;work_queue.msgs = (struct i2c_msg *)malloc(work_queue.nmsgs * sizeof(struct i2c_msg));if(!work_queue.msgs){printf("msgs memery alloc error\n");close(i2c_fd);return -1;} if ((work_queue.msgs[0].buf = (unsigned char *)malloc(2 * sizeof(unsigned char))) == NULL){printf("buf memery alloc error...\n");close(i2c_fd);return -1;}(work_queue.msgs[0]).len = 2;(work_queue.msgs[0]).flags = !I2C_M_RD;(work_queue.msgs[0]).addr = device_addr;(work_queue.msgs[0]).buf[0] = reg_address;(work_queue.msgs[0]).buf[1] = reg_val;work_queue.nmsgs = 1;ret = ioctl(i2c_fd, I2C_RDWR, (unsigned long) &work_queue);if(ret < 0){printf("Error during I2C_RDWR ioctl with error code: %d\n", ret);return -1;}free(work_queue.msgs[0].buf);free(work_queue.msgs);return 0; }static int iic_read(int i2c_fd, int device_addr, unsigned int reg_address) {struct i2c_rdwr_ioctl_data work_queue;unsigned char val;int ret;work_queue.nmsgs = 2;work_queue.msgs = (struct i2c_msg *)malloc(work_queue.nmsgs *sizeof(struct i2c_msg));if(!work_queue.msgs){printf("Memery alloc error\n");close(i2c_fd);return -1;}val =(unsigned char)reg_address;(work_queue.msgs[0]).len = 1;(work_queue.msgs[0]).flags = 0;(work_queue.msgs[0]).addr = device_addr;(work_queue.msgs[0]).buf = &val;(work_queue.msgs[1]).len = 1;(work_queue.msgs[1]).flags = 1;(work_queue.msgs[1]).addr = device_addr;(work_queue.msgs[1]).buf = &val;ret = ioctl(i2c_fd, I2C_RDWR, (unsigned long) &work_queue);if(ret < 0){printf("Error during I2C_RDWR ioctl with error code: %d\n", ret);return -1;}free(work_queue.msgs);return val; }int main() {printf("hello, this is i2c test\n");int ret = 0;int fd = open(CHIP, O_RDWR);if (fd< 0) {printf("open %s failed\n", CHIP);goto exit;}if (ioctl(fd, I2C_SLAVE, I2C_DEVICE_ADDR) < 0) { //device addrprintf("ioictl: set slave address failed\n");goto close;}ret = iic_write(fd, I2C_DEVICE_ADDR, 0, 0xaa);if(ret)printf("write failed\n");usleep(1000 * 1000 * 0.1);ret = iic_write(fd, I2C_DEVICE_ADDR, 1, 0xbb);if(ret)printf("write failed\n");usleep(1000 * 1000 * 0.1);ret = iic_read(fd, I2C_DEVICE_ADDR, 0);printf("read reg addr:0 data:%x\n", ret);ret = iic_read(fd, I2C_DEVICE_ADDR, 1);printf("read reg addr:1 data:%x\n", ret); close:close(fd);exit:return 0; }

?

2. write and read

?

#include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <sys/ioctl.h> #include <fcntl.h> #include <linux/i2c-dev.h> #include <linux/i2c.h>#define CHIP "/dev/i2c-0" #define I2C_DEVICE_ADDR 0x56 //eeprom addrint main(int argc, char* argv[]) {unsigned char rddata;unsigned char rdaddr = 0; /* 將要讀取的數據在芯片中的偏移量*/unsigned char wrbuf[2] = {0, 0xaa}; /*要寫的數據,第1個字節為偏移量, 第二個字節為寫入的數據*/ printf("hello,this is i2c test\n");int fd =open(CHIP, O_RDWR);if (fd< 0) {printf("open %s failed\n", CHIP);goto exit;}if (ioctl(fd, I2C_SLAVE, I2C_DEVICE_ADDR) < 0) {printf("ioictl:setslave address failed\n");goto close;}if(argc == 3){// write and read reg addrwrbuf[0] = atoi(argv[1]);rdaddr = wrbuf[0];// write data, one bytewrbuf[1] = atoi(argv[2]);}printf("write addr:0x%x, data:0x%x\n", wrbuf[0], wrbuf[1]);write(fd, wrbuf, 2);usleep(1000 * 1000 * 0.2);write(fd, &rdaddr, 1); /*讀取之前首先設置讀取的偏移量*/ usleep(1000 * 1000 * 0.2);read(fd, &rddata, 1);printf("read addr:0x%x, value:0x%x \n", rdaddr, rddata); close:close(fd);exit:return 0; }

?

3.?libi2c.so library,?i2c_smbus_xxx

https://git.kernel.org/pub/scm/utils/i2c-tools/i2c-tools.git/.

??__s32 i2c_smbus_read_byte(int file);

??__s32 i2c_smbus_write_byte(int file, __u8 value);

......

?

總結

以上是生活随笔為你收集整理的linux i2c编程的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 欧美乱妇日本无乱码特黄大片 | 欧美亚色 | 夜夜爽影院 | 亚洲爱情岛论坛永久 | 国产日韩视频在线 | 青青草在线播放 | 午夜激情网站 | 四虎影视免费观看 | 国产五十路 | 黄色一级免费片 | 国产乱女淫av麻豆国产 | 韩毛片 | 刘亦菲一区二区三区免费看 | 亚洲综合婷婷 | 国产一级aa大片毛片 | 宗合久久| 亚洲一二三不卡 | 成年人免费在线看 | 91黄视频在线观看 | 欧美一区二区最爽乱淫视频免费看 | 五月天三级 | 日韩av网站在线 | 天天射天天射天天射 | 福利片第一页 | 国产精品成人一区二区三区 | 亚洲精品激情视频 | 手机福利在线 | 99国产揄拍国产精品 | 91午夜免费视频 | 蜜臀av色欲a片无码精品一区 | 在线观看黄色免费视频 | 色伊人网 | 无码aⅴ精品一区二区三区 精品久久在线 | 亚洲精品视频三区 | 国产淫片av片久久久久久 | 青青在线观看视频 | 亚洲国产第一页 | 久久中文字幕视频 | 一级黄色aa | 成人av在线网址 | 强开小嫩苞一区二区三区网站 | 无码人妻丰满熟妇啪啪 | 黄色一级在线视频 | 少妇人妻综合久久中文字幕 | av中文天堂在线 | 亚洲黄色在线网站 | 欧美性猛交bbbbb精品 | 久久国产精品久久国产精品 | 伊人av影院 | 免费国产视频 | 美女被娇喘视频 | 91高清在线视频 | 99一区二区三区 | 久久东京 | 欧美色哟哟 | 四虎国产精品成人免费入口 | 啊v视频在线观看 | 夜夜干夜夜 | 久久精品欧美一区二区 | 亚洲激情三区 | 靠逼网站在线观看 | 婷婷在线免费 | 亚洲黄色三级 | av影音先锋 | 乌克兰做爰xxxⅹ性视频 | 天天干狠狠干 | 亚洲国产精品成人综合 | 亚洲97视频| 黄色在线视频观看 | 免费看国产黄色 | 国产视频不卡 | 91在线精品一区二区 | 另类小说色| 日本中文字幕不卡 | 日韩高清精品免费观看 | 久久视频网 | 穿扒开跪着折磨屁股视频 | 亚洲欧美综合 | 亚洲成人伦理 | 国产精品免费无遮挡无码永久视频 | av色区| 操操操影院 | 免费a v在线 | 无码人妻少妇伦在线电影 | 欧美日韩午夜激情 | wwwsss在线观看 | 手机免费av | 日本中文字幕一区二区 | 精品99999 | 午夜三级在线 | 91免费版在线 | 丰满雪白极品少妇流白浆 | 午夜视频在线播放 | 99精品无码一区二区 | 91久久人澡人人添人人爽欧美 | 中文字字幕在线观看 | 色婷婷香蕉在线一区二区 | 国内成人在线 | 黑人巨大猛烈捣出白浆 |