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

RSL10使用CMSIS驱动配置SPI接收无回调、CS引脚无法拉高问题求助

故障排查与解决步骤

1. 优先检查SPI中断是否使能

RSL10的CMSIS SPI驱动依赖外设中断触发回调函数,你当前初始化代码中没有开启SPI0的NVIC中断,是最可能的故障原因。请在SPI初始化代码段中补充中断配置:

// 补充在spi0->PowerControl调用之后即可
NVIC_EnableIRQ(SPI0_IRQn);
NVIC_SetPriority(SPI0_IRQn, 2); // 优先级可根据你的项目需求调整

2. 补充异步传输等待逻辑

CMSIS SPI的Receive接口是异步非阻塞的,你当前代码调用完Receive后直接打印数据,此时传输还未执行,也没有等待回调触发。你需要增加全局传输完成标志位实现等待逻辑:

  • 先定义全局标志:
volatile uint8_t spi_transfer_done = 0;
  • 回调函数中修改标志位:
case ARM_SPI_EVENT_TRANSFER_COMPLETE:
{
    PRINTF("TRANSFER COMPLETE\n");
    spi_transfer_done = 1; // 新增标志位置1
    spi0->Control(ARM_SPI_CONTROL_SS, ARM_SPI_SS_INACTIVE);
}
break;
  • 接收逻辑中增加等待:
uint8_t sensor_data[12] = {0};
spi_transfer_done = 0; // 每次传输前先清空标志
spi0->Control(ARM_SPI_CONTROL_SS, ARM_SPI_SS_ACTIVE);
int32_t ret = spi0->Receive(sensor_data, 12);
// 先判断接口调用是否成功
if(ret != ARM_DRIVER_OK) {
    PRINTF("SPI Receive start failed, code: %d\n", ret);
    spi0->Control(ARM_SPI_CONTROL_SS, ARM_SPI_SS_INACTIVE);
    return;
}
// 等待传输完成,可加超时判断防止卡死
while(spi_transfer_done == 0);
PRINTF("DATA: %d %d %d\n", sensor_data[0], sensor_data[1], sensor_data[2]);

3. 硬件参数匹配检查

如果配置完上述两项仍未触发回调,请做以下硬件验证:

  • 用示波器同时挂SPI的CLK、MISO引脚,确认调用Receive后有12*8=96个周期的时钟输出,且MISO引脚有传感器返回的电平变化:如果没有时钟输出,检查SPI外设时钟是否开启;如果没有MISO数据,确认你设置的CPOL/CPHA(当前为模式3)、SPI速率10MHz是否符合传感器手册要求,以及读指令(你设置的默认TX值为0x80)是否正确。
  • 确认你使用的SPI0引脚没有被其他外设复用占用,RSL10的引脚复用配置需在系统初始化时完成,可检查你项目的pinmux配置是否正确。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 21:06:04