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
相关产品推荐
相关产品推荐

