news 2026/8/21 4:07:45

I2CSPI 沉浸式测试

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
I2CSPI 沉浸式测试

CH347L I2C 扫描地址

Linux- 树莓派测试

#!/usr/bin/env python3 # coding=utf-8 import ctypes from ctypes import * import sys DEV = "/dev/ch34x_pis0" DEV_C = c_char_p(DEV.encode()) LIB = "./libch347.so" # ---- load lib ---- ch347 = ctypes.cdll.LoadLibrary(LIB) # ---- prototypes ---- ch347.CH347OpenDevice.argtypes = [c_char_p] ch347.CH347OpenDevice.restype = c_int ch347.CH347CloseDevice.argtypes = [c_int] ch347.CH347CloseDevice.restype = None # StreamI2C fallback prototype ch347.CH347StreamI2C.argtypes = [c_int, c_ulong, c_void_p, c_ulong, c_void_p] ch347.CH347StreamI2C.restype = c_int def has_retack(): return hasattr(ch347, "CH347StreamI2C_RetACK") def bind_retack(): """ int CH347StreamI2C_RetACK( int DevHandle, ULONG iWriteLength, PVOID iWriteBuffer, ULONG iReadLength, PVOID oReadBuffer, PULONG oAckCount ) """ fn = ch347.CH347StreamI2C_RetACK fn.argtypes = [c_int, c_ulong, c_void_p, c_ulong, c_void_p, POINTER(c_ulong)] fn.restype = c_int return fn def open_dev(): h = ch347.CH347OpenDevice(DEV_C) if h == -1: print("CH347 open failed") sys.exit(1) return h def close_dev(h): ch347.CH347CloseDevice(h) def probe_ack_retack(fn_retack, h, addr7): """ 真·扫描:用 RetACK 看 ACK 数 事务:START + SLA+W + STOP 只要 ack_cnt > 0,说明这个地址有ACK(存在设备) """ tx = (c_ubyte * 1)() rx = (c_ubyte * 1)() ack = c_ulong(0) tx[0] = ((addr7 << 1) & 0xFE) # SLA+W r = fn_retack(h, 1, tx, 0, rx, byref(ack)) if r != 0: return False return ack.value > 0 def probe_ack_fallback(h, addr7): """ 退化版(不保证真):用“写地址+读1字节”试图触发NACK变为错误码 注意:很多 libch347 版本不会把 NACK 反映到返回值,所以可能假阳性 """ tx = (c_ubyte * 1)() rx = (c_ubyte * 1)() tx[0] = ((addr7 << 1) | 1) & 0xFF # SLA+R r = ch347.CH347StreamI2C(h, 1, tx, 1, rx) return r == 0 # 仅作退化判断 def scan(): h = open_dev() use_retack = has_retack() fn_retack = bind_retack() if use_retack else None if use_retack: print("CH347 I2C scan mode: RetACK (reliable)") else: print("CH347 I2C scan mode: fallback (NOT reliable)") print("Tip: your libch347.so may not export CH347StreamI2C_RetACK, so true i2cdetect-like scan is impossible.") # header print(" " + " ".join(f"{i:02X}" for i in range(16))) for hi in range(0x00, 0x80, 0x10): row = [f"{hi:02X}: "] for lo in range(16): a = hi + lo if a < 0x00 or a > 0x7F: row.append("--") continue if use_retack: ok = probe_ack_retack(fn_retack, h, a) else: ok = probe_ack_fallback(h, a) row.append(f"{a:02X}" if ok else "--") print(" ".join(row)) close_dev(h) if __name__ == "__main__": scan()

Windows 电脑测试

