程序中,可以修改不同的I2C地址,但总存在0x20

上图是C程序里写的STM32的地址,0x21<<1=66
import ctypes
ch341dll = ctypes.windll.LoadLibrary(".//CH341DLLA64.dll")
print("Ch341dll_wrap is loaded!!!")
# only win64 version python can Load the CH341DLL.dll
class USBI2C():
"""初始化属性--usb_dev【usb端口】 default 0; --i2c_dev【I2C目标地址】"""
def __init__(self, usb_dev=0, i2c_speed=400):
self.usb_id = usb_dev
print("USBI2C Device Index=",self.usb_id)
self.i2c_speed = i2c_speed
if (self.ch341_open_status()):
print("Open USB CH341 Success")
self.ch341_i2c_speed()
def ch341_open_status(self):
if (ch341dll.CH341OpenDevice(self.usb_id) > 0):
# print(ch341dll.CH341GetVersion())
# print(ch341dll.CH341GetDrvVersion())
# print("IC number=", hex(ch341dll.CH341GetVerIC(0)))
return True
else:
print("Error!!! USB CH341 Open Failed!")
return False
def ch341_i2c_connect_status(self):
if (self.ch341_open_status()):
for i in range(0x7f):
if(i>0):
data = self.ch341_i2c_read_byte(i, 0x88)
#print(data)
if data != "0xFF" :
print("I2C Connect Success,i2c Addr=", hex(i))
print(data)
#return i
else:
print("I2C Connect Fail")
def ch341_i2c_connect_status2(self):
if (self.ch341_open_status()):
for i in range(0x00,0xff):
data = self.ch341_i2c_read_byte(0x21, i)
# print("I2C Connect Success,i2c Addr=", hex(i))
#print(data)
if data != "0xFF":
print("I2C Connect Success,i2c Addr=", hex(i))
print(data)
else:
print("I2C Connect Fail")
def ch341_close(self):
if(ch341dll.CH341CloseDevice(self.usb_id) > 0):
# print("Close USB CH341 Success")
return True
else:
print("Error!!! USB CH341 Close Failed!")
return False
def ch341_i2c_speed(self):
match self.i2c_speed:
case 20:
ch341dll.CH341SetStream(self.usb_id, 0x0)
print("I2C speed 20kHz ")
case 100:
ch341dll.CH341SetStream(self.usb_id, 0x1)
print("I2C speed 100kHz ")
case 400:
ch341dll.CH341SetStream(self.usb_id, 0x2)
print("I2C speed 400kHz ")
case 750:
ch341dll.CH341SetStream(self.usb_id, 0x3)
print("I2C speed 750kHz ")
case _:
return -1
def ch341_i2c_write_byte(self, i2c_addr7b, reg_addr,wdata):
if(self.ch341_open_status()):
ch341dll.CH341WriteI2C(self.usb_id, i2c_addr7b & 0xff, reg_addr&0xff, wdata&0xff)
return self.ch341_close()
else:
self.ch341_close()
print("USB CH341 Open Failed!")
return 0
def ch341_i2c_read_byte(self,i2c_addr7b,reg_addr):
if(self.ch341_open_status()):
rdata = (ctypes.c_uint8 * 1)()
ch341dll.CH341ReadI2C(self.usb_id, i2c_addr7b & 0xff, reg_addr & 0xff, rdata)
#ch341dll.CH341ReadI2C(self.usb_id, (i2c_addr7b << 1) | 0x01, reg_addr & 0xff, rdata)
if(self.ch341_close()):
# return hex(rdata[0]&0xff).upper().replace('X', 'x')
return ("0x" + format((rdata[0]&0xff), "x").zfill(2)).upper().replace('X', 'x')
else:
print("USB CH341 Open Failed!")
return 0
i2c_Xdpp1100 = USBI2C(usb_dev=0, i2c_speed=20)
i2c_Xdpp1100.ch341_i2c_connect_status()
上边的python程序用于查找设备地址,通过查找设备里的某个寄存器有值,来判断设备地址是否存在。
I2C Connect Success,i2c Addr= 0x20
0x01
I2C Connect Success,i2c Addr= 0x21
0x00
运行结果会查找到两个地址,0x21是设置的地址。同样手动修改设备地址为其它可检索到手动设置的的地址,但0x20始终存在。通过后边写入操作知,0x21是正确的地址。
最好能贴上截图,这样小伙伴们能更清晰地帮你验证从而协助分析哈。
只有查找STM32控制器会出现多余的地址,换成其它控制器就只会检测到一个
修改了
所以查找的逻辑上考虑调整一下。
从协议上将,发送设备码 0b 0100 001x 才能得到ACK的。