CH341StreamI2C参数解释

news2025/6/10 1:31:19

总体思路:

第一步:使用EEPROM写入相应的数据 

第二步:使用EEPROM读取相应的数据

第三步:使用CH341StreamI2C函数还原读取过程

每一步需要逻辑分析仪进行对比。

第一步:数据写入CH341WriteEEPROM

使用CH341WriteEEPROM写入数据,操作界面如下图:

逻辑分析仪捕获波形:

 波形分析:

第一字节0x50对应24c16的地址(7位地址)(如果是8位地址对应的应该是0xA0)

第二字节0x00写地址

第3,4,5,6字节对应需要写入的数据。

第二步:数据读取CH341ReadEEPROM

使用CH341ReadEEPROM数据读取

此处多读取了一个字节(上面写入4个字节此处读取5个字节)操作界面如下

逻辑分析仪捕获波形

 波形分析

参考上面的波形分析,只是这里先写入了地址、寄存器地址、再读取地址,之后跟着数据。

注意此顺序在后续的CH341StreamI2C函数有对应关系。

第三步:使用CH341StreamI2C读取数据

使用CH341StreamI2C读取

使用CH341StreamI2C读取地址0xA0(8位地址,实际上是7位0x50地址运算后的值),寄存器地址0x02(此处不是从第0个寄存器读取),长度2对应的是数据长度

如果是那种寄存器地址需要2个字节的则此处长度应该修改位3(要给地址+两个寄存器地址)

逻辑分析仪捕获波形:

波形分析:

第一个字节对应写入长度的第一个字节(下图中蓝色部分)

第二个字节对应下图中蓝色部分

第三个字节对应的还是地址

也就是说读取时自动发送第一个写入字节作为地址。

后面的5个字节时读取的数据字节

此处对应的实际值下图中蓝色部分

使用举例读取LM75A的温度数据

实际读取效果

为了简化此处直接使用函数每个参数直接赋值的方式进行数据读取

使用的代码如下

关键设置点代码

            m_swrdatalen = "2";// this.textBox_I2CSWRLen.Text;//写数据长度
            m_srddatalen = "2";// this.textBox_I2CSRDLen.Text;//读数据长度
            m_swrdatabuf = "9000";// this.textBox_I2CSWRDATA.Text;//写数据内容

代码解释 

m_swrdatalen = "2"; 读取温度时需要写入的两个字节(地址(i2c元器件8位表示的地址),以及寄存器地址)

m_swrdatabuf = "9000" 写入波形的前两个字节。(一个器件地址,一个寄存器地址)

m_srddatalen = "2";  读取的数据长度

完整代码

完整代码如下:(此处只是对LM75的读取处理,对于设备初始化等信息,参考官方完整代码,此处只是对CH341StreamI2C函数的参数进行解释)


        private void button_ReadLM75A_Click(object sender, EventArgs e)
        {
            ReadLM75A();
        }

        public void ReadLM75A()
        {
            UInt32 mwlen = 0, mrlen = 0;
            UInt32 k = 0;
            UInt32 i = 0;
            byte[] wrdatabuf;
            byte[] mwBuf = new byte[CH341DLL.mMAX_BUFFER_LENGTH * 2];
            byte[] wbuffer = new byte[CH341DLL.mMAX_BUFFER_LENGTH];
            byte[] rbuffer = new byte[CH341DLL.mMAX_BUFFER_LENGTH];
            string m_swrdatalen, m_srddatalen, m_swrdatabuf, m_srddatabuf;

            m_swrdatalen = "2";// this.textBox_I2CSWRLen.Text;//写数据长度
            m_srddatalen = "2";// this.textBox_I2CSRDLen.Text;//读数据长度
            m_swrdatabuf = "9000";// this.textBox_I2CSWRDATA.Text;//写数据内容
            m_srddatabuf = "";//待读取的数据
            mwlen = mStrToBcd(m_swrdatalen); //写入数据长度
            mrlen = mStrToBcd(m_srddatalen); //读取数据长度
            if (mwlen == 0 && mrlen == 0)
            {
                MessageBox.Show("请输入长度", "CH341");
                return;
            }
            else if ((m_swrdatabuf.Length) == 0 && (mwlen > 0))
            {
                MessageBox.Show("请输入要写入的数据", "CH341");
                return;
            }
            else if (mrlen < 0)
            {
                MessageBox.Show("请输入读数据的长度", "CH341");
                return;
            }
            if (mwlen >= 0x400 || mrlen >= 0x400)
            {
                MessageBox.Show("请输入小于0x400的长度", "CH341");
                return;
            }
            if (mwlen > (m_swrdatabuf.Length) / 2)
                mwlen = Convert.ToUInt32((m_swrdatabuf.Length) / 2);//在输入长度和数据长度中取小值
            wrdatabuf = Encoding.Default.GetBytes(m_swrdatabuf);
            mem_cpy(mwBuf, 0, wrdatabuf, 0, mwlen * 2);
            mem_cpy(wbuffer, 0, mStrtoVal(mwBuf, mwlen * 2), 0, mwlen);
            if (m_open)
            {
                try
                {
                    if (!CH341DLL.CH341StreamI2C(mIndex, mwlen, wbuffer, mrlen, rbuffer))
                    {
                        this.textBox_I2CSWRLen.Text = k.ToString("x");
                        this.textBox_I2CSRDLen.Text = k.ToString("x");     //返回已读写的数据个数
                        MessageBox.Show("流模式读写数据失败!", "CH341");
                    }
                    else   //发送成功
                    {
                        //this.textBox_I2CSWRLen.Text = mwlen.ToString("x");
                        //this.textBox_I2CSRDLen.Text = mrlen.ToString("x");     //返回已读写的数据个数

                        log(" 读取成功 ");
                        log("写入数据长度 " + mwlen.ToString("x"));
                        log("读取数据长度 " + mrlen.ToString("x"));


                        for (i = 0; i < mrlen; i++)
                        {
                            m_srddatabuf += rbuffer[i].ToString("x2").ToUpper() + " ";//两位十六进制数加一个空格
                        }
                        //this.richTextBox_LM75A.Text = m_srddatabuf;
                        log(" 读取的16进制数据 "+m_srddatabuf);
                        log(" 读取的温度数据   "+(LM75A(rbuffer[0] * 256 + rbuffer[1])).ToString("f3")+ "℃");
                    }
                }
                catch (Exception e)
                {
                    MessageBox.Show(e.ToString());
                    return;
                }
            }
            else
            {
                MessageBox.Show("设备未打开!");
            }
        }

        private void log(string msg)
        {
            this.richTextBox_LM75A.AppendText("\r\n" + DateTime.Now.ToString("HH:mm:ss:fff") + " -> " +  msg);
        }

        private float LM75A(int zhi)
        {
            return (float)zhi / 32 * 5 / 4/10;

        }

