可以直接相连 ,但要注意电平、上拉电阻、地址冲突三个关键点,下面分情况说明:
一、核心前提:电平匹配
- Arduino UNO 主控 ATmega328P 是 5V 逻辑电平 ,I2C (SDA/SCL) 引脚耐压:不能长期承受 5V 以上。
- STM32 最小系统板
- 多数常用型号(F103、F407、F105 等)默认 3.3V 逻辑电平 ,引脚不耐 5V。
⚠️ 禁忌:绝对不要直接把 UNO 的 5V I2C 引脚接到 3.3V STM32 的 IO 口,会烧毁 STM32 引脚。
两种可行接法
方案 1:最安全(推荐)------ 加电平转换模块
使用 I2C 双向电平转换板(3.3V ↔ 5V)
- 转换板 3.3V 侧:接 STM32 的 SDA、SCL、3.3V、GND
- 转换板 5V 侧:接 UNO 的 A4 (SDA)、A5 (SCL)、5V、GND
- 双方 GND 必须共地(重中之重)
方案 2:分压电阻(简易替代,仅临时测试)
只适合短距离、低速 I2C:
- UNO SDA → 串 1kΩ 电阻 → STM32 SDA
- UNO SCL → 串 1kΩ 电阻 → STM32 SCL
- 双方 GND 相连 原理:把 UNO 5V 高电平拉低到 STM32 可承受范围,不适合长期、高速使用。
二、上拉电阻处理
I2C 是开漏输出,必须上拉:
- Arduino UNO :硬件自带 内部上拉,A4/A5 默认已上拉到 5V。
- STM32 I2C 引脚 :
- 若 STM32 开启内部上拉(上拉到 3.3V):搭配电平转换板完全没问题。
- 不要在两边同时额外再加外部上拉电阻,容易造成电平异常、通讯不稳。
总结:只用板载上拉即可,无需额外焊电阻。
三、软件与地址注意事项
- 共地 两块板子 GND 一定要连在一起,否则 I2C 完全无法通讯。
- I2C 地址 主从模式二选一:
- 模式 A:UNO 做主机,STM32 做从机(常用),STM32 配置 I2C 从机地址,UNO 主动读写。
- 模式 B:STM32 做主机,UNO 做从机 ,UNO 代码配置为 I2C 从设备。 同一总线上设备地址不能重复。
- 通讯速率 建议设为 100kHz(标准模式),降低出错概率,不要一开始就用 400kHz 高速。
四、最简接线汇总(配电平转换板)
表格
| 电平转换板 | STM32(3.3V) | Arduino UNO(5V) |
|---|---|---|
| VCC3.3 | 3.3V | - |
| GND | GND | GND |
| SDA3 | I2C_SDA | - |
| SCL3 | I2C_SCL | - |
| VCC5 | - | 5V |
| SDA5 | - | A4(SDA) |
| SCL5 | - | A5(SCL) |
补充
如果你的 STM32 本身是 5V 版本 (极少),则可以直接直连 SDA/SCL + 共地 ,无需电平转换。 市面上 99% STM32 最小板都是 3.3V 核心,优先用电平转换板最稳妥。