#! /usr/bin/env python # coding=utf-8 import os, sys from ctypes import * # ===== DLL ===== _here = os.path.dirname(os.path.abspath(__file__)) _dll = "CH347DLLA64.DLL" if sizeof(c_void_p) == 8 else "CH347DLL.DLL" ch347 = WinDLL(os.path.join(_here, _dll)) USB_ID = 0 # 第一个 CH347 # ===== prototypes ===== ch347.CH347OpenDevice.argtypes = [c_int] ch347.CH347OpenDevice.restype = c_int ch347.CH347CloseDevice.argtypes = [c_int] ch347.CH347CloseDevice.restype = None ch347.CH347StreamI2C.argtypes = [ c_int, c_ulong, c_void_p, c_ulong, c_void_p ] ch347.CH347StreamI2C.restype = c_int def has_retack(): return hasattr(ch347, "CH347StreamI2C_RetACK") def bind_retack(): fn = ch347.CH347StreamI2C_RetACK fn.argtypes = [ c_int, c_ulong, c_void_p, c_ulong, c_void_p, POINTER(c_ulong) ] fn.restype = c_int return fn def open_dev(): if ch347.CH347OpenDevice(USB_ID) == -1: print("CH347 open failed") sys.exit(1) def close_dev(): ch347.CH347CloseDevice(USB_ID) def probe_retack(fn, addr7): tx = (c_ubyte * 1)() rx = (c_ubyte * 1)() ack = c_ulong(0) tx[0] = (addr7 << 1) & 0xFE # SLA+W r = fn(USB_ID, 1, tx, 0, rx, byref(ack)) return r == 0 and ack.value > 0 def probe_fallback(addr7): tx = (c_ubyte * 1)() rx = (c_ubyte * 1)() tx[0] = ((addr7 << 1) | 1) & 0xFF return ch347.CH347StreamI2C(USB_ID, 1, tx, 1, rx) == 0 def scan(): open_dev() use_retack = has_retack() fn = bind_retack() if use_retack else None print("CH347 I2C scan (Windows)") print("mode:", "RetACK (reliable)" if use_retack else "fallback (not reliable)") print(" " + " ".join(f"{i:02X}" for i in range(16))) for hi in range(0x00, 0x80, 0x10): row = [f"{hi:02X}:"] for lo in range(16): addr = hi + lo if addr > 0x7F: row.append("--") continue ok = probe_retack(fn, addr) if use_retack else probe_fallback(addr) row.append(f"{addr:02X}" if ok else "--") print(" ".join(row)) close_dev() if __name__ == "__main__": scan()
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/21 20:29:13

识人的艺术,科学的尺度:当员工背景调查遇上智能时代

招聘经理王琳最近松了口气。 曾经让她夜不能寐的新高管入职流程&#xff0c;现在变得从容不迫。那位从竞争对手公司挖来的销售总监&#xff0c;从背景核实到最终录用&#xff0c;只用了三天时间——而以往&#xff0c;这个过程至少需要两周。 变化的背后&#xff0c;是一个正在…

作者头像 李华
网站建设 2026/8/21 10:58:11

欧拉法仿真铺粉元素偏移:从模型到代码

欧拉法仿真铺粉元素偏移&#xff0c; 里面包含高斯移动热源&#xff0c;温度梯度设置&#xff0c;以及元素偏析模拟和四种元素的铺粉定向能量沉积模型以及全视频讲解&#xff0c;包含完整的仿真模型以及自定义编程代码和讲解视频&#xff08;反冲与元素基本模型三维&#xff0…

作者头像 李华
网站建设 2026/8/21 13:05:18

08背靠背变换器PQ - QV控制在Simulink中的有名值仿真之旅

08背靠背变换器&#xff0c;PQ-QV控制&#xff0c;有名值&#xff0c;simulink仿真模型&#xff0c;2022b版本 ①其他模型看我主页&#xff0c;都是个人搭建&#xff0c;无团队 ②变换器额定容量为2MW&#xff0c;额定线电压为690V&#xff0c;直流侧电压1250V&#xff0c;机侧…

作者头像 李华
网站建设 2026/8/21 13:43:23

CentOS7的一些基础命令

文件与目录操作ls [-a -l -h] [路径] : 查看指定路径下文件列表 注意: 默认都是当前路径参数 -a : 展示出隐藏文件 注意: .开头就是隐藏文件参数 -l : 以详细信息展示文件 注意: ls -l 可以简化为ll参数 -h : 配合-l使用,人性化展示文件大小 cd <目…

作者头像 李华
网站建设 2026/8/21 22:15:37

请你说说hashCode()和equals()的区别,为什么重写equals()就要重写hashCode()

区别&#xff1a; equals()方法用于比较两个对象是否相等。默认情况下&#xff08;从Object类继承&#xff09;&#xff0c;它比较的是两个对象的引用是否指向同一内存地址。但通常我们会重写它&#xff0c;以便根据对象的内容&#xff08;即属性值&#xff09;来比较是否相等。…

作者头像 李华
网站建设 2026/8/21 20:46:37

canvas绘制图片

项目中有一个点击图片&#xff0c;在点击区域画圆标注的需求&#xff0c;需要知道点击的位置&#xff0c;并判断位置是否正确&#xff0c;类似“找不同”小游戏。这种就需要用到canvas了基本说明canvas 是 一个 HTML 元素&#xff0c;用于绘制图形和图像&#xff0c;通过 JavaS…

作者头像 李华