LM75A读取波形

 一次读取的数据(蓝色部分)

本次读取对应的波形

总结:

对于CH341StreamI2C函数的数据读取时写入的字节也是需要设置的(对应设置元器件地址,以及寄存器地址)

 特此记录

anlog

2024年1月4日

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

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

相关文章

当AI遇见大脑:电脑与人脑协同“进化”

编者按&#xff1a;2023年是微软亚洲研究院建院25周年。借此机会&#xff0c;我们特别策划了“智启未来”系列文章&#xff0c;邀请到微软亚洲研究院不同研究领域的领军人物&#xff0c;以署名文章的形式分享他们对人工智能、计算机及其交叉学科领域的观点洞察及前沿展望。希望…

百度搜索金融:构建高时效、高可用的分布式数据传输系统

作者 | 搜索技术平台研发部 导读 分布式数据传输系统是一种用于在多个计算节点之间高效传输大量数据的系统&#xff0c;诣在高效的解决大规模数据迁移、备份、跨地域复制等问题&#xff0c;其广泛应用在实时数据流传输、跨数据中心数据迁移、多媒体传输等场景&#xff0c;在大多…

一文读懂$mash 通证的 “Fair Launch” 规则,将公平发挥极致

Solmash 是Solana生态中由社区主导的铭文资产LaunchPad平台&#xff0c;该平台旨在为Solana原生铭文项目&#xff0c;以及通过其合作伙伴SoBit跨链桥桥接到Solana的Bitcoin生态铭文项目提供更广泛的启动机会。有了Solmash&#xff0c;将会有更多的Solana生态的铭文项目、资产通…

【逗老师的无线电】ICOM IC-705终端模式Terminal Mode直连反射器配置-外置Pi-Star网关篇

各位友台大家好呀&#xff0c;逗老师最近整了一台IC-705&#xff0c;最吸引人的莫过于这玩意可以通过USB连接树莓派直接进行通联。下面简单介绍一下这个功能和其配置方法 一、功能 终端模式Terminal Mode允许IC-705电台作为终端直接连接反射器&#xff0c;基于不同的连接方式…

雍禾医疗以患者为中心 雍禾植发医生文志清专注做精每一台手术

随着生活方式的改变&#xff0c;晚睡、长期使用电子产品等原因让脱发成为消费者不可忽视的问题。有相关数据显示&#xff0c;76%消费者关注自己的头皮健康状况&#xff0c;53%的人群受到脱发困扰&#xff0c;已经有20%消费者认识到专业毛发医疗机构的重要性&#xff0c;选择到专…

MyBatis学习二:Mapper代理开发、配置文件完成增删改查、注解开发

前言 公司要求没办法&#xff0c;前端也要了解一下后端知识&#xff0c;这里记录一下自己的学习 学习教程&#xff1a;黑马mybatis教程全套视频教程&#xff0c;2天Mybatis框架从入门到精通 文档&#xff1a; https://mybatis.net.cn/index.html Mapper代理开发 目的 解决…

innovus:Patch Wire(补丁线)

我正在「拾陆楼」和朋友们讨论有趣的话题&#xff0c;你⼀起来吧&#xff1f; 拾陆楼知识星球入口 在修补一些min area的drc时&#xff0c;会有一些danling wire的drc冒出来&#xff0c;为了避免这些假错&#xff0c;可以使用工具patch wire功能。 1&#xff09;选中wire &…

