在ESP32双核下,loopTask默认运行在Core1,自定义任务若也跑在Core1且优先级高于loopTask,会抢占loopTask导致SPI事务被中断;若跑在Core0则真正并行。因此必须用互斥锁保护整段SPI事务(片选拉低到拉高),而不是只保护单次transfer。推荐用xSemaphoreCreateMutex创建递归锁,在spi_begin_transaction前take、end_transaction后give,并设置合理超时(如100ms),超时返回错误而非死等。注意Arduino的SPI库内部已有总线锁,但只覆盖单次传输,跨多次transfer的原子性需自己加锁。排查总线仲裁超时:先确认是否有任务在持锁期间调用delay或等待队列;检查锁是否被高优先级任务长期占用;用uxSemaphoreGetCount和xPortGetCoreID打印持锁者;必要时用逻辑分析仪看CS信号是否被意外拉高。避免在持锁时调用Serial打印,其内部锁可能引发优先级反转。