forked from yzt000000/device_config_python
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathusb_i2c.py
More file actions
146 lines (127 loc) · 4.05 KB
/
usb_i2c.py
File metadata and controls
146 lines (127 loc) · 4.05 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
import sys
import os
from ctypes import *
def CheckBit():
"""
检查Python解释器的位数(32位或64位)。
"""
if sys.maxsize > 2 ** 32:
print("interpreter 64-bit")
return 64
else:
print("interpreter 32-bit")
return 32
def AddCWD():
"""
将当前工作目录添加到DLL搜索路径。
"""
os.add_dll_directory(os.getcwd())
return os.getcwd()
def LoadDLL():
"""
根据解释器的位数加载相应的DLL文件。
"""
interpreterBit = CheckBit()
cwd = AddCWD()
ret = None
dllPath = None
if interpreterBit == 64:
dllPath = "./CH341DLLA64.DLL"
else:
dllPath = "./CH341DLL.DLL"
if os.path.exists(dllPath):
try:
ret = CDLL(dllPath)
except OSError as e:
print(f"Failed to load DLL: {e}")
else:
print(f"{dllPath} not found in {cwd}")
return ret
class USBI2C:
"""
用于与USB I2C设备通信的类。
"""
ch341dll = LoadDLL()
def __init__(self, usb_dev=0, i2c_dev=0x6C, i2c_speed=0x02):
"""
初始化USBI2C对象。
:param usb_dev: USB设备ID
:param i2c_dev: I2C设备地址
:param i2c_speed: I2C通信速度
"""
self.usb_id = usb_dev
self.update_device_address(i2c_dev)
self.update_device_speed(i2c_speed)
def update_device_address(self, i2c_dev):
"""
更新I2C设备地址。
:param i2c_dev: 新的I2C设备地址
"""
self.dev_addr = i2c_dev * 2
# if USBI2C.ch341dll.CH341OpenDevice(self.usb_id) != -1:
# USBI2C.ch341dll.CH341SetStream(self.usb_id, self.dev_addr)
# USBI2C.ch341dll.CH341CloseDevice(self.usb_id)
# else:
# print("DEVICE INIT FAILED!!")
def update_device_speed(self, i2c_speed):
"""
更新I2C通信速度。
:param i2c_speed: 新的I2C通信速度
"""
if USBI2C.ch341dll.CH341OpenDevice(self.usb_id) != -1:
USBI2C.ch341dll.CH341SetStream(self.usb_id, i2c_speed)
USBI2C.ch341dll.CH341CloseDevice(self.usb_id)
else:
print("DEVICE INIT FAILED!!")
def SendCmd(self, cmd, size):
"""
发送命令到I2C设备。
:param cmd: 命令字节列表
:param size: 命令字节数
:return: 返回读取的缓冲区数据
"""
if USBI2C.ch341dll.CH341OpenDevice(self.usb_id) != -1:
tcmd = (c_byte * (size + 1))()
buffer = (c_byte * 300)()
tcmd[0] = self.dev_addr
for i in range(size):
tcmd[i + 1] = cmd[i] & 0xFF
USBI2C.ch341dll.CH341StreamI2C(self.usb_id, size + 1, tcmd, 300, buffer)
USBI2C.ch341dll.CH341CloseDevice(self.usb_id)
return buffer
else:
print("DEVICE OPERATE FAILED")
return -1
def read(self, addr):
"""
从I2C设备读取数据。
:param addr: 读取地址
:return: 读取的数据
"""
if USBI2C.ch341dll.CH341OpenDevice(self.usb_id) != -1:
obuf = (c_byte * 2)()
ibuf = (c_byte * 1)()
obuf[0] = self.dev_addr
obuf[1] = addr
USBI2C.ch341dll.CH341StreamI2C(self.usb_id, 2, obuf, 1, ibuf)
USBI2C.ch341dll.CH341CloseDevice(self.usb_id)
return ibuf[0] & 0xff
else:
print("USB CH341 Open Failed!")
return 0
def write(self, addr, dat):
"""
向I2C设备写入数据。
:param addr: 写入地址
:param dat: 写入的数据
"""
if USBI2C.ch341dll.CH341OpenDevice(self.usb_id) != -1:
obuf = (c_byte * 3)()
ibuf = (c_byte * 1)()
obuf[0] = self.dev_addr
obuf[1] = addr
obuf[2] = dat & 0xff
USBI2C.ch341dll.CH341StreamI2C(self.usb_id, 3, obuf, 0, ibuf)
USBI2C.ch341dll.CH341CloseDevice(self.usb_id)
else:
print("USB CH341 Open Failed!")