Linux系统CH347应用—I2C功能

news2024/11/15 13:37:01

Linux/安卓系统使用CH347转接I2C功能有三种应用方式:

1. 使用CH34X_MPHSI_Master总线驱动为系统扩展原生I2C Master,此方式无需进行单独的应用层编程;

2. 使用CH341PAR_LINUX字符设备驱动,此方式需要配合使用厂商提供的库文件,编程访问设备功能;

3. 使用CH341PAR_ANDROID免驱APP,基于安卓原生USB Host API进行二次开发,此方式无需设备驱动;

基于方式一,可参考如下几篇博客:

https://blog.csdn.net/WCH_TechGroup/article/details/130093377在安卓/Linux主机上经常会遇到CPU原生SPI/I2C/GPIO Master资源通道不够或者功性能不满足实际产品需求的情况,基于USB2.0高速USB转接芯片CH347,配合厂商提供的USB转MPHSI(Multi Peripheral Serial Line)Master总线驱动(CH34X-MSPI-Master)可轻松实现为系统扩展SPI和I2C总线、GPIO Expander、中断信号等。_扩展spi芯片https://blog.csdn.net/WCH_TechGroup/article/details/130093377CH34X-MPHSI高速Master扩展应用—《i2c-tools使用》_PC技术小能手的博客-CSDN博客本文介绍,基于USB2.0高速USB转接芯片CH347,配合厂商提供的USB转MPHSI(Multi Protocol High-Speed Serial Interface)Master总线驱动(CH34X-MPHSI-Master)为系统扩展I2C总线的用法,除此之外,还可以扩展SPI总线和GPIO等资源。驱动软件正常工作后,会在系统下创建新的I2C Master,拥有独立的bus num,原I2C器件的设备驱动可直接挂载到该总线上,无需任何修改。https://blog.csdn.net/WCH_TechGroup/article/details/131538476CH34X-MPHSI高速Master扩展应用—I2C设备调试-CSDN博客本文介绍,基于USB2.0高速USB转接芯片CH347,配合厂商提供的USB转MPHSI(Multi Protocol High-Speed Serial Interface)Master总线驱动(CH34X-MPHSI-Master)为系统扩展I2C总线的用法,除此之外,还可以扩展SPI总线和GPIO等资源。驱动软件正常工作后,会在系统下创建新的I2C Master,拥有独立的bus num,原I2C器件的设备驱动可直接通过DTS配置文件或者sysfs节点挂载到该总线上,原有设备驱动无需任何修改。https://blog.csdn.net/WCH_TechGroup/article/details/133353169本篇博客仅对于方式二做重点介绍:

一、应用框图

二、资源列表

demo:应用软件示例

driver:驱动软件

lib:应用库文件,提供大部分CPU架构的动态库和静态库

三、工作原理

驱动软件正常工作时,会自动在系统/dev目录下创建字符设备,名称为:/dev/ch34x_pis*。基于此节点设备,配合 libch347 动态库,ch347demo应用程序实现对 CH347 芯片的硬件资源的访问。

此方式适用于不需要依赖于原有外设驱动工作的应用场景,使用字符设备实现对于外设的读写功能。类似于串口应用,通过访问 /dev/tty* 设备实现相应设备的:打开、关闭、读写等操作。

四、使用步骤

使用HID驱动模式,直接使用系统自带的 hidraw 驱动即可,使用厂商驱动模式,需要编译使用 CH341PAR_LINUX 资料中driver下的驱动文件,链接地址:

CH341PAR_LINUX.ZIP - 南京沁恒微电子股份有限公司USB转JTAG/SPI/I2C/并口/GPIO等接口的Linux设备驱动程序,支持CH341的USB转SPI/I2C/EPP并口/MEM并口等,支持CH347的480Mbps高速USB转JTAG/SPI/I2C/GPIO等,支持32/64位操作系统。icon-default.png?t=N7T8https://www.wch.cn/downloads/CH341PAR_LINUX_ZIP.htmlGitHub - WCHSoftGroup/ch341par_linuxContribute to WCHSoftGroup/ch341par_linux development by creating an account on GitHub.icon-default.png?t=N7T8https://github.com/WCHSoftGroup/ch341par_linux驱动使用流程如下:

 (1)驱动加载

1. unzip CH341PAR.ZIP
2. cd driver
3. sudo make install

插入CH347硬件设备,此时会自动在 /dev 目录下创建字符设备:ch34x_pis*,如下所示:

至此,代表驱动程序和芯片工作正常。

(2)拷贝库文件至系统库路径下,此处以X64 CPU的 ch347 动态库为例:

sudo cp lib/x64/dynamic/libch347.so /usr/lib

(3)应用编程

/**
 * CH347OpenDevice - open device
 * @pathname: device path in /dev directory
 *
 * The function return positive file descriptor if successful, others if fail.
 */
