news 2026/6/10 8:03:02

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/6/9 14:52:18

python-uniapp微信小程序的自助自习室预约选座系统的设计与实现_7r4zk039

文章目录系统截图项目技术简介可行性分析主要运用技术介绍核心代码参考示例结论源码lw获取/同行可拿货,招校园代理 &#xff1a;文章底部获取博主联系方式&#xff01;系统截图 python-uniapp_7r4zk039 微信小程序的自助自习室预约选座系统的设计与实现 项目技术简介 Pyth…

作者头像 李华
网站建设 2026/6/10 12:27:36

基于LSTM - AdaBoost的多输入单输出回归预测

基于LSTM-AdaBoost长短期记忆网络结合AdaBoost多输入单输出回归预测 python代码 1.输入多个特征&#xff0c;输出单个变量&#xff0c;多变量回归预测&#xff1b; 2.data为数据集&#xff0c;excel数据&#xff0c;前6列输入&#xff0c;最后1列输出&#xff0c;运行主程序即…

作者头像 李华
网站建设 2026/6/10 12:27:36

20、开发线程安全的 COM 代码

开发线程安全的 COM 代码 在多线程编程中,确保代码的线程安全性是一项至关重要的任务。尤其是在 COM(Component Object Model)编程环境中,由于多个线程可能同时访问共享资源,因此需要特别注意处理共享数据冲突的问题。本文将介绍一些开发公寓安全(apartment-safe)和线程…

作者头像 李华
网站建设 2026/6/10 2:04:02

容联七陌 X 凯德MALL|大模型客服驱动购物中心服务升级

凯德&#xff08;中国&#xff09;企业管理有限公司作为凯德集团旗下核心成员&#xff0c;专注于线下大型商业综合体运营&#xff0c;旗下核心品牌"凯德MALL"覆盖全国多座城市。其业务以零售、餐饮、休闲娱乐等多业态融合为核心&#xff0c;致力于通过数字化手段提升…

作者头像 李华
网站建设 2026/6/10 15:19:05

SSM小型超市货物仓储管理系统w8wry(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面

系统程序文件列表 系统项目功能&#xff1a;仓库管理员,主管,货物种类,货物区域,货物信息,货物分区,货物出库,货物入库,每日结存,供应商,日志,每月结存,出入库申请 开题报告&#xff1a;基于SSM的小型超市货物仓储管理系统设计与实现 一、研究背景与意义 1. 研究背景 当前小…

作者头像 李华
网站建设 2026/6/10 14:12:12

「2026最新排行榜」国内外TOP6背景音乐素材网站精选!口碑靠谱必收藏,零侵权风险,企业/个人首选下载渠道!

在音乐创作、影视制作、广告剪辑、短视频创作等领域&#xff0c;适配的背景音乐是提升作品质感的关键。但优质、合规的背景音乐素材筛选难度较高&#xff0c;本文整理了国内外口碑出众的背景音乐素材网站&#xff0c;涵盖不同风格、授权模式&#xff0c;满足个人与商业创作需求…

作者头像 李华