树莓派Pico(Arduino核心)如何通过SPI1而非SPI0使用SD卡模块?
在树莓派Pico上用SPI1驱动SD卡(替代SPI0)
针对你的场景,要让SD卡库切换到SPI1,核心是在初始化SD卡时显式指定SPI1对象,而非默认的SPI(SPI0)。以下是具体实现步骤和代码示例:
实现步骤
- 提前初始化SPI1引脚:把你已有的SPI1引脚配置代码放在
setup()最开头,确保引脚映射生效 - 显式指定SPI1初始化SD卡:调用SD库的重载初始化方法,传入SPI1对象和CS引脚
- 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
相关产品推荐
相关产品推荐

