小白的Python入门之访问CH341的I2C

抱歉我不会写优快云的博客,图片上传和序号排列搞不来。如果您想看图文并茂的pdf原文,请电邮14518918@qq.com。

如下是程序界面:

最近听到一个新概念单词“技术平权”,即AI的出现,让技术平权成为可能,足矣把固步自封不愿分享技术的卷王们扔进历史的垃圾堆。我这七天的Python入门之旅,在很大程度上确实受益于运行在PC上的嵌入在有道词典软件里的DeepSeek的谆谆教诲,但有的细节我还是只有找到苟大师亲自看了代码指点一二才解决的问题。所以AI要取代人类去服务一个具体的情绪化的人,目前看来可行度还不高,但AI辅助打野是100%称职的。

经过最近三天连续学习,我浅尝了Python原装的Tkinter编程,并在“Tkinter布局助手”的帮助下逐渐充实GUI界面,实现了高交互性的图形界面,可通过CH341读写EEPROM了。

就编程体验而言,我感觉Python编程主要靠键盘,适合敲命令行的黑客;而CVI编程就可以考鼠标,方便快捷地工程实现。两者之间最大的差异是,Python的界面是界面,源码是源码,不能相互跳转,这一点Python和Qt类似,相比CVI的界面控件可以右键直接跳转到回调函数或回调函数右键直接跳转到界面控件的易用性,就差了十万八千里,用户体验较差,导致用户需要自行在源码里面搜索文本很是不便。所以我的肤浅结论是:Python基于Tkinter的图形化界面编程,跟CVI的图形化编程相比,那是大相径庭。

用Python,请务必保持十足的耐心。因为Python语言的发明者,我以最大的恶意揣测,估计他是想着假设来一场核爆,退回到鼠标都没发明前的上个世纪中叶,他的Python都还可以通过只敲键盘就可以直接使用。所以就图形界面而言,是Python的一个很小的副业,有没有都无所谓。完全不像上个世纪末备受推崇又风靡一时的“所见即所得”的VC/VB,几乎是以用户图形界面为核心做开发,所以显然地,控件和代码是可以直接相互跳转定位的。反观Python,控件和代码,就是完全质壁分离的,中间还有层半透膜,只允许界面生成代码,不允许代码跳转定位到控件上。我猜,正是这一点,可能是为什么Python多用于脚本开发,而鲜用于图形界面编程的主要原因吧?苟大师指出,不跳转影响也不是很大,只要在设计界面的时候,把控件的名字取得比较明显就好了,这样通过名字就知道是哪个控件。道理是这个道理,但这就要求程序员,控件名及其回调函数名,都要精心设计,才容易通过关键词被搜索到。

注意到,Python是用严格的缩进(而不是C语言的花括号)来表征代码层次的。我有个函数的def,本来应该是左侧顶格的,但不小心在前面加了一个空格,IDE就老报错,而且报错提示的红色波浪线位置,不是在函数首行的def这里,而是在函数结尾的return这里。坑了我足足十分钟才发现问题。还有tab和空格混用,几乎都是肉眼难以分辨的东西,但IDE就会画红色波浪线,都可以把我拦住硬生生花半小时来解决问题。可见,Python编程本身并不难,但好多细枝末节的节外生枝,会干扰我们前进的步伐。都不说应该先熟悉Python语法了,单就是对PyCharm这个IDE的熟练应用,都是要花点时间的。比如最开始我装的是PyCharm官网首页挂着的Professional版本,只有30天试用期,我破解不来还被百度引流到好多二货网站去付费。后来才知道别人有个社区版,还是免费的。

学习Python的过程,就像沉浸式电竞里的打怪升级,虽路途坎坷,但其乐无穷!

下载截止2025-3官网上最新Python 3.13.0-amd64 for Windows版本:

https://www.python.org/ftp/python/3.13.0/python-3.13.0-amd64.exe

推荐安装稍早一点的成熟版本3.11.9,方便适配“Tkinter布局助手”做图形化界面设计:

