当前位置: 首页 > article >正文

保姆级教程:在Ubuntu 22.04上使用CH347T扩展I2C总线(驱动编译+库文件配置)

保姆级教程在Ubuntu 22.04上使用CH347T扩展I2C总线驱动编译库文件配置最近在调试一块嵌入式开发板时发现树莓派的原生I2C接口不够用于是尝试用CH347T这款USB转接芯片来扩展I2C总线。折腾过程中踩了不少坑从驱动编译到库文件配置再到最后的I2C设备测试每一步都可能遇到意想不到的问题。本文将详细记录整个配置过程手把手带你完成CH347T在Ubuntu 22.04系统上的完整部署。1. 环境准备与驱动编译在开始之前我们需要准备好开发环境。Ubuntu 22.04已经内置了大部分必要的开发工具但还需要安装一些额外的依赖包。首先更新软件包列表并安装编译工具链sudo apt update sudo apt install build-essential git libusb-1.0-0-dev接下来从WCH官网下载CH347T的Linux驱动源码包。这个驱动支持多种接口模式我们需要的是I2C功能wget https://www.wch.cn/downloads/CH341PAR_LINUX_ZIP.html -O CH341PAR_LINUX.zip unzip CH341PAR_LINUX.zip进入驱动目录后编译过程看似简单但有几个关键点需要注意cd CH341PAR_LINUX/driver make sudo make install常见编译问题处理如果遇到找不到内核头文件错误需要安装对应版本的头文件sudo apt install linux-headers-$(uname -r)出现隐式函数声明警告时可以忽略不影响功能64位系统可能需要手动指定架构make ARCHx86_64驱动安装成功后插入CH347T设备系统会自动加载模块。检查设备是否识别ls /dev/ch34x_pis*如果看到类似/dev/ch34x_pis0的设备节点说明驱动加载成功。2. 库文件部署与路径配置驱动工作正常后还需要部署配套的库文件才能进行应用开发。WCH提供的库文件支持多种架构我们需要根据系统类型选择正确的版本。库文件位于解压后的lib目录下结构如下lib/ ├── arm64/ │ ├── dynamic/ │ └── static/ ├── x64/ │ ├── dynamic/ │ └── static/ └── x86/ ├── dynamic/ └── static/对于大多数现代PC应该使用x64架构的动态库sudo cp lib/x64/dynamic/libch347.so /usr/lib/ sudo ldconfig库文件配置常见问题问题现象解决方案程序运行时提示libch347.so: cannot open shared object file检查库文件路径是否正确执行sudo ldconfig更新缓存版本不兼容错误确认系统架构与库文件匹配64位系统使用x64版本权限问题使用sudo复制文件确保/usr/lib可写为了验证库文件是否正确加载可以运行简单的测试程序#include stdio.h #include ch347.h int main() { int fd CH347OpenDevice(/dev/ch34x_pis0); if(fd 0) { printf(Device opened successfully\n); CH347CloseDevice(fd); } return 0; }编译测试程序gcc test.c -o test -lch347 ./test3. I2C总线配置与测试库文件部署完成后就可以开始配置I2C总线了。CH347T支持多种I2C速率从标准模式(100kHz)到高速模式(1MHz)都可以选择。首先使用i2c-tools工具包来检测总线sudo apt install i2c-tools加载I2C核心模块并扫描设备sudo modprobe i2c-dev i2cdetect -lCH347T设备应该会出现在列表中通常显示为i2c-数字的形式。记下这个总线编号用于后续操作。I2C速率配置示例#include ch347.h int main() { int fd CH347OpenDevice(/dev/ch34x_pis0); if(fd 0) return -1; // 设置I2C速率为400kHz CH347I2C_Set(fd, 0x02); // 启用时钟延展(CH347T特有功能) CH347I2C_SetStretch(fd, 1); CH347CloseDevice(fd); return 0; }实际测试I2C通信时可以使用一个常见的I2C设备比如24C系列EEPROM。下面是一个完整的读写示例#include stdio.h #include stdint.h #include ch347.h #define EEPROM_ADDR 0x50 int main() { int fd CH347OpenDevice(/dev/ch34x_pis0); if(fd 0) { perror(Failed to open device); return -1; } // 配置I2C参数 CH347I2C_Set(fd, 0x02); // 400kHz // 写入数据到EEPROM uint8_t write_buf[5] { 0xA0, // 设备地址 写标志 0x00, 0x20, // 内存地址 0xAA, 0xBB // 测试数据 }; if(!CH347StreamI2C(fd, sizeof(write_buf), write_buf, 0, NULL)) { printf(Write failed\n); } // 等待EEPROM完成写入 usleep(5000); // 从EEPROM读取数据 uint8_t read_cmd[3] {0xA0, 0x00, 0x20}; // 写地址 uint8_t read_data[2] {0}; if(!CH347StreamI2C(fd, sizeof(read_cmd), read_cmd, sizeof(read_data), read_data)) { printf(Read failed\n); } else { printf(Read data: 0x%02X 0x%02X\n, read_data[0], read_data[1]); } CH347CloseDevice(fd); return 0; }4. 高级应用与性能优化当基本功能测试通过后可以考虑一些高级应用场景和性能优化措施。多设备管理 CH347T支持同时管理多个I2C设备只需要为每个设备分配独立的文件描述符int fd1 CH347OpenDevice(/dev/ch34x_pis0); int fd2 CH347OpenDevice(/dev/ch34x_pis0); // 同一个物理设备的不同句柄 // 可以分别配置不同的I2C参数 CH347I2C_Set(fd1, 0x02); // 400kHz CH347I2C_Set(fd2, 0x01); // 100kHz批量传输优化 对于大量数据传输合理设置延迟参数可以提高稳定性// 设置字节间延迟为100us CH347I2C_SetDelaymS(fd, 0.1);错误处理与重试机制 在实际应用中应该添加完善的错误处理#define MAX_RETRY 3 int retry 0; bool success false; while(retry MAX_RETRY !success) { success CH347StreamI2C(fd, write_len, write_buf, read_len, read_buf); if(!success) { retry; usleep(1000); // 延迟1ms后重试 } }性能对比测试 下表展示了不同I2C速率下的实际传输性能配置速率实测速率稳定性100kHz98kHz非常好400kHz380kHz好750kHz680kHz一般1MHz900kHz较差对于大多数应用400kHz是一个比较平衡的选择既能提供足够的带宽又能保持良好的稳定性。5. 实际项目集成建议将CH347T集成到实际项目中时有几个实用建议可以避免常见问题1. 设备热插拔处理 Linux系统中USB设备可以热插拔但应用程序需要正确处理设备断开和重连的情况。建议实现一个监控线程定期检查设备状态#include sys/stat.h bool device_exists(const char *path) { struct stat buffer; return (stat(path, buffer) 0); } // 在独立线程中运行 void *monitor_thread(void *arg) { while(1) { if(!device_exists(/dev/ch34x_pis0)) { printf(Device disconnected\n); // 执行清理操作 } sleep(1); } return NULL; }2. 多线程安全 CH347库函数本身不是线程安全的如果需要在多线程环境中使用应该添加互斥锁#include pthread.h pthread_mutex_t i2c_mutex PTHREAD_MUTEX_INITIALIZER; void safe_i2c_operation() { pthread_mutex_lock(i2c_mutex); // 调用CH347函数 pthread_mutex_unlock(i2c_mutex); }3. 电源管理 长时间不使用时可以关闭设备以节省功耗// 进入低功耗模式 CH347I2C_Set(fd, 0x00); // 最低速率 CH347I2C_SetStretch(fd, 0); // 禁用时钟延展 // 恢复工作 CH347I2C_Set(fd, 0x02); // 恢复原速率 CH347I2C_SetStretch(fd, 1);4. 日志记录 调试阶段建议记录详细的通信日志void log_i2c_transaction(uint8_t *data, int len, bool is_write) { FILE *log fopen(i2c.log, a); if(log) { fprintf(log, [%s] , is_write ? WRITE : READ); for(int i 0; i len; i) { fprintf(log, %02X , data[i]); } fprintf(log, \n); fclose(log); } }在实际项目中我发现最稳定的配置是400kHz速率启用时钟延展这种组合在各种环境测试中表现最为可靠。对于时序要求严格的外设可以适当增加字节间延迟参数。