extern int CH347OpenDevice(const char *pathname);

/**
 * CH347CloseDevice - close device
 * @fd: file descriptor of device
 *
 * The function return true if successful, false if fail.
 */
extern bool CH347CloseDevice(int fd);

/**
 * CH347I2C_Set - configure i2c interface in stream mode
 * @fd: file descriptor of device
 * @iMode: stream mode
 * ->bit0~2: set I2C SCL rate
 * 			   --> 000 : low rate 20KHz
 * 			   --> 001 : standard rate 100KHz
 * 			   --> 010 : fast rate 400KHz
 * 			   --> 011 : high rate 750KHz
 * 			   --> 100 : rate 50KHz
 * 			   --> 101 : standard rate 200KHz
 * 			   --> 110 : fast rate 1MHz
 * other bits must keep 0
 *
 * The function return true if successful, false if fail.
 */
extern bool CH347I2C_Set(int fd, int iMode);

/**
 * CH347I2C_SetStretch - I2C Clock Stretch function control
 * @fd: file descriptor of device
 * @enable: I2C Clock Stretch enable, 1 : enable, 0 : disable
 *
 * The function return true if successful, false if fail.
 */
extern bool CH347I2C_SetStretch(int fd, bool enable);

/**
 * CH347I2C_SetDelaymS - delay operation
 * @fd: file descriptor of device
 * @iDelay: delay time in millseconds
 *
 * The function return true if successful, false if fail.
 */
extern bool CH347I2C_SetDelaymS(int fd, int iDelay);

/**
 * CH347StreamI2C - write/read i2c in stream mode
 * @fd: file descriptor of device
 * @iWriteLength: write length
 * @iWriteBuffer: pointer to write buffer
 * @iReadLength: read length
 * @oReadBuffer: pointer to read buffer
 *
 * The function return true if successful, false if fail.
 */
extern bool CH347StreamI2C(int fd, int iWriteLength, void *iWriteBuffer, int iReadLength, void *oReadBuffer);

/**
 * CH347StreamI2C_RetAck - write/read i2c in stream mode
 * @fd: file descriptor of device
 * @iWriteLength: write length
 * @iWriteBuffer: pointer to write buffer
 * @iReadLength: read length
 * @oReadBuffer: pointer to read buffer
 * @retAck: pointer to available ack count
 *
 * The function return true if successful, false if fail.
 */
extern bool CH347StreamI2C_RetAck(int fd, int iWriteLength, void *iWriteBuffer, int iReadLength, void *oReadBuffer,
				  int *retAck);

/**
 * CH347ReadEEPROM - read data from eeprom
 * @fd: file descriptor of device
 * @iEepromID: eeprom type
 * @iAddr: address of eeprom
 * @iLength: read length
 * @oBuffer: pointer to read buffer
 *
 * The function return true if successful, false if fail.
 */
extern bool CH347ReadEEPROM(int fd, EEPROM_TYPE iEepromID, int iAddr, int iLength, uint8_t *oBuffer);

/**
 * CH347WriteEEPROM - write data to eeprom
 * @fd: file descriptor of device
 * @iEepromID: eeprom type
 * @iAddr: address of eeprom
 * @iLength: write length
 * @iBuffer: pointer to write buffer
 *
 * The function return true if successful, false if fail.
 */
extern bool CH347WriteEEPROM(int fd, EEPROM_TYPE iEepromID, int iAddr, int iLength, uint8_t *iBuffer);

如上API接口函数,根据不同的业务场景可以选用不同的函数。

CH347StreamI2C: 适用于多字节的设备地址,或设备地址后紧跟寄存器地址,或连续的多字节读写。

CH347StreamI2C_RetAck:与CH347StreamI2C接口函数功能相同,区别在于参数上增加返回此次I2C通信的设备ACK个数。

CH347ReadEEPROM/CH347WriteEEPROM: 适用于直接操作EEPROM存储器件。

操作流程:

注:

1、CH347I2C_SetDelaymS 用于设定I2C读写多字节时,字节间的间隔时间,可用于操作对数据通讯字节间有间隔的设备,此API为可选项。

2、CH347I2C_SetStretch 用于启用/禁用I2C时钟延展功能,该API仅针对CH347T芯片有效,CH347F 默认硬件自动开启时钟延展,此API为可选项。

CH347StreamI2C 函数说明

iWriteLength:I2C Write的字节长度

iWriteBuffer:I2C Write的缓冲区内容,该缓冲区内容会经过SDA信号线对外输出。首字节地址通常是设备地址及读写位。如设备地址是0x50,I2C写操作时首字节为:0x50 << 1 = 0xA0,I2C读操作时首字节为:0x50 << 1 | BIT(0) = 0xA1。