https://www.python.org/ftp/python/3.11.9/python-3.11.9-amd64.exe

注意,安装Python解释器时,务必请勾选:

但有时即使勾选了“Add python.exe to PATH”,也会发现安装完毕之后,Win+R启动CMD控制台黑窗后输入python,也会报错找不到python.exe,或输入pip也会报错找不到pip.exe,这时就需要用户手动添加系统路径。打开windows的设置-编辑系统环境变量-环境变量页面,新建一个path,把3.11的phthon.exe所在安装目录比如“D:\python311”添加进去,把pip.exe所在安装目录比如“D:\python311\Sctripts”添加进去。完了重启新path才能生效。很多小白死在了这一步,窝火得很。

注意,安装时推荐不要默认安装在C盘users一个很深的目录,简单点好些,强烈推荐选customized模式,安装到自定义的D:\Python311就好。

  • 来个Python集成编译环境

当下最流行的Python IDE似乎是PyCharm,还有免费社区版可用。

  1. 下载PyCharm Community(免费社区版)

感谢您下载 PyCharm Community Edition!

  1. 配置PyCharm

配置Python解释器。

如果先安装了python3.13然后安装PyCharm并跑了一个项目,因为后面有些插件在最新版3.13上pip install失败要卸载再安装低版本的3.11。然后在PyCharm中跑老项目就会报错:“连接Python调试器失败”。这就要求用户在PyCharm中重新指定python解释器,菜单File > Settings > Project: [项目名] > Python Interpreter,重新选择一个Python解释器,就OK了。

配置界面主体色彩。

点击右上角的螺母图标,进入设置窗口,在外观—主题,选Light with Light Header,我还是习惯白底黑字的IDE一些。

配置编辑器中字体大小。

使用快捷键<Alt + Shift + “+/-”>。

我是在菜单:文件-设置-按键映射-编辑器操作中找到的。而且在设置的搜索栏,输入“字体”是找不到的,只有输入英文“font”,才找得到这个快捷键:

配置编辑器中空格显示成灰点。

菜单:文件-设置-编辑器-外观,勾选“显示空格”,这样用户就可以看到灰点状的空格了。

配置编辑器中Tab键改成4个空格。

注意,Tab和空格切勿混用,尤其是Python这种依靠严格缩进来分层的语言,请在PyCharm IDE中务必禁用Tab。点击菜单:文件-设置-编辑器-代码样式-Python,不勾选“使用制表符”。这样即使用户按下Tab,也只会多出来4个空格而不是制表符。

  1. 新建项目,勾选“创建欢迎脚本”

  1. 在第14行插入一个断点使行标变红,然后点击虫子(即debug)图标,进入调试模式:

  1. 点击单步执行我的代码图标,或按下快捷键<Alt+Shift+F7>,即可单步执行该行代码了。完了按快捷键<F9>恢复运行。但我按下<F8>并不能StepOver,也许和其他什么软件冲突了。注意PyCharm有一点很强,单步调试了一段代码之后,可以在代码后面有一行灰字直接显示返回值:

  1. 运行完毕,应该能在控制台看到打印出来的欢迎条幅,“Hi, PyCharm”。

  • 基于CH341的DLL访问EEPROM

时隔多年之后,我再一次用Python语言通过CH341读出了光模块的EEPROM的A0[00..07]数据。恨只恨自己以前没拜在杨大师门下,还没备份源码,也没做详细笔记,所以我的大脑(99%应该是易失性存储器)中对Python是一片空白。此番从零开始,经过密集咨询苟大师和DeepSeek,才走到今天这一步,可谓临表涕零,不胜唏嘘啊。

py源码和DLL、h文件如附件:

有必要再简要说明一下代码,Python对从零起步的小白而言还是有很多坑的。

  1. 声明必要的支持性模块

其实在你写Python代码时,PyCharm会在你写到特定代码时,自动问你要不要import某个模块并添加声明的。

