
小华 HC32F4A0 Rev2.2.0 驱动库中的 SPI_Init() 函数对 SPI 的配置时序如下:
- 先写 SPIx->CR1 寄存器
- 后写 SPIx->CFG1 和 SPIx->CFG2 寄存器
这样的配置顺序在使用 mode0 或 mode1 时没有问题,但是在使用 mode2 或 mode3 时会导致在 SCLK 上出现一个下降的脉冲,该脉冲会被当成一个时钟,进而导致数据错误。
hc32_ll_spi.cint32_t SPI_Init(CM_SPI_TypeDef *SPIx, const stc_spi_init_t *pstcSpiInit) { ...
WRITE_REG32(SPIx->CR1, pstcSpiInit->u32WireMode | pstcSpiInit->u32TransMode | pstcSpiInit->u32MasterSlave | pstcSpiInit->u32SuspendMode | pstcSpiInit->u32ModeFaultDetect | pstcSpiInit->u32Parity); MODIFY_REG32(SPIx->CFG1, SPI_CFG1_FTHLV, pstcSpiInit->u32FrameLevel); WRITE_REG32(SPIx->CFG2, pstcSpiInit->u32SpiMode | pstcSpiInit->u32BaudRatePrescaler | pstcSpiInit->u32DataBits | pstcSpiInit->u32FirstBit);
... }
|
修改成以下顺序便可规避该问题:
- 先写 SPIx->CFG1 和 SPIx->CFG2 寄存器
- 后写 SPIx->CR1 寄存器
hc32_ll_spi.cint32_t SPI_Init(CM_SPI_TypeDef *SPIx, const stc_spi_init_t *pstcSpiInit) { ...
MODIFY_REG32(SPIx->CFG1, SPI_CFG1_FTHLV, pstcSpiInit->u32FrameLevel); WRITE_REG32(SPIx->CFG2, pstcSpiInit->u32SpiMode | pstcSpiInit->u32BaudRatePrescaler | pstcSpiInit->u32DataBits | pstcSpiInit->u32FirstBit); WRITE_REG32(SPIx->CR1, pstcSpiInit->u32WireMode | pstcSpiInit->u32TransMode | pstcSpiInit->u32MasterSlave | pstcSpiInit->u32SuspendMode | pstcSpiInit->u32ModeFaultDetect | pstcSpiInit->u32Parity);
... }
|
