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

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.
最好能贴上截图,这样小伙伴们能更清晰地帮你验证从而协助分析哈。
刘嘉宾 回答时间:2025-9-23 15:33:11

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

刘嘉宾 回答时间:2025-9-23 15:37:27

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

修改了

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

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

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

所属标签

相似问题

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版