这是一个示例 Python 脚本。

import ctypes   #可直接调用C语言编写的动态链接库中的函数,并操作C语言数据类型

import os       #与操作系统交互(文件、进程、目录等)

import sys      #Python解释器交互(版本、路径、流等)

import platform #获取系统硬件和运行环境的详细信息

  1. 加载DLL文件

注意CH341DLL.DLL、CH341DLLA64.DLL文件和mian.py文件同在一个文件夹。

这里是先用os.path.dirname()获取当前文件夹路径;再用platform.architecture()[0]来判断python解释器是64位还是32位的从而得到DLL文件名dll_name,因为将调用的DLL的位数也必须得对上否则会报错;完了用os.path.join()函数整合dirname+ dll_name得到DLL文件的绝对地址dll_path;最后用ctypes.WinDLL(dll_path)实现DLL的加载。

当然因为DLL和py同处一室,是可以用相对地址的,比如:

dll_path1 = r'.\CH341DLLA64.DLL',

注意相对地址字符串的前缀“.\”不能少,不然IDE会报找不到文件。

注意这里还有一个“r”前缀,是为了避免路径字符串出现转义符出现解释冲突,比如“\note”的“\n”就是换行符,有了“r”做前缀解释器就不会迷糊了。

获取脚本所在目录

script_dir = os.path.dirname(os.path.abspath(__file__))

获取当前文件夹路径,并根据python解释器位数来动态选择对应位数的DLL

if platform.architecture()[0]== '64bit':

    dll_name = 'CH341DLLA64.DLL'

else:

    dll_name = 'CH341DLL.DLL'

dll_path = os.path.join(script_dir, dll_name)

#dll路径采用相对地址,需带上".\"前缀避免找不到当前文件夹下的dll文件

dll_path1 = r'.\CH341DLLA64.DLL'

try:

    ch341_dll = ctypes.WinDLL(dll_path)

    #ch341_dll = ctypes.WinDLL(dll_path1)

    #ch341_dll = ctypes.cdll.LoadLibrary(dll_path1)

    print("\n%s加载成功,Verion=%d" %(dll_name, ch341_dll.CH341GetVersion()))

except Exception as e:

    print(f"\nDLL 加载失败: {e}")

  1. 打开CH341设备、读取EEPROM的A0从机8Byte数据、关闭CH341设备

此刻必须参考CH341DLL.h头文件,实际上就是调用三个函数,分别是CH341OpenDevice()、ch341_dll.CH341StreamI2C()和CH341CloseDevice()。

关于CH341DLL的使用方法,更详细内容请参考《CH341DLL的调用方法 202501014》。下面的代码仅实现了I2C主机随机读A0[00..07]的功能。

注意,定义无符号数8bit数据类型的数组,不能用array模块,要用ctypes.c_ubyte,而且清零数组最高效的就是用memset。

最后在主程序中可用sys.exit(0)退出程序,在函数中才能用return退出函数。

