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

使用SPI1时Raspberry Pi Pico崩溃,SPI0正常的问题求助

问题排查与解决方案

核心问题定位

调用spi_write16_blocking(spi1, ...)时系统完全死机,SPI0正常工作,说明问题集中在SPI1的硬件配置、初始化流程或引脚复用冲突上,和发送的数据值无关。

具体排查步骤

1. 检查SPI1的引脚配置是否正确

Pico的SPI1默认引脚为:

  • SCK: GP10
  • MOSI: GP11
  • MISO: GP12
  • CS: GP13(若使用片选)
    如果硬件接线与默认引脚不符,必须在初始化时重新映射引脚,且不能与编码器、LCD的引脚重叠。示例初始化代码:
spi_init(spi1, 1000000); // 初始化SPI1波特率为1MHz
gpio_set_function(10, GPIO_FUNC_SPI); // 配置SCK引脚
gpio_set_function(11, GPIO_FUNC_SPI); // 配置MOSI引脚
// 若用到MISO或CS引脚,需对应配置GPIO功能

若引脚被其他外设占用,会直接引发总线冲突导致死机。

2. 确认SPI1初始化流程完整

SPI1必须在使用前完成完整初始化:

  • 调用spi_init()设置波特率
  • 将对应引脚配置为SPI功能
  • 若使用片选引脚,需设置为输出并默认拉高(保证未选中从设备)
    跳过初始化直接调用spi_write16_blocking会触发硬件错误导致死机。

3. 排查时钟树冲突

Pico的SPI时钟来自系统时钟分频,检查是否有其他外设(如PWM、I2C)占用SPI1的时钟通道,或分频配置错误导致时钟异常。可尝试降低SPI1波特率测试(如从1MHz降至100kHz),观察是否仍死机。

4. 检查DMA占用冲突

spi_write16_blocking底层可能使用DMA传输,若SPI1的DMA通道被LCD刷新、编码器中断等外设占用,会引发DMA死锁。可改用非DMA的手动发送测试:

uint16_t data = Ctrl_bit_and_data_LV;
spi_write16(spi1, data >> 8); // 手动发送高字节
spi_write16(spi1, data & 0xFF); // 手动发送低字节

若手动发送正常,说明是DMA通道冲突,需重新分配DMA通道。

5. 排查硬件接线问题

  • 检查SPI1的SCK/MOSI引脚是否与其他设备短路
  • 确认目标PCB的SPI接口电平匹配(Pico为3.3V,若目标板是5V需加电平转换)
  • 排查目标PCB的SPI从设备是否存在硬件故障,导致总线被拉低卡死

代码层面快速验证

简化Mode_Counter == 3分支的代码,移除无关逻辑,仅保留SPI1发送,验证是否仍死机:

if(Mode_Counter == 3) {
    uint16_t test_data = 0x1234;
    spi_write16_blocking(spi1, &test_data, 1);
}

若简化后仍死机,说明问题不在data_LV相关逻辑,而是SPI1本身的配置问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 04:05:40