# SPI：DMA CRC错误，从设备接收到的CRC不匹配，期望0x1A2B实际为0x3C4D

- **ID:** `embedded/spi-dma-crc-error-stm32`
- **领域:** embedded
- **类别:** protocol_error
- **验证级别:** ai_generated
- **修复率:** 92%

## 根因

主从设备间CRC计算不匹配，原因是多项式设置不同或STM32 SPI硬件CRC模式下DMA传输长度未对齐。

## 版本兼容性

| 版本 | 状态 | 引入 | 弃用 |
|------|------|------|------|
| STM32Cube_FW_H7 v1.10.0 | active | — | — |
| ARM GCC v12.2.1 | active | — | — |
| SPI HAL driver v2.4.0 | active | — | — |

## 解决方案

1. ```
   在主从设备上设置相同的CRC多项式：SPI_InitTypeDef.CRCPolynomial = 7；并确保SPI_CRCPR寄存器匹配。对于DMA，在配置CRC长度后设置SPI_CR2.TXDMAEN/RXDMAEN。
   ```
2. ```
   将DMA传输大小与CRC长度对齐：如果CRC是16位，确保总传输长度是2字节的倍数。使用包含CRC字节的缓冲区大小的HAL_SPI_TransmitReceive_DMA()。
   ```

## 无效尝试

- **Disable SPI CRC hardware and implement software CRC** — Software CRC adds latency and may conflict with DMA timing; hardware CRC mismatch root cause remains unaddressed. (80% 失败率)
- **Swap master and slave roles** — Role swap does not fix polynomial or length mismatch; error may move but persists. (90% 失败率)