linux centos 添加临时ip

### 1.添加ip ip addr add IP/mask dev 网络设备 例&#xff1a;ip addr add 172.104.210.247/24 dev ens5f1 ### 2.启动网卡 ip link set up 网络设备 例&#xff1a;ip link set up ens3f0 ### 3.设置默认路由 ip route add default via GATEWAY 例&#xff1a;ip route add …

关于MIPS上手应知应会-如何把C语言改写为MIPS!

文章目录 寄存器指令使用技巧翻译C/Cif/else语句switch语句for循环while 循环do...while循环一维数组定义与使用二维数组定义与使用例 &#xff1a;哈密顿回路 注意立即数被符号位扩展 参考链接 寄存器 NameReg. NumUsage z e r o zero zero0constant value 0(恒为0) a t at a…

图的遍历(搜索)算法(深度优先算法DFS和广度优先算法BFS)

一、图的遍历的定义&#xff1a; 从图的某个顶点出发访问遍图中所有顶点&#xff0c;且每个顶点仅被访问一次。&#xff08;连通图与非连通图&#xff09; 二、深度优先遍历&#xff08;DFS&#xff09;&#xff1b; 1、访问指定的起始顶点&#xff1b; 2、若当前访问的顶点…

SoapUI 怎么下载:实用指南

SoapUI Windows 版本下载 今天带大家过一遍 SoapUI 在 Windows 系统下的安装教程吧&#xff01;各位 开发小伙伴 们可以跟着我一起来~ 下载安装包 下载链接&#xff1a;www.soapui.org/downloads/s… 安装 安装非常简单&#xff0c;只需双击它即可启动&#xff0c;安装程序…

CSS效果(工作中常用)

1、css文字溢出省略号 overflow: hidden; // 溢出隐藏 text-overflow: ellipsis; // 溢出用省略号显示 white-space: nowrap; // 规定段落中的文本不进行换行 overflow: hidden; // 溢出隐藏 text-overflow: ellipsis; // 溢出用省略…

深入了解Python中的进程控制和监控技巧,提高系统稳定性

概要 在计算机系统中&#xff0c;进程管理是一个重要的任务&#xff0c;它涉及创建、启动、监控、终止和管理运行中的进程。Python作为一门强大的编程语言&#xff0c;提供了丰富的库和模块&#xff0c;使得进程管理变得相对容易。本文将介绍如何使用Python来实现系统进程管理…

MQTT基础下载使用

1.下载MQTT(MQTT官网) 下载完后在bin目录下启动cmd 控制台输入emqx start&#xff0c;注意&#xff0c;此时控制台是没有反应的&#xff0c;就回你个D&#xff1a;\EMQX。其实已经打开了。 打开桌面上的MQTTX 并新建连接 这是测试的数据 我订阅了一个test1的订阅 并且我发布…

chrome面向服务的架构SOA

chrome 浏览器面向服务的架构 原来的各种模块会被重构成独立的服务&#xff0c;每个服务都可以独在独立的进程中运行&#xff0c;可以在浏览器的任务管理器中看到各种服务。 "面向服务的架构"&#xff08;Service-Oriented Architecture&#xff0c;SOA&#xff09;…

解决mock单元测试中 无法获取实体类xxx对应的表名

错误描述&#xff1a;在执行单元测试时&#xff0c;执行到new Example时抛出异常&#xff0c;提示无法获取实体类xxx对应的表名 Example example new Example(ServeSubscribeRecord.class);Example.Criteria criteria example.createCriteria();criteria.andEqualTo("se…

一步到位:掌握Python中Lambda表达式的5种实用技巧

一步到位&#xff1a;掌握Python中Lambda表达式的5种实用技巧 引言技巧一&#xff1a;单行函数定义技巧二&#xff1a;与内置函数结合技巧三&#xff1a;在数据结构排序中的应用技巧四&#xff1a;作为回调函数技巧五&#xff1a;与函数式编程结合结语 引言 在Python编程的宇宙…

【unity小技巧】Unity音乐和音效管理器

最终效果 前言 在游戏开发中&#xff0c;音乐和音效的管理是一个重要的环节。好的音乐和合适的音效可以为游戏增添氛围并提升玩家的体验。为了更好地管理音乐和音效&#xff0c;我们可以使用一个专门的音乐和音效管理器。 在本文中&#xff0c;我将向大家介绍如何在Unity中创…

气缸功能块(SMART PLC梯形图代码)

有关气缸功能块的更多介绍,可以参考下面链接文章: https://rxxw-control.blog.csdn.net/article/details/125459568https://rxxw-control.blog.csdn.net/article/details/125459568CODESYS平台双通气缸功能块 https://rxxw-control.blog.csdn.net/article/details/12544822…

听GPT 讲Rust源代码--compiler(6)

File: rust/compiler/rustc_index/src/idx.rs 在Rust的源代码中&#xff0c;idx.rs文件位于rust/compiler/rustc_index/src/目录下&#xff0c;它定义了用于索引访问的Idx trait。以下是该文件的详细介绍&#xff1a; Idx是一个基本的整数索引类型&#xff0c;它用于支持Rust编…