You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 03:24:38