NXP社区的各位好,
我正在使用 S32K388,并配置 LPSPI 波特率。我有一个关于 SCKDIV 值计算的问题。
我的理解:
根据 S32K3xx 参考手册,LPSPI 波特率公式为:
```
SCK = LPSPI_CLK / (PRESCALE_DIV × (SCKDIV + 1))
```
我的配置:
- LPSPI 时钟源:AIPS_SLOW_CLK = 40 MHz
目标波特率:1 MHz
- PRESCALE = 0 (÷1)
我的计算结果:
```
SCDKIV = (LPSPI_CLK / 波特率) - 1
SCKDIV = (40 MHz / 1 MHz) - 1 = 39
```
**S32DS 生成的代码:**
但是,当我使用 S32DS 生成配置时,却出现以下错误:
```c
LPSPI_CCR_SCKDIV(38U) // SCKDIV = 38
```
**问题:**
当 SCKDIV=38 时,实际除法系数为 39,这意味着:
```
实际波特率 = 40 MHz / 39 = 1,025,641 Hz ≈ 1.026 MHz
```
与目标 1 MHz 相比,误差约为 2.56%。
为什么 S32DS 使用 SCKDIV=38 而不是 SCKDIV=39?S32DS 配置中是否使用了不同的 LPSPI 时钟频率,或者选择这种频率还有其他原因?
**补充背景信息:**
我使用的是 S32DS 3.5
- S32K388 参考手册 Rev. 6
- 该项目是使用默认时钟配置创建的
感谢您提前提供的任何解释!
顺祝商祺!
首先,请注意,S32K3xx 参考手册的最新可用版本是 Rev. 12。您当前使用的版本包含有关 S32K310、S32K311 和 S32K3x8 设备的初步信息,这些设备在发布该文档时尚未发布。因此,我建议下载并参考RM的最新版本。
关于 LPSPI 波特率的计算,时钟配置寄存器 (CCR) 中 SCKDIV 字段的描述如下:
波特率 = 功能时钟 ÷ (2^预分频 × (SCKSET + SCKHLD + 2))
其中 SCKSET 和 SCKHLD 由 SCKDIV ÷ 2 得出。
考虑到 SCKDIV = 38:
SCKSET = SCKHLD = 38 ÷ 2 = 19
波特率 = 40 MHz ÷ (2^0 × (19 + 19 + 2)) = 1 MHz,与预期值相符。
BR,VaneB