HC32F072 SPI不输出时钟信号SCK的解决方法在调试华大HC32F072的 SPI 驱动时很多人习惯用普通 GPIO 软件控制外围器件的片选CS引脚。但如果只拉低了物理片选往往会发现SCK 引脚没有任何波形输出。问题根因只调用物理片选引脚是不行的。HC32F072 的 SPI 控制器内部有一个状态机类似控制内部 SSI 位。如果不用硬件 NSS 模式SPI 外设内部就需要通过库函数显式地切换状态。如果没有这个切换SPI 状态机会认为没有选中从机或发生多主机冲突从而直接锁死 SCK 时钟输出。解决办法在物理片选拉低之后、开始传输数据之前必须调用库函数Spi_SetCS(M0P_SPIx, FALSE)来激活内部状态机数据传输完成后再调用Spi_SetCS(M0P_SPIx, TRUE)释放。正确的传输代码示例Cvoid SPI1_Transfer(uint8_t *pTxData, uint8_t *pRxData, uint16_t u16Length) { // 1. 必须调用此函数激活内部状态机否则不输出 SCK Spi_SetCS(M0P_SPI1, FALSE); for(uint16_t i 0; i u16Length; i) { while (Reset Spi_GetStatus(M0P_SPI1, SpiTxEmpty)); // 等待发送空 Spi_SendData(M0P_SPI1, pTxData ? pTxData[i] : 0xFF); while (Reset Spi_GetStatus(M0P_SPI1, SpiRxFull)); // 等待接收满 if(pRxData) { pRxData[i] Spi_ReceiveData(M0P_SPI1); } else { Spi_ReceiveData(M0P_SPI1); } } // 2. 传输结束释放内部状态机 Spi_SetCS(M0P_SPI1, TRUE); }实际调用流程CSelectNss(4); // 1. 你的拉低物理 GPIO 片选函数 Spi_SetCS(M0P_SPI1, FALSE); // 2. 必须加这行激活内部状态机 SPI1_Transfer(...); // 3. 数据传输 Spi_SetCS(M0P_SPI1, TRUE); // 4. 必须加这行释放内部状态机 AllNss_OFF(); // 5. 你的拉高物理 GPIO 片选函数总结排查如果你的 HC32F072 SPI 依旧不出波形请检查以下三点SCK 无波形检查是否遗漏了Spi_SetCS。NSS 冲突如果把配置为 NSS 功能的引脚如 PB12悬空了可能会触发多主机冲突故障。建议将该引脚配置为普通 GPIO 并输出高电平避开功能复用。波特率不对检查Spi_Init时配置的波特率分频寄存器SPR是否被正确写入。
HC32F072 SPI不输出时钟信号(SCK)的解决方法
HC32F072 SPI不输出时钟信号SCK的解决方法在调试华大HC32F072的 SPI 驱动时很多人习惯用普通 GPIO 软件控制外围器件的片选CS引脚。但如果只拉低了物理片选往往会发现SCK 引脚没有任何波形输出。问题根因只调用物理片选引脚是不行的。HC32F072 的 SPI 控制器内部有一个状态机类似控制内部 SSI 位。如果不用硬件 NSS 模式SPI 外设内部就需要通过库函数显式地切换状态。如果没有这个切换SPI 状态机会认为没有选中从机或发生多主机冲突从而直接锁死 SCK 时钟输出。解决办法在物理片选拉低之后、开始传输数据之前必须调用库函数Spi_SetCS(M0P_SPIx, FALSE)来激活内部状态机数据传输完成后再调用Spi_SetCS(M0P_SPIx, TRUE)释放。正确的传输代码示例Cvoid SPI1_Transfer(uint8_t *pTxData, uint8_t *pRxData, uint16_t u16Length) { // 1. 必须调用此函数激活内部状态机否则不输出 SCK Spi_SetCS(M0P_SPI1, FALSE); for(uint16_t i 0; i u16Length; i) { while (Reset Spi_GetStatus(M0P_SPI1, SpiTxEmpty)); // 等待发送空 Spi_SendData(M0P_SPI1, pTxData ? pTxData[i] : 0xFF); while (Reset Spi_GetStatus(M0P_SPI1, SpiRxFull)); // 等待接收满 if(pRxData) { pRxData[i] Spi_ReceiveData(M0P_SPI1); } else { Spi_ReceiveData(M0P_SPI1); } } // 2. 传输结束释放内部状态机 Spi_SetCS(M0P_SPI1, TRUE); }实际调用流程CSelectNss(4); // 1. 你的拉低物理 GPIO 片选函数 Spi_SetCS(M0P_SPI1, FALSE); // 2. 必须加这行激活内部状态机 SPI1_Transfer(...); // 3. 数据传输 Spi_SetCS(M0P_SPI1, TRUE); // 4. 必须加这行释放内部状态机 AllNss_OFF(); // 5. 你的拉高物理 GPIO 片选函数总结排查如果你的 HC32F072 SPI 依旧不出波形请检查以下三点SCK 无波形检查是否遗漏了Spi_SetCS。NSS 冲突如果把配置为 NSS 功能的引脚如 PB12悬空了可能会触发多主机冲突故障。建议将该引脚配置为普通 GPIO 并输出高电平避开功能复用。波特率不对检查Spi_Init时配置的波特率分频寄存器SPR是否被正确写入。