使用Arduino IDE实现两台Pi Pico的I2C通信失败,求故障排查
问题:两台Pi Pico的I2C通信无法建立,代码哪里出错了?
我希望使用Arduino IDE对两台Pi Pico进行编程,实现它们之间的I2C通信。尝试使用Wire.h库及网上示例代码后,始终无法建立连接。
主机代码:
#include "Wire.h" void setup() { Wire.begin(); Serial.begin(9600); bool setSDA(1); bool setSCL(2); pinMode(LED_BUILTIN, OUTPUT); digitalWrite(LED_BUILTIN, HIGH); } void loop() { Wire.requestFrom(8, 6); Serial.println("Waiting..."); while (Wire.available()) { char c = Wire.read(); Serial.print(c); } delay(500); }
从机代码:
#include "Wire.h" void setup() { Wire.begin(8); Wire.onRequest(requestEvent); Serial.begin(); bool setSDA(1); bool setSCL(2); pinMode(LED_BUILTIN, OUTPUT); digitalWrite(LED_BUILTIN, HIGH); } void loop() { delay(100); Serial.println("Recieving..."); } void requestEvent() { Wire.write("hello "); }
问题分析与修正方案
你的代码存在几个关键错误,直接导致I2C连接失败:
无效的引脚配置
你写的bool setSDA(1);和bool setSCL(2);只是创建了两个无意义的布尔变量,根本没有完成I2C引脚的配置。在Arduino环境下的Pi Pico,需要通过Wire.begin()的重载方法指定引脚:- 主机需改为
Wire.begin(1, 2);(对应GP1为SDA、GP2为SCL) - 从机需改为
Wire.begin(8, 1, 2);(格式为Wire.begin(地址, SDA引脚, SCL引脚))
- 主机需改为
串口初始化不完整
从机代码中Serial.begin();未指定波特率,会导致串口输出乱码,无法通过串口排查问题。需改为Serial.begin(9600);,和主机保持一致。拼写错误(不影响通信但影响调试)
从机loop里的Recieving是拼写错误,应改为Receiving,避免调试时产生误解。额外硬件注意事项
两台Pico必须正确接线:- 主机SDA ↔ 从机SDA
- 主机SCL ↔ 从机SCL
- 两者GND共地
- 通信不稳定时,可在SDA、SCL引脚各接一个4.7kΩ上拉电阻到3.3V
修正后的主机代码
#include "Wire.h" void setup() { // 指定GP1为SDA、GP2为SCL初始化I2C主机 Wire.begin(1, 2); Serial.begin(9600); pinMode(LED_BUILTIN, OUTPUT); digitalWrite(LED_BUILTIN, HIGH); } void loop() { Wire.requestFrom(8, 6); Serial.println("Waiting..."); while (Wire.available()) { char c = Wire.read(); Serial.print(c); } Serial.println(); // 换行方便查看接收内容 delay(500); }
修正后的从机代码
#include "Wire.h" void setup() { // 指定地址8、GP1为SDA、GP2为SCL初始化I2C从机 Wire.begin(8, 1, 2); Wire.onRequest(requestEvent); Serial.begin(9600); // 补全波特率 pinMode(LED_BUILTIN, OUTPUT); digitalWrite(LED_BUILTIN, HIGH); } void loop() { delay(100); Serial.println("Receiving..."); // 修正拼写错误 } void requestEvent() { Wire.write("hello "); }
内容的提问来源于stack exchange,提问作者joshuagws
相关产品推荐
相关产品推荐

