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

树莓派Pico(Arduino核心)如何通过SPI1而非SPI0使用SD卡模块?

在树莓派Pico上用SPI1驱动SD卡(替代SPI0)

针对你的场景,要让SD卡库切换到SPI1,核心是在初始化SD卡时显式指定SPI1对象,而非默认的SPI(SPI0)。以下是具体实现步骤和代码示例:

实现步骤

  1. 提前初始化SPI1引脚:把你已有的SPI1引脚配置代码放在setup()最开头,确保引脚映射生效
  2. 显式指定SPI1初始化SD卡:调用SD库的重载初始化方法,传入SPI1对象和CS引脚
  3. SPI事务安全处理:为避免总线冲突,操作SD卡时用SPI1.beginTransaction()和SPI1.endTransaction()包裹操作

完整代码示例

#include <SD.h>

// 你的SPI1 CS引脚定义
const int SD_CS_PIN = 13;

void setup() {
  Serial.begin(115200);
  while (!Serial);

  // 初始化SPI1引脚
  SPI1.setRX(12);
  SPI1.setTX(15);
  SPI1.setSCK(14);
  SPI1.setCS(SD_CS_PIN);

  // 初始化SD卡,显式传入SPI1对象
  if (!SD.begin(SD_CS_PIN, SPI1)) {
    Serial.println("SD卡初始化失败");
    while (1); // 初始化失败则暂停程序
  }
  Serial.println("SD卡初始化成功");
}

void loop() {
  // 示例:读取SD卡根目录文件列表
  SPI1.beginTransaction(SPISettings(1000000, MSBFIRST, SPI_MODE0)); // 开启SPI事务
  File root = SD.open("/");
  if (root) {
    while (File file = root.openNextFile()) {
      Serial.print("文件:");
      Serial.println(file.name());
      file.close();
    }
    root.close();
  }
  SPI1.endTransaction(); // 结束SPI事务

  delay(5000);
}

关键注意事项

  • 若你使用的SD库没有SD.begin(csPin, SPIClass&)重载版本,建议更换为适配arduino-pico核心的SD库
  • 确保SPI1和SPI0的操作不要交叉执行,每次操作完一个总线的设备后及时结束事务,避免总线时序混乱
  • 可根据SD卡规格调整SPI频率(示例用1MHz保证稳定性,稳定后可尝试提升至10MHz以上)

内容的提问来源于stack exchange,提问作者Nataniel Slowikowski

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 10:25:15