你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32G474, I2C设备地址,总出现多余地址0x20,是什么原因?

[复制链接]
刘嘉宾 提问时间:2025-9-16 15:52 / 未解决

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

地址1.png

上图是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是正确的地址。

地址2.png
收藏 评论4 发布时间:2025-9-16 15:52

举报

4个回答
butterflyspring 回答时间:2025-9-17 10:16:12
能否具体描述一下,在哪里修改,什么时候会出现地址看起来多余0x20.
最好能贴上截图,这样小伙伴们能更清晰地帮你验证从而协助分析哈。
刘嘉宾 回答时间:3 天前

只有查找STM32控制器会出现多余的地址,换成其它控制器就只会检测到一个

刘嘉宾 回答时间:3 天前

butterflyspring 发表于 2025-9-17 10:16
能否具体描述一下,在哪里修改,什么时候会出现地址看起来多余0x20.
最好能贴上截图,这样小伙伴们能更清晰 ...

修改了

butterflyspring 回答时间:昨天 14:50
从手册看,寄存器地址应该就0x42的,而且是bit【7:1】有效。

所以查找的逻辑上考虑调整一下。

从协议上将,发送设备码 0b 0100 001x 才能得到ACK的。

所属标签

相似问题

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版