NUCLEO-F103RB与MAX31865 SPI同步写入失败问题求助
MAX31865 SPI写入故障排查(NUCLEO-F103RB)
我正在将MAX31865温度传感器通过SPI集成到NUCLEO-F103RB开发板,但无法完成单次写入传输,SPI波形参考此处。
现有代码
初始化函数
void INIT_SPI_MAX(void) { uint8_t spi_reg =0b11000000; //V_BIAS ON, Auto off, 4-wire, returns all fault status bits in register, 50Hz uint16_t low_fault = (100) & 0x7FFF;; uint8_t threshold[2] = {0x85, 0x86}; //RTD resistance data address registers SPI_Write1Byte(0x80); SPI_Write1Byte(spi_reg); SPI_Write1Byte(threshold[0]); SPI_Write1Byte((uint8_t)((low_fault & 0xFF00) >> 8)); SPI_Write1Byte(threshold[1]); SPI_Write1Byte((uint8_t)((low_fault & 0x00FF) << 1)); }
字节写入函数
void SPI_Write1Byte(uint8_t data) { HAL_GPIO_WritePin(CS_GPIO_Port, CS_Pin, GPIO_PIN_RESET); HAL_Delay(1); HAL_SPI_Transmit(&hspi1, &data, 1, HAL_MAX_DELAY); HAL_GPIO_WritePin(CS_GPIO_Port, CS_Pin, GPIO_PIN_SET); HAL_Delay(1); }
环境与配置
- 代码在PIC单片机MPLAB环境中可正常运行
- STM32 Cube IDE配置SPI模式3(CPOL:HIGH、CPHA:2 Edge)
- GPIO配置确认无误(CS为GPIO_OUTPUT)
- SPI时钟为32分频,2MBits/s(传感器支持最高5MBits/s)
排查方向
- CS时序错误:MAX31865要求寄存器写入需在同一CS拉低周期内完成地址+数据的连续传输,当前代码每次单字节都独立拉放CS,不符合传感器的SPI传输协议。比如写配置寄存器应改为:CS拉低→发送0x80→发送spi_reg→CS拉高,而非分两次调用SPI_Write1Byte。
- HAL传输状态检查:给
HAL_SPI_Transmit添加返回值判断,确认是否返回HAL_OK,排查底层SPI硬件是否存在总线错误、超时等问题。 - 时序一致性验证:用示波器对比STM32与PIC的SPI波形,确认CLK空闲电平、数据采样边沿是否完全匹配模式3的要求(空闲高电平,第二个边沿采样)。
- 延迟优化:1ms的延迟可能冗余,尝试替换为微秒级延时(比如使用
HAL_Delay(0)或自定义微秒函数),避免传感器因时序超时丢弃数据。 - 寄存器格式核对:写入阈值寄存器时,
low_fault <<1操作是否符合MAX31865的15位数据格式(最低位保留为0)?需对照数据手册确认该操作的正确性。
内容的提问来源于stack exchange,提问作者Manuel Orsini
相关产品推荐
相关产品推荐

