本人是初学者,非常愿意与各位交流。
最近在看IIC操作设备地址时,觉得那些资料都挺枯燥的,还是记录一下比较简单的描述吧。
这里主要讲解的为:“表达式 0x20 << 1 | 1” 的具体含义。
通俗讲,表达式 0x20 << 1 | 1 是用于生成I2C设备的8位读操作地址。不过,为了便于记忆,可以打个比方:
想象你住在一个叫 I2C小区 的公寓楼里:
-
这栋楼有 128户人家(对应I2C的7位地址,0~127)。
-
你家门牌号是 0x20(十六进制,相当于十进制32号房)。
关键角色:
-
你(ESP32):想找邻居拿东西(读数据)或送东西(写数据)。
-
快递柜(I2C设备):在你邻居家门口(地址0x20),柜子有2个功能按钮:
🔴 红色按钮(1) → “取快递”(读数据)
🟢 绿色按钮(0) → “存快递”(写数据)
问题:你怎么告诉快递柜你要“取快递”?
不能只说“我去32号房”,因为快递柜不知道你要“存”还是“取”!所以I2C协议发明了一个神奇的操作:
步骤①:把门牌号升级成8位数 → 0x20 << 1
-
原始门牌号:
0x20(二进制:00100000) -
左移1位相当于在门牌号后面补个0:
00100000→01000000(新门牌号0x40)
(就像把32号升级成64号大房间,专门用来放快递柜!)
步骤②:按下取件按钮 → | 1
-
在升级后的门牌号(
0x40)最后一位加上1:
01000000→01000001(变成0x41)
💡 这个"1"就是告诉快递柜:"我要取快递啦!"
最终魔法地址:0x41
-
0x41= 升级后的门牌号(64号) + 取件指令(1)
→ 它代表:“请打开 32号房 的快递柜,我要读数据!”
对比写操作(存快递):
-
如果是存快递(写数据),最后加的就是 0:
0x20 << 1 | 0 = 0x40
→ 意思是:“请打开32号房的快递柜,我要存数据!”
现实代码中的样子(超简单!)
// 告诉32号房:我要取1个快递(读1字节数据)
Wire.requestFrom(0x20, 1);
// 告诉32号房:我要存快递(写数据)
Wire.beginTransmission(0x20);
✅ 实际写代码时,直接用 7位地址(0x20) 即可,ESP32会自动帮你完成
<<1 | 0/1的魔法转换!
口诀:
🔢 7位地址像门牌,
←左移一位补个零,
✌️末尾0/1定读写,
📦 取件加1存加零!
下次看到 0x20 << 1 | 1,就笑着想:“噢~这是要去32号房取快递!”
1万+

被折叠的 条评论
为什么被折叠?