iReadLength:I2C Read的字节长度

oReadBuffer:API成功返回后,其内容是从SDA信号线上采集的数据。

返回值:当设备成功产生ACK应答,并且应用层参数传递无误,API返回成功,否则失败。

示例1:EEPROM 24C256的设备地址是:0x50, 从其3200H开始的地址读取6字节的数据。

uint8_t OutBuf[3] = {0xA0, 0x32, 0x00};
uint8_ InBuf[6];

CH347StreamI2C(fd, 3, OutBuf, 6, inBuf);

 对应I2C总线时序如下:

示例2:EEPROM 24C256的设备地址是:0x50, 从其3200H开始的地址写入2个字节的数据,内容0x11,0x22。

uint8_t OutBuf[5];

OutBuf[0] = 0xA0;
OutBuf[1] = 0x32;
OutBuf[2] = 0x00;
OutBuf[3] = 0x11;
OutBuf[4] = 0x22;

CH347StreamI2C(fd, 5, OutBuf, 0, NULL);

 对应I2C总线时序如下:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1126009.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

数据要素安全流通:挑战与解决方案

文章目录 数据要素安全流通&#xff1a;挑战与解决方案一、引言二、数据要素安全流通的挑战数据泄露风险数据隐私保护数据跨境流动监管 三、解决方案加强数据安全防护措施实施数据隐私保护技术建立合规的数据跨境流动机制 四、数据安全流通的未来趋势01 数据价值与产业崛起02 多…

CUDA学习笔记(十四) Constant Memory

转载至https://www.cnblogs.com/1024incn/tag/CUDA/ CONSTANT MEMORY constant Memory对于device来说只读但是对于host是可读可写。constant Memory和global Memory一样都位于DRAM&#xff0c;并且有一个独立的on-chip cache&#xff0c;比直接从constant Memory读取要快得多…

iPhone开发--Xcode15下载iOS 17.0.1 Simulator Runtime失败解决方案

爆句粗口&#xff0c;升级后公司网络下载iOS 17.0.1 Simulator Runtime一直出错&#xff0c;每次出错后都得重新开始下载&#xff0c;oh&#xff0c;f**k。上一次在在家里的网络升级成功。 解决办法一&#xff1a; 进入网址&#xff1a;https://developer.apple.com/download…

【产品设计】B端SaaS产品原则

B端产品设计并不是一个人的事情&#xff0c;往往是一个团队共同完成的。在整个团队中&#xff0c;会涉及到四个环节&#xff1a;需求环节、设计环节、研发环节和运营环节。在这些环节中&#xff0c;需要遵循一些原则&#xff0c;共同推动整个产品建设。 本文针对产品的需求环节…

Pyside6 QMenuBar

Pyside6 QMenuBar QMenuBar使用QMenuBar常用函数QMenuBar常用信号QMenuBar添加菜单项QMenuBar添加图标QMenuBar添加菜单点击事件 Pyside6 QMenuBar类提供了一个水平菜单栏&#xff0c;更多关于QMenuBar的使用可以参考下面的文档。 https://doc.qt.io/qtforpython-6/PySide6/QtW…

Java中,如何在字符串后面补全空格

笔者在字符串有多个空格如何截取一文中写道了如何对字符串的多个空格进行截取&#xff0c;那么反过来&#xff0c;在调用三方接口&#xff0c;需要按照对方的报文格式&#xff0c;给左右的属性进行填充空格&#xff0c;以便对齐格式 例如这样&#xff1a; 那么我们应该怎么做…

《红蓝攻防对抗实战》六.常规反弹之利用NC在windows系统执行反弹shell

目录 一.利用NC工具在windows系统执行反弹shell 1. Windows正向连接shell 2.Windows反向连接shell 前文推荐&#xff1a; 《红蓝攻防对抗实战》一. 隧道穿透技术详解《红蓝攻防对抗实战》二.内网探测协议出网之TCP/UDP协议探测出网《红蓝攻防对抗实战》三.内网探测协议出网…

SpringBoot项目中使用MybatisPlus

MybatisPlus的优点 使用时注意事项: 首先需要在spring boot启动类中添加MapperScan注解&#xff0c;扫描Mapper文件夹。 并且在POM文件引入坐标的时候不要同时引入Mybatis和Mybatis-Plus的坐标。容易出现版本差异不兼容。 日志配置 由于SQL的执行是不可见的&#xff0c;所以…

高通平台USB 2.0和USB 3.0接口充电器识别原理

1 BC 1.2 1.1 充电器类型探测 1&#xff09;DCD&#xff1a;DP上有150mV&#xff08; 10uA x 15K欧姆下拉电阻&#xff09;的电压&#xff0c;DM上电压为0 2&#xff09;Primary Det&#xff08;DP发起检测DM&#xff09;&#xff1a; - DP上加载0.6V电压&#xff0c;DM上电压为…