相关文章:

保姆级教程:在Ubuntu 22.04上使用CH347T扩展I2C总线(驱动编译+库文件配置)

保姆级教程:在Ubuntu 22.04上使用CH347T扩展I2C总线(驱动编译库文件配置) 最近在调试一块嵌入式开发板时,发现树莓派的原生I2C接口不够用,于是尝试用CH347T这款USB转接芯片来扩展I2C总线。折腾过程中踩了不少坑&#x…...

Visual C++运行库一键修复终极方案:告别DLL缺失与程序启动失败

Visual C运行库一键修复终极方案:告别DLL缺失与程序启动失败 【免费下载链接】vcredist AIO Repack for latest Microsoft Visual C Redistributable Runtimes 项目地址: https://gitcode.com/gh_mirrors/vc/vcredist Visual C运行库是Windows系统运行C程序的…...

SpringBoot项目里那些不起眼的路径匹配规则,你真的用对了吗?

SpringBoot路径匹配的深度实践:从Ant规则到安全防御 在SpringBoot项目中,路径匹配就像空气一样无处不在却又容易被忽视。直到某天深夜,我被紧急电话惊醒——生产环境出现严重的安全漏洞,攻击者通过精心构造的URL绕过了权限验证。排…...

LRC Maker:现代Web技术构建的专业歌词制作解决方案

