日韩性视频-久久久蜜桃-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福利站| 牛牛av在线 | 欧美熟妇另类久久久久久多毛 | 成人乱码一区二区三区av | aa视频网站 | 少妇高潮一区二区三区69 | 狠狠搞狠狠干 | 无码人妻丰满熟妇啪啪欧美 | 欧美久久久久久又粗又大 | 欧美日韩一级视频 | 亚洲AV无码成人精品一区 | 欧美午夜精品理论片a级按摩 | 国产精品99久久久久久人 | 99午夜| 中文字幕无线精品亚洲乱码一区 | 大尺度摸揉捏胸床戏视频 | 国产精品网址 | 最新中文字幕在线视频 | 白峰美羽在线播放 | 中文字幕亚洲综合 | 男女激情网 | 神马一区二区三区 | 日韩精品在线观看AV | 黑人黄色大片 | 亚洲精品美女视频 | 国产欧美一区二区三区视频 | 国产欧美不卡 | 黄色国产在线 | 在哪里可以看黄色片 | 亚洲成人av电影网站 | 亚洲国产精品99久久久久久久久 | 国产午夜精品一区二区三区四区 | 四虎精品永久在线 | 免费网站成人 | 农村少妇久久久久久久 | 福利社区一区二区 | 国产av无码专区亚洲a∨毛片 | 亚洲国产第一区 | 在线免费小电影 | 中文字幕第二页 | 理论黄色片| 国产一级片免费在线观看 | 中文字幕精品久久久 | 国产亚洲精品码 | 高h校园不许穿内裤h调教 | 亚洲免费av电影 | 免费啪| 高h视频在线免费观看 | 91在线看片| 一级黄色免费视频 | 制服丝袜在线一区 | 在线观看一二区 | 国产麻豆剧果冻传媒白晶晶 | 久久精工是国产品牌吗 | 精品少妇一区二区三区在线观看 | 欧美黑人猛交 | 国产成人综合久久 | 亚洲美女免费视频 | 欧美日韩另类在线 | 亚洲高清在线免费观看 | 亚洲成人黄色小说 | 丝袜 亚洲 另类 国产 制服 | 中文字幕激情小说 | 麻豆影视在线观看 | 蜜臀99久久精品久久久久小说 | av青娱乐| 中文字幕一区二区三区门四区五区 | 亚洲一区免费观看 | 黄色免费网站观看 | 国产精品免费av一区二区三区 | 十八岁世界在线观看高清免费韩剧 | 福利电影在线播放 | 欧美片17c07.com | 波多野结衣之潜藏淫欲 | 一区二区三区手机在线观看 | 免费一二三区 | 天天操天天干天天爱 | 国产欧美一区二区精品性色超碰 | a天堂资源在线 | 欧美日韩综合精品 | 免费国产一级 | 欧美精品一区视频 | 国产精品自产拍高潮在线观看 | 韩国三级免费 | aa在线视频 | 亚洲精品乱码久久久久久日本蜜臀 | 亚洲精品欧美精品 | 午夜一二三区 | 欧美日韩午夜 | 草草在线观看 | 国产女主播一区二区三区 | 国产特级av | 日日夜夜2017 | 青青草公开视频 | 精品久久久久久久久久久aⅴ | 深夜视频免费在线观看 |