


针对使用LL库时SPI通讯溢出的问题,以下是可能的原因及解决方案:
// 当检测到溢出时,按顺序读取DR和SR寄存器以清除标志
if (LL_SPI_IsActiveFlag_OVR(SPI1)) {
LL_SPI_ClearFlag_OVR(SPI1); // 通过读取DR和SR清除OVR标志
}// 检查主从设备的CPOL和CPHA设置
LL_SPI_SetClockPolarity(SPI1, LL_SPI_POLARITY_LOW); // CPOL=0
LL_SPI_SetClockPhase(SPI1, LL_SPI_PHASE_1EDGE); // CPHA=0// 明确设置数据长度为8位或16位
LL_SPI_SetDataWidth(SPI1, LL_SPI_DATAWIDTH_8BIT); // 8位数据// 发送数据后立即等待接收完成
LL_SPI_TransmitData8(SPI1, tx_data);
while (!LL_SPI_IsActiveFlag_RXNE(SPI1)); // 等待接收完成
rx_data = LL_SPI_ReceiveData8(SPI1); // 及时读取数据// 配置DMA接收通道
LL_DMA_SetDataLength(DMA1, LL_DMA_STREAM_0, buffer_size);
LL_DMA_SetMemoryAddress(DMA1, LL_DMA_STREAM_0, (uint32_t)rx_buffer);
LL_DMA_SetPeriphAddress(DMA1, LL_DMA_STREAM_0, LL_SPI_DMA_GetRegAddr(SPI1));
LL_DMA_EnableStream(DMA1, LL_DMA_STREAM_0);// 使用软件控制NSS时,手动拉低/拉高片选信号
LL_GPIO_ResetOutputPin(GPIOA, LL_GPIO_PIN_4); // 拉低NSS
// 执行SPI传输...
LL_GPIO_SetOutputPin(GPIOA, LL_GPIO_PIN_4); // 拉高NSS// 最后一步再使能SPI
LL_SPI_Enable(SPI1);CR1、CR2、SR寄存器值,确认配置与实际操作一致。// SPI初始化(主机模式,8位数据)
void SPI_Init(void) {
LL_SPI_Disable(SPI1);
LL_SPI_SetMode(SPI1, LL_SPI_MODE_MASTER);
LL_SPI_SetDataWidth(SPI1, LL_SPI_DATAWIDTH_8BIT);
LL_SPI_SetClockPolarity(SPI1, LL_SPI_POLARITY_LOW);
LL_SPI_SetClockPhase(SPI1, LL_SPI_PHASE_1EDGE);
LL_SPI_SetBaudRatePrescaler(SPI1, LL_SPI_BAUDRATEPRESCALER_DIV8);
LL_SPI_Enable(SPI1);
}
// 发送并接收1字节数据
uint8_t SPI_Transfer(uint8_t tx_data) {
while (!LL_SPI_IsActiveFlag_TXE(SPI1)); // 等待发送缓冲区空
LL_SPI_TransmitData8(SPI1, tx_data);
while (!LL_SPI_IsActiveFlag_RXNE(SPI1)); // 等待接收完成
return LL_SPI_ReceiveData8(SPI1); // 读取数据
}通过以上步骤排查,应能解决SPI溢出问题。若仍有异常,建议提供具体配置代码片段以便进一步分析。
举报
更多回帖