Plonky2:最好的SNARKs和STARKs

1. 引言 Plonky2为Polygon团队2022年1月发起的项目。其定位为ZKP证明系统。 开源代码实现见&#xff1a; https://github.com/0xPolygonZero/plonky2&#xff08;Rust 汇编&#xff09; Plonky2可解锁当今2大主流ZKP类型——SNARKs和STARKs的扩容优势。 每个ZKP证明系统都有…

Selenium自动化测试中常见的异常详解

概要 开发人员在编写代码时总是会考虑到不同的应用场景&#xff0c;但也可能会出现实现效果不如预期的情况。同样的原则也适用于测试代码&#xff0c;编写测试代码的主要目的是测试现有产品的功能、发现错误并使产品100%无错误。 有句话说得好&#xff1a;"真相总是比小说…

SpringBoot使用@Value获取不到yaml中配置的值

在最近的开发中遇到一个问题,使用Value获取yml文件中配置的属性时始终获取不到值,一开始我以为是没有注入的问题,或者没有写setter方法的问题,后来我发现这些都都写了然后开始百度发现获取不到属性值有这么几个原因 获取不到值的原因 1.没有使用Component注解,也就是没有注入…

J2EE的N层体系结构

J2EE平台采用了多层分布式应用程序模型&#xff0c;实现不同逻辑功能的应用程序被封装到不同的构件中&#xff0c;处于不同层次的构件可被分别部署到不同的机器中。 RMI/IIOP&#xff1a;RMI&#xff08;Remote Method Invocation&#xff0c;远程方法调用&#xff09;是Java的…

Qt Signals Slots VS QEvents - Qt跨线程异步操作性能测试与选取建议

相关代码参考&#xff1a;https://gitcode.net/coloreaglestdio/qtcpp_demo/-/tree/master/qt_event_signal 1.问题的由来 在对 taskBus 进行低延迟改造时&#xff0c;避免滥用信号与槽起到了较好的作用。笔者在前一篇文章中&#xff0c;叙述了通过避免广播式地播发信号&…

HarmonyOS鸿蒙原生应用开发设计- HarmonyOS Sans 字体

HarmonyOS设计文档中&#xff0c;为大家提供了独特的字体&#xff0c;开发者可以根据需要直接引用。 开发者直接使用官方提供的字体内容&#xff0c;既可以符合HarmonyOS原生应用的开发上架运营规范&#xff0c;又可以防止使用别人的字体侵权意外情况等&#xff0c;减少自主创…

大模型:机器学习的崭新时代

原创 | 文 BFT机器人 在机器学习领域&#xff0c;随着计算能力和数据规模的不断增长&#xff0c;大模型成为一种引人注目的技术。这些具有大规模参数和参数量的机器学习模型正在改变着我们对于人工智能的认识&#xff0c;大模型的出现使得机器学习模型能够处理更复杂的任务&am…

看完这篇 教你玩转渗透测试靶机Vulnhub——Mr-Robot :1

Vulnhub靶机Mr-Robot :1渗透测试详解 Vulnhub靶机介绍&#xff1a;Vulnhub靶机下载&#xff1a;Vulnhub靶机安装&#xff1a;Vulnhub靶机漏洞详解&#xff1a;①&#xff1a;信息收集&#xff1a;②&#xff1a;暴力破解&#xff1a;③&#xff1a;登入后台GetShell&#xff1a…

docker入门加实战—项目部署之DockerCompose

docker入门加实战—项目部署之DockerCompose 我们部署一个简单的java项目&#xff0c;可能就包含3个容器&#xff1a; MySQLNginxJava项目 而稍微复杂的项目&#xff0c;其中还会有各种各样的其它中间件&#xff0c;需要部署的东西远不止3个。如果手动的逐一部署&#xff0c…

RTSP/Onvif安防平台EasyNVR接入EasyNVS,出现报错“Login error, i/o deadline reached”的解决方法

EasyNVS管理平台具备汇聚与管理EasyGBS、EasyNVR等平台的能力&#xff0c;可以将接入的视频资源实现视频能力统一输出&#xff0c;并能进行远程可视化运维等管理功能&#xff0c;还能解决设备现场没有固定公网IP却需要在公网直播的需求。 有用户反馈&#xff0c;RTSP/Onvif协议…

C语言用筛选法求 100 之内的素数(挖去 1,被除数平方根)

完整代码&#xff1a; // 用筛选法求 100 之内的素数&#xff08;挖去 1&#xff0c;被除数平方根&#xff09; //筛选法又称筛法&#xff0c;具体做法是&#xff1a;先把N个自然数按次序排列起来。1不是质数&#xff0c;也不是合数&#xff0c;要划去。第二个数2是质数留下来…