打开设备(假设设备索引为0

device_index = 0

status = ch341_dll.CH341OpenDevice(device_index)

if (-1 == status):

    print("NG#%d设备未连接" %device_index)

    sys.exit(-1)

else:

    print("OK#%d设备已连接" %device_index)

定义整数数组

oReadBuffer = (ctypes.c_ubyte*300)()

ctypes.memset(oReadBuffer, 0x00, len(oReadBuffer))

iWriteBuffer = (ctypes.c_ubyte*300)()

ctypes.memset(iWriteBuffer, 0x00, len(iWriteBuffer))

iWriteBuffer[0] = 0xA0

iWriteBuffer[1] = 0x00

iReadLength=8

ok =ch341_dll.CH341StreamI2C(device_index, 2, iWriteBuffer, iReadLength, oReadBuffer);

if ok:

    print("oReadBuffer: ", end='')#print结尾不换行

    for i in range(iReadLength-1):

        print("0x%02X"  %(oReadBuffer[i]), end=', ')#print结尾用逗号+空格就不换行

    print("0x%02X" % (oReadBuffer[iReadLength-1]))#print结尾换行

关闭设备

ok =ch341_dll.CH341CloseDevice(device_index)

if ok:

    print("OK#%d设备已关闭" %device_index)

sys.exit(0)

  • 来一个“Tkinter布局助手”实现图形化界面编程

虽然同事推荐用PyQt,但是我最开始安装的Python3.13解释器可能过于先进兼容不了,在pip PyQt5插件时报错,虽然在PyCharm中下载插件没有问题:

遂卸载Python 3.13安装3.11。但我仍然没有尝试在3.11基础上,再次安装PyQt插件了,这是因为,Qt商用存在一个商业侵权的风险。而DS说Python原生就有个Tkinter模块可以支持GUI编程,而且推荐安装3.11或3.10版本的解释器。然后我又在网上搜索到,有一个叫“Tkinter布局助手”的开源工具,可以拖拽各种控件来画出GUI界面然后自动生成源码,这就和用CVI设计UIR的操作方式差不多了,对小白非常友好。尝试了一下,果然简单易上手。

在浏览器中打开“Tkinter布局助手”的链接,Tkinter布局助手 ~ 一款在线设计仅需拖拽就能生成Tkinter布局的小工具,作者只弄了网页版,而且用户在网页上就可以设计GUI界面,如下是我设计的一个简单窗口,一个文本框,两个按键:

注意,在网页右侧,点击某个控件,就可以编辑控件特性,比如控件ID名,控件显示文本,添加控件事件(比如左键点击,或右键点击等)及其对应的回调函数名:

完了请及时导出界面设计文件《Tkinter布局助手.tk》,方便下次再用,只需点击“...”图标,选择“导出布局文件”:

       

完了还能在浏览器中点击播放图标,即可直接在浏览器弹出一个窗口呈现预览效果:

我之前安装的Python 3.13,就跑出不来预览效果来,这是因为事先需要安装一些必要的支持性插件,而我安装插件失败了。这是我降级到Python 3.11的主要原因。

请下载插件安装包,https://www.pytk.net/TkinterHelperPreview.zip。然后展开压缩文件到D:\ TkinterHelperPreview文件夹,请首先阅读文件《使用前必看.txt》。

安装插件的大概步骤是:

  1. 在CMD黑窗下pip install -r requirements.txt 安装插件
  2. 双击运行App.pyw,然后就能在windows托盘看到绿色箭头的图标

预览OK后,可点击导出文件图标,下载py源文件:

其中,搞死循环让界面得以一直呈现的是mian.py,绘制界面和给各控件绑定回调函数名的是ui.py,增加回调函数具体代码的是control.py。附件是从网站上下载的原始py文件:

然后把三个py文件从浏览器默认的下载文件夹,拷贝到我们的工程目录myTkinter中来,请记得把CH341的DLL相关文件也拷贝过来:

在PyCharm中新开一个工程,工程目录指定到myTkinter目录。选中main.py,运行它,应该能看到一个弹出窗口:

第一步,就是给“Exit”按键的回调函数on_Eixt(),增加一条退出程序的代码,比如sys.exit(0)。当然事实证明,串口右上角的“×”,也能退出程序,所以这个Exit按键及其回调函数并不是必需的。

第二步,给“ReadA0[00..07]”按键的回调函数on_ReadA08B(),增加一个回读EEPROM从机A0的首8Byte的函数名ReadA08B(),并添加ReadA08B()函数体代码。

第三步,运行,点击“ReadA0[00..07]”按键可在文本框回显数据并在后台打印信息,点击“Exit”按键可退出程序。

如下是ReadA08B()函数的代码,注意看把字符串myStr插入到控件名是TxT_Box文本框的代码是:self.ui.tk_text_Txt_box.insert("end", myStr);而且我用的格式化字符串的方法,还是很古老的类C语言的那种“%”,Python最新编程方式都不推荐了,又暴露我的短板了哇?

def ReadA08B(self):

    获取脚本所在目录

    script_dir = os.path.dirname(os.path.abspath(__file__))

    获取当前文件夹路径,并根据python解释器位数来动态选择对应位数的DLL

    if platform.architecture()[0] == '64bit':

        dll_name = 'CH341DLLA64.DLL'

    else:

        dll_name = 'CH341DLL.DLL'

    dll_path = os.path.join(script_dir, dll_name)

    # dll_path = os.path.join(script_dir, "CH341DLLA64.DLL")

    # dll路径采用相对地址,需带上".\"前缀避免找不到当前文件夹下的dll文件

    dll_path1 = r".\CH341DLLA64.DLL"

    try:

        ch341_dll = ctypes.WinDLL(dll_path)

        # ch341_dll = ctypes.WinDLL(dll_path1)

        # ch341_dll = ctypes.cdll.LoadLibrary(dll_path1)

        myStr="\n%s加载成功,Verion=%d\n" % (dll_name, ch341_dll.CH341GetVersion())

        self.ui.tk_text_Txt_box.insert("end", myStr)

    except Exception as e:

        myStr=f"\nDLL 加载失败{e}"

        self.ui.tk_text_Txt_box.insert("end", myStr)

        return -1

    打开设备(假设设备索引为0

    device_index = 0

    status = ch341_dll.CH341OpenDevice(device_index)

    if (-1 == status):

        myStr="NG#%d设备未连接" % device_index

        self.ui.tk_text_Txt_box.insert("end", myStr)

        return(-1)

    else:

        myStr="OK#%d设备已连接" % device_index

        self.ui.tk_text_Txt_box.insert("end", myStr)

    操作CH341EEPROM随机读A08Byte

    oReadBuffer = (ctypes.c_ubyte * 300)()

    ctypes.memset(oReadBuffer, 0x00len(oReadBuffer))

    iWriteBuffer = (ctypes.c_ubyte * 300)()

    ctypes.memset(iWriteBuffer, 0x00len(iWriteBuffer))

    iWriteBuffer[0] = 0xA0

    iWriteBuffer[1] = 0x00

    iReadLength = 8

    ok = ch341_dll.CH341StreamI2C(device_index, 2, iWriteBuffer, iReadLength, oReadBuffer);

    if ok:

        myStr=""

        for i in range(iReadLength - 1):

            myStr+="0x%02X, " % (oReadBuffer[i])  结尾用逗号+空格就不换行

        myStr+="0x%02X\n" % (oReadBuffer[iReadLength - 1])  结尾换行

        self.ui.tk_text_Txt_box.insert("end", myStr)

    return 0

工程文件夹如下:

  • 打包输出可执行文件

Python 的发布方式:

.py文件:对于开源项目或者源码没那么重要的,直接提供源码,需要使用者自行安装Python并且安装依赖的各种库。(Python官方的各种安装包就是这样做的)。

.pyc文件:有些公司或个人因为机密或者各种原因,不愿意源码被运行者看到,可以使用pyc文件发布,pyc文件是Python解释器可以识别的二进制码,故发布后也是跨平台的,需要使用者安装相应版本的Python和依赖库。

exe可执行文件:对于非码农用户或者一些小白用户,你让他装个Python同时还要折腾一堆依赖库,那简直是个灾难。对于此类用户,最简单的方式就是提供一个可执行文件,只需要把用法告诉他即可直接使用。下面就是制作exe的过程:

  1. 安装工具包PyInstaller

在windows的搜索栏,键入cmd,选择以管理员身份运行CMD黑窗控制台。注意,等pyinstaller安装完毕之后,要在CMD黑窗控制台运行它,却又只能用普通人身份打开CMD黑窗控制台了。不要问为什么,惯用命令行的程序员必须这么任性!

然后拷贝下面这句话,粘贴到黑窗,回车,开始安装PyInstaller:

pip install pyinstaller -i http://mirrors.aliyun.com/pypi/simple/ --trusted-host mirrors.aliyun.com

没报错的话,完了应该在D:\Python311\Scripts\目录下能看到pyinstaller.exe。

  1. 打包tkinter布局助手

先打包tkinter布局助手所需的pytkUI字体文件,在CMD控制台黑窗中,输入命令行

cd D:\TkinterHelperPreview

然后输入命令行:

pyinstaller -wF .\App.pyw -n "tkinter布局助手插件",

然后在D:\TkinterHelperPreview\dist\目录下就会出现一个《tkinter布局助手插件.exe》

  1. 打包main.py

首先在CMD控制台黑窗中,输入命令行

D:

cd D:\myTkinter

然后因为需要把同一目录下的*.DLL都打包进来,需输入命令行:

pyinstaller -w -F main.py --add-data "*.dll;."

最后在D:\ myTkinter\dist\目录下就会出现一个《main.exe》。

如果打包时想改exe的Logo图标,就首先需要准备一张正常的Logo.ico图标文件,放到同一工程目录中。然后用下面这个命令行进行打包,注意一定是先图标文件名,再是程序名:

pyinstaller -w -F -i Logo.ico main.Py

如果一台新PC没有运行过Tkinter布局助手的后台程序,需要双击《tkinter布局助手插件.exe》,然后就可以在windows控制台能看到该插件的绿色箭头图标,则tkinter布局助手的预览服务就算是启动了。

双击《main.exe》,应该就能看到我们的主程序窗口了。点击“ReadA0[00..07]”按键,在PC没有连接CH341的前提下,文本框会出现DLL加载成功单硬件设备未连接的信息:

  • 其他Tips
  1. 单行注释用#,批量注释用”””
  2. a.py欲调用子目录比如ChildDir下的b.py中的函数

在a.py中需要申明一句from ChildDir.b import *,则a.py就可以调用子目录ChildDir中的b.py中的全局变量和函数了。

  1. Python对数组切片和字符串操作,比起C语言的死板,那就随心所欲多了。

  • Python基于Tkinter的图形化界面编程进阶

要不先看看这三天以来的成果,功能上,目前已经实现了:

  • 打开指定USBInd的CH341设备,
  • 搜索指定SlvAdd的I2C从机地址,
  • 随机读EEPROM,需指定寄存器地址RegAdd和指定长度RegLen
  • 立即读EEPROM,需指定长度RegLen
  • 随机写EEPROM,需指定寄存器地址RegAdd、指定长度RegLen和数据串BufW

运行界面和工程源码如下:

   

为了避免时间长了我的易失性存储器大脑被洗白白,这里追溯一下工程目录和源码,真心好多坑。

  1. 在PyCharm中新建一个项目,指定目录是D:\myTkinter,默认选择Python编辑器是3.11,选择在新窗口导入已有文件:

有必要先叨叨这个目录下的各个文件。

《CH341-Python (C)Walkman Studio 2025.tk》,是TKinter布局助手网页版导出的图形界面设计文件,用浏览器打开https://www.pytk.net/网站,设计好图形界面之后,点击“...”图标选择导出文件,得到的。同理,点击“...”图标选择导出导入这个文件,即可在浏览器上复现图形界面。再点击下载图标,即可得到TKinter布局助手自动生成的三个py文件,分别是《main.py》、《control.py》和《ui.py》。

《mian.py》,搞个死循环让界面得以一直呈现。

《control.py》,定义控件的回调函数具体代码。

《ui.py》,生成面板和控件,给面板title和控件文字赋初值、给控件绑定回调函数名。

《App.pyw》是TKinter布局助手带过来的一个辅助性文件,仅在用户使用TKinter布局助手生成的py文件之后,欲把自己的main.py打包成main.exe时有用,而在写代码时可忽略。

《CH341DLL.DLL》和《CH341DLLLA64.DLL》,是CH341在Windows操作系统下的32位和64位的动态链接库。如果用户的Windows操作系统是64位的,则Python调用的DLL就必须是64位的,这个跟用户安装的Python解释器是32位还是64位是无关的。

《dll_loader.py》是用来启动CH341的DLL服务,并生成common.ch341_dll这个类,以方便其他py文件调用DLL中的原生函数。比如下面这句代码,可以把原生函数CH341GetVersion()当成一个方法来调用,并返回DLL文件版本号。

DLLverion = common.ch341_dll.CH341GetVersion()

另外,《dll_loader.py》还包含了搜索从机地址的函数。这个函数比较底层,发出了一个比较特殊的I2C时序:START+SlvAdd+STOP,然后判断从机是否正确响应了ACK。

《CH341DLL.h》是CH341动态链接库的头文件,有很多固定值参数和函数名的申明。务必注意比如函数CH341WriteData()参数中以P开头的数据类型,比如PVIO这是C的字符串指针,还有PULONG这是C的整形指针,

在Python中调用该函数,Python没有C语言的&这种取地址符可以很方便地转换一个变量构成指针,必须用特定的代码来做类型转换:

有意思的是,整形的指针,在Python中可以在类型转换时被赋初值,比如上面的(3),就是写入的mbuffer的长度是3Byte的意思。但是整形数组这样的指针,在Python中不能在类型转换时被一次性赋不同的初值了,只能转换好之后如上图所示一个一个地赋值,或者像下面代码一样一次性赋值:

mbuffer = [mCH341A_CMD_I2C_STREAM, mCH341A_CMD_I2C_STM_STA, mCH341A_CMD_I2C_STM_END]

《common.py》是我拿来放全局变量的文件,这样其他py文件只需要来一句

import  common  #common.py用于定义全局变量

就可以调用common.xxx(xxx是定义在common.py中的全局变量名)来愉快滴玩耍了。甚至因为ch341_dll也定义在了common.py中,一旦DLL被启动,就可以用common.ch341_dll.fff(fff是定义在CH341DLL.h中的函数名)来调用DLL函数了。

2,I2C读写从机的核心代码

实际上是讲解如何基于DLL的原生函数CH341StreamI2C(),来实现随机读、立即读和随机写的I2C主机时序。要求用户对I2C Spec中的几个重要时序,首先得有一个清晰的认识。

随机读EEPROM,需输出2Byte的iWriteBuffer(包括从机地址SlvAdd和寄存器地址RegAdd),即可回读指定长度RegLen的数据到oReadBuffer[ ]:

iWriteBuffer[0] = common.SlvAdd

iWriteBuffer[1] = common.RegAdd

iWriteLength = 2

iReadLength = common.RegLen

发起一次I2C Random

ok = common.ch341_dll.CH341StreamI2C(common.USBInd, iWriteLength, iWriteBuffer, iReadLength, oReadBuffer)

立即读EEPROM,仅需输出1Byte的iWriteBuffer(只有从机地址),即可回读指定长度RegLen的数据到oReadBuffer[ ]:

iWriteBuffer[0] = common.SlvAdd

iWriteLength    = 1

iReadLength     = common.RegLen

发起一次I2C Current

ok = common.ch341_dll.CH341StreamI2C(common.USBInd, iWriteLength, iWriteBuffer, iReadLength, oReadBuffer)

随机写EEPROM,需输出至少2Byte的iWriteBuffer(包括从机地址SlvAdd和寄存器地址RegAdd),和指定长度RegLen的数据的iWriteBuffer[],且回读长度指定为0。

iWriteBuffer[0] = common.SlvAdd

iWriteBuffer[1] = common.RegAdd

for i in range(common.RegLen):

 iWriteBuffer[2+i] = common.ioArr[i]

iWriteLength = 2+common.RegLen

iReadLength  = 0

发起一次I2C Random

ok = common.ch341_dll.CH341StreamI2C(common.USBInd, iWriteLength, iWriteBuffer, iReadLength, oReadBuffer)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值