news 2026/1/25 14:03:46

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/1/12 19:38:52

网络安全实战能力要怎么练出来?

一、先搞懂&#xff1a;实战能力≠理论堆砌&#xff0c;核心是问题解决思维 很多新手误以为学完工具用法就是会实战&#xff0c;实则不然。举个典型例子&#xff1a;同样是学Nessus漏洞扫描&#xff0c;只懂理论的新手会直接跑全量扫描&#xff0c;导出几十页报告就交差。有实…

作者头像 李华
网站建设 2026/1/16 4:14:23

python-uniapp微信小程序的环保生活垃圾分类小助手APP设计与实现_jee8ea9n

文章目录系统截图项目技术简介可行性分析主要运用技术介绍核心代码参考示例结论源码lw获取/同行可拿货,招校园代理 &#xff1a;文章底部获取博主联系方式&#xff01;系统截图 pythonpython-uniapp微信小程序的环保生活垃圾分类小助手APP设计与实现_jee8ea9n -uniapp微…

作者头像 李华
网站建设 2026/1/12 23:21:56

基于Simulink的‘单相全桥逆变器并离网控制‘模型

#基于Simulink的单相逆变器并离网控制 单相全桥并离网仿真模型&#xff1b;采用单环控制&#xff0c;并离网无缝衔接-切换时无明显跳变&#xff1b;调制采用单级倍频的方式&#xff0c;两种方案可供选择&#xff1b;仿真中尽可能考虑了单片机控制时的离散情况&#xff0c;对实物…

作者头像 李华
网站建设 2026/1/12 23:21:54

基于SSA-LSTM-DCNN的光伏故障诊断:探索更优之路

基于SSA-LSTM-DCNN的光伏故障诊断 通过simulink随机温度&#xff0c;辐射度仿真得出老化&#xff0c;开路&#xff0c;短路&#xff0c;阴影遮蔽5类不同故障&#xff0c;共9种数据集。 提取他们的开路电压&#xff0c;短路电流&#xff0c;最大功率&#xff0c;最大功率电压&am…

作者头像 李华
网站建设 2026/1/12 23:21:53

28、分布式计算中的事件通知机制解析

分布式计算中的事件通知机制解析 1. 分布式计算中的事件通知需求 在分布式计算环境中,向感兴趣的各方通知数据变更情况是一项常见需求。例如,股票行情程序需向客户端通知股价变化;计算机监控程序要告知管理员系统状态;病毒检测程序在检测到病毒时需警告用户;医疗监控程序…

作者头像 李华
网站建设 2026/1/12 23:21:51

30、COM+ 技术助力企业应用可扩展性提升

COM+ 技术助力企业应用可扩展性提升 1. 事件系统概述 事件是对某些重要数据变化的通知。发布者触发事件,一个或多个订阅者接收该事件。事件系统实现大致可分为紧密耦合事件(TCEs)和松散耦合事件(LCEs)两类。 事件类型 特点 示例 紧密耦合事件(TCEs) 发布者和订阅…

作者头像 李华