基于 XMC4000 的硬件特性,需通过 “引脚选型→USIC 通道配置→时钟树优化→信号完整性设计” 四步流程,实现稳定的超高速 SPI 传输。以下以 XMC4700 RELAX KIT(常用开发板)为例,提供具体配置方案:
1. 第一步:精准选择 A2 型引脚与 USIC1 通道
XMC4700 的引脚手册中,明确标注了各引脚的 Pad Type 与可复用的 USIC 通道。
配置要点:在 DAVE 环境中,需通过 “Pin Multiplexer” 工具手动将上述引脚复用为 USIC1_CH0 功能,而非依赖默认的引脚分配 —— 默认配置可能将 SPI 绑定到 USIC0 通道,导致速率受限。
2. 第二步:USIC 模块的高速模式配置(LLD 级优化)
DAVE 提供的 “APP 配置”(如 SPI_Master_APP)仅支持基础速率配置,需通过 LLD(底层驱动)代码手动开启 USIC1 的高速特性:
c
运行
#include "xmc_usic.h"
#include "xmc_gpio.h"
// USIC1_CH0 SPI高速配置
void spi_highspeed_init(void)
{
// 1. 配置USIC1_CH0为SPI主模式
XMC_USIC_CH_Config_t usic_config = {
.mode = XMC_USIC_CH_OPERATING_MODE_SPI_MASTER,
.baudrate = 25000000UL, // 25MHz SPI时钟
.data_bits = 8U,
.clock_polarity = XMC_SPI_CLOCK_POLARITY_0,
.clock_phase = XMC_SPI_CLOCK_PHASE_0
};
XMC_USIC_CH_Init(XMC_USIC1_CH0, &usic_config);
// 2. 开启USIC1高速时钟校准(补偿传输延迟)
XMC_USIC_CH_SetClockCalibration(XMC_USIC1_CH0, XMC_USIC_CH_CLOCK_CALIBRATION_ENABLED);
// 3. 配置SPI全双工模式(DOUT0与DIN0独立)
XMC_USIC_CH_SPI_SetTransmitMode(XMC_USIC1_CH0, XMC_SPI_TRANSMIT_MODE_DOUBLE_BUFFERED);
XMC_USIC_CH_SPI_SetReceiveMode(XMC_USIC1_CH0, XMC_SPI_RECEIVE_MODE_DOUBLE_BUFFERED);
// 4. 启用USIC1_CH0中断(处理双缓冲区数据)
NVIC_SetPriority(USIC1_0_IRQn, 1U);
NVIC_EnableIRQ(USIC1_0_IRQn);
}
关键说明:通过XMC_USIC_CH_SetClockCalibration函数开启时钟校准后,USIC 模块会自动补偿时钟信号的传输延迟(最大补偿 10ns),解决 20MHz 以上时钟的 “边沿错位” 问题。
3. 第三步:时钟树优化(确保 USIC1 获得稳定高速时钟)
XMC4700 的系统时钟最高为 144MHz,需通过合理的时钟分频,为 USIC1 提供稳定的输入时钟:
USIC1 时钟源选择:优先选择 “PLL1 输出” 作为 USIC1 的时钟源(PLL1 可配置为 120MHz 输出);
分频系数计算:若需 25MHz SPI 时钟,USIC1 的分频系数 = 120MHz / 25MHz = 4.8?—— 实际需选择整数分频,因此将 PLL1 输出调整为 125MHz,分频系数设为 5(125MHz / 5 = 25MHz)。
时钟配置代码示例:
c
运行
void clock_config(void)
{
// 1. 配置PLL1为125MHz输出(USIC1时钟源)
XMC_SCU_CLOCK_Init_t clock_init = {
.pll_config = {
.source = XMC_SCU_CLOCK_PLL_SOURCE_OSCHP,
.divider = 2U, // 外部高速晶振(25MHz)分频为12.5MHz
.multiplier = 10U // 12.5MHz * 10 = 125MHz
},
.sysclk_config = {
.source = XMC_SCU_CLOCK_SYSTEM_SOURCE_PLL1,
.divider = 1U // 系统时钟=125MHz
}
};
XMC_SCU_CLOCK_Init(&clock_init);
// 2. 配置USIC1时钟为PLL1输出(125MHz)
XMC_SCU_CLOCK_SetUSICClockSource(XMC_SCU_CLOCK_USIC1, XMC_SCU_CLOCK_USIC_SOURCE_PLL1);
// 3. USIC1分频系数=5(125MHz / 5 = 25MHz SPI时钟)
XMC_USIC_CH_SetClockDivider(XMC_USIC1_CH0, 5U);
}
4. 第四步:硬件设计的信号完整性优化
即使软件配置正确,若硬件布线不符合高速信号要求,仍会出现数据错误。超 20MHz SPI 传输的硬件设计要点:
阻抗匹配:SPI 信号线(SCK、MOSI、MISO)的特征阻抗需匹配为 50Ω,且布线长度差≤3mm(避免时延差导致的信号 skew);
过孔数量:每路 SPI 信号的过孔数量≤2 个,过孔会引入寄生电感,导致信号反射;
电源滤波:在 XMC4700 的 3.3V 电源引脚旁(靠近 USIC1 模块)放置 1 个 100nF 陶瓷电容 + 1 个 10μF 钽电容,抑制电源噪声对 USIC 模块的干扰;
NSS 引脚处理:超高速传输时,NSS 信号需与 SCK 信号同步,建议将 NSS 也配置为 A2 型引脚,并与 SCK 布线平行(减少串扰)。
|
|