LRC Maker:现代Web技术构建的专业歌词制作解决方案 【免费下载链接】lrc-maker 歌词滚动姬|可能是你所能见到的最好用的歌词制作工具 项目地址: https://gitcode.com/gh_mirrors/lr/lrc-maker 在数字音乐时代,歌词文件的质量直接影响着…...

告别翻找!用Keil MDK的User配置和批处理脚本,一键把Hex/Bin文件归集到指定文件夹

嵌入式开发者的文件管理革命:Keil MDK自动化归档方案深度解析 每次编译完STM32工程后,你是否也经历过在Objects文件夹里大海捞针般寻找Hex和Bin文件的痛苦?作为一名长期使用Keil MDK的嵌入式开发者,我完全理解这种低效操作带来的挫…...

从数据到洞察:使用Python自动化完成问卷量表的信效度评估与因子探索

1. 为什么需要自动化问卷分析? 做问卷研究的朋友应该都深有体会,每次收集完数据最头疼的就是各种统计检验。传统做法是用SPSS一个个点菜单,不仅效率低,还容易出错。我刚开始做研究时就经常遇到这种情况:好不容易跑完信…...

别再为CANoe工程配置发愁了!手把手教你从零搭建一个真实的2路CAN总线仿真环境(附DBC文件加载技巧)

从零构建2路CAN总线仿真环境:CANoe实战避坑指南 当第一次打开Vector CANoe软件时,许多工程师会被复杂的界面和配置选项所困扰。特别是当需要搭建一个真实的2路CAN总线仿真环境时,从License检查到DBC文件加载的每个环节都可能成为新手的技术陷…...

别再死记硬背!用Python实战演练《软件工程导论》课后习题(详细设计篇)

用Python实战演练《软件工程导论》详细设计习题 当翻开《软件工程导论》的详细设计章节,那些抽象的控制结构转换题是否让你感到无从下手?本文将带你用Python代码重新演绎经典课后习题,让枯燥的理论在编程实践中变得生动可感。我们不仅会实现S…...

打卡信奥刷题(3144)用C++实现信奥题 P7646 [COCI 2012/2013 #5] HIPERCIJEVI

P7646 [COCI 2012/2013 #5] HIPERCIJEVI 题目描述 在遥远的星系中,最快的运输方式是超级管道,它们将 KKK 个站台连接在一起。从站台 111 到达站台 NNN 最少需要经过多少个站台? 输入格式 第一行,三个整数 N,K,MN,K,MN,K,M,分…...

为什么你的虚拟线程比线程池还慢?——反模式TOP 9曝光(第4种正在 silently 拖垮K8s Pod内存)

第一章:Java 25虚拟线程高并发实践面试综述Java 25正式将虚拟线程(Virtual Threads)从预览特性转为标准特性,标志着JVM高并发编程范式的重大演进。相比传统平台线程,虚拟线程由JVM轻量级调度,可轻松创建百万…...

Qwen3.5-9B-GGUF应用案例:研发团队API文档智能生成实测

Qwen3.5-9B-GGUF应用案例:研发团队API文档智能生成实测 1. 项目背景与技术特点 Qwen3.5-9B-GGUF是基于阿里云开源的Qwen3.5-9B模型经过GGUF格式量化后的轻量级版本。这个90亿参数的稠密模型采用了创新的Gated Delta Networks架构和混合注意力机制(75%线性…...

SQLite Viewer终极指南:在浏览器中直接查看和管理SQLite数据库的完整解决方案

SQLite Viewer终极指南:在浏览器中直接查看和管理SQLite数据库的完整解决方案 【免费下载链接】sqlite-viewer View SQLite file online 项目地址: https://gitcode.com/gh_mirrors/sq/sqlite-viewer 你是否曾为查看SQLite数据库文件而烦恼?需要安…...

如何快速搭建CSDN Bot

要建立一个功能完整的 CSDN Bot,通常有两种主要路径:一是使用官方或社区提供的集成工具(如 OpenClaw/WinClaw)进行快速对接,这属于应用层部署;二是从零开始进行底层开发,通过调用 CSDN 的开放 A…...

3步精准配置:解锁NVIDIA驱动隐藏性能层

3步精准配置:解锁NVIDIA驱动隐藏性能层 【免费下载链接】nvidiaProfileInspector 项目地址: https://gitcode.com/gh_mirrors/nv/nvidiaProfileInspector 显卡性能调优工具NVIDIA Profile Inspector为技术爱好者提供了深度访问NVIDIA驱动内部数据库的能力&a…...

具身智能迎数据元年

每日AI新闻推送:近24小时科技前沿深度报告 时间范围:2026年4月19日 - 4月20日 核心领域:具身智能、机器人、芯片、大模型与应用 一、具身智能:数据基建成为新战场,行业迈入“数据元年” 1. 具身智能“数据元年”启幕…...

保姆级教程:用MQTTX和Node-RED搭建你的第一个物联网中控台(ESP32 + Blinker实战)

从零构建物联网中控台:MQTTXNode-REDESP32全链路实战 当你的智能家居设备超过5个时,是否经常遇到这些困扰?手机里装着七八个控制APP,温湿度传感器数据散落在不同平台,设备联动需要反复切换应用… 这正是我们需要构建本…...

如何高效获取全网热门资源:Res-Downloader资源嗅探下载器全面指南

如何高效获取全网热门资源:Res-Downloader资源嗅探下载器全面指南 【免费下载链接】res-downloader 视频号、小程序、抖音、快手、小红书、直播流、m3u8、酷狗、QQ音乐等常见网络资源下载! 项目地址: https://gitcode.com/GitHub_Trending/re/res-downloader …...

ComfyUI-SUPIR图像超分实战指南:从模糊到高清的完整解决方案

ComfyUI-SUPIR图像超分实战指南:从模糊到高清的完整解决方案 【免费下载链接】ComfyUI-SUPIR SUPIR upscaling wrapper for ComfyUI 项目地址: https://gitcode.com/gh_mirrors/co/ComfyUI-SUPIR ComfyUI-SUPIR是一款基于扩散模型的图像超分辨率插件&#xf…...

Python连接openGauss避坑实录:从Docker环境变量到psycopg2事务管理的完整流程

Python连接openGauss实战指南:从Docker部署到事务管理的全流程解析 当开发者决定在项目中采用openGauss这款企业级开源数据库时,Python作为最流行的编程语言之一,自然成为首选的交互工具。但在实际开发中,从环境搭建到代码实现&am…...

从Nginx Ingress迁移到Istio Gateway:一份避坑指南与完整YAML配置清单

从Nginx Ingress迁移到Istio Gateway:一份避坑指南与完整YAML配置清单 当业务发展到需要金丝雀发布、流量治理等高级功能时,许多团队会面临从Nginx Ingress迁移到Istio Gateway的挑战。本文将提供一份完整的迁移指南,帮助您规避常见陷阱&…...

告别Option键!在MacBook Pro 2015上,用rEFInd打造macOS与Ubuntu 20.04的无缝双系统切换

优雅双系统:用rEFInd为MacBook Pro 2015打造无缝切换体验 每次开机都要按住Option键选择系统?默认的启动菜单简陋又难用?作为同时需要macOS生产力与Ubuntu开发环境的用户,我花了三个月时间折腾出这套完美方案。本文将分享如何通过…...

从Qt信号槽的5种连接方式,聊聊Qt::QueuedConnection的设计哲学与适用场景

Qt信号槽的5种连接方式深度解析:从设计哲学到实战选择 在Qt框架中,信号与槽机制是其最引以为傲的核心特性之一。这种优雅的事件处理方式不仅简化了对象间的通信,更为多线程编程提供了安全可靠的解决方案。但你是否真正理解信号槽背后五种连接…...

智读造用|《一人企业》1 :OPC靠这四个特征在大公司的缝隙里活得更好

系列:《一人企业》读书笔记 第1篇 书名:《一人企业:一个人也能赚钱的商业新模式》 作者:保罗贾维斯(Paul Jarvis) 大公司有钱、有人、有品牌,为什么反而在某些市场里追不上OPC公司?…...

手把手教你用网线给imx6ull开发板共享网络(Windows 10/11保姆级教程)

从零搭建imx6ull开发板网络环境:Windows有线共享全攻略 刚拿到imx6ull开发板时,最让人头疼的问题莫过于网络连接。实验室没有现成的路由器?宿舍WiFi信号不稳定?别担心,一根网线就能解决所有问题。本文将带你用最经济的…...

ZTools(效率工具)

链接:https://pan.quark.cn/s/add40d5ba361ZTools 是一款高性能、可扩展的跨平台应用启动器和插件平台,是知名效率工具 uTools 的开源实现版本。它采用现代化的技术栈构建,旨在为用户提供极速的桌面应用启动体验和强大的插件扩展能力。快速启…...

使用Qwen3-14B-AWQ模型自动化处理Excel数据:模拟VLOOKUP与复杂公式生成

使用Qwen3-14B-AWQ模型自动化处理Excel数据:模拟VLOOKUP与复杂公式生成 1. 引言:Excel数据处理的新思路 每天面对成堆的Excel表格,你是不是也经常为VLOOKUP跨表匹配、复杂公式编写而头疼?业务人员最熟悉的场景莫过于&#xff1a…...

Qianfan-OCR效果实测:印刷体+手写体混合比例从10%到90%的识别稳定性验证

Qianfan-OCR效果实测:印刷体手写体混合比例从10%到90%的识别稳定性验证 1. 测试背景与目标 在现实文档处理场景中,印刷体与手写体混合的情况非常普遍。本次测试旨在验证Qianfan-OCR在不同混合比例下的识别稳定性,为实际应用提供数据参考。 …...

如何用Meshroom将普通照片变成专业3D模型:从零开始的完整指南

如何用Meshroom将普通照片变成专业3D模型:从零开始的完整指南 【免费下载链接】Meshroom Node-based Visual Programming Toolbox 项目地址: https://gitcode.com/gh_mirrors/me/Meshroom 你是否曾想过,用手机拍摄的日常照片就能创建出令人惊叹的…...

Harepacker-resurrected终极指南:深度解析MapleStory游戏资源编辑全流程

Harepacker-resurrected终极指南:深度解析MapleStory游戏资源编辑全流程 【免费下载链接】Harepacker-resurrected All in one .wz file/map editor for MapleStory game files 项目地址: https://gitcode.com/gh_mirrors/ha/Harepacker-resurrected Harepac…...

医学影像分割新宠UNet 3+:从论文到落地,我是如何用它提升肝脏分割Dice系数的

UNet 3在肝脏CT分割中的实战优化:从数据增强到模型轻量化的完整闭环 当我在三甲医院放射科第一次看到医生手动勾画肝脏肿瘤轮廓时,那个下午改变了我对医学影像分割的认知。主治医师需要花费40分钟在单张CT切片上精确标注病灶区域,而一个典型病…...