要正确配置 XMC4300 的 SPI 主机模式,需确保时钟极性、相位、数据帧长度等参数与从机严格匹配。以下是针对您需求的配置步骤和示例代码(基于 DAVE™ IDE 或直接寄存器操作):
关键配置参数
- 模式:主机(Master)
- 时钟极性(CPOL):空闲低电平(0)
- 时钟相位(CPHA):数据在下降沿采样(1)
- 数据帧:16 位
- 移位顺序:MSB 优先
- 时钟频率:6 MHz
- 片选(CS)控制:软件手动控制(确保传输期间有效)
配置步骤(DAVE™ APP 或寄存器级)
1. 初始化 SPI 通道(以 USIC0_CH0 为例)
#include
#define SPI_MASTER XMC_SPI0_CH0
#define SPI_BAUDRATE 6000000u // 6 MHz
#define SPI_DATA_BITS 16u // 16 位数据帧
// SPI 配置结构体
XMC_SPI_CH_CONFIG_t spi_config = {
.baudrate = SPI_BAUDRATE,
.bus_mode = XMC_SPI_CH_BUS_MODE_MASTER, // 主机模式
.selo_inversion = XMC_SPI_CH_SLAVE_SEL_INV_TO_MSLS, // 片选极性
.parity_mode = XMC_USIC_CH_PARITY_MODE_NONE // 无校验
};
// 初始化 SPI 通道
XMC_SPI_CH_Init(SPI_MASTER, &spi_config);
// 设置数据帧格式
XMC_SPI_CH_SetBitLength(SPI_MASTER, SPI_DATA_BITS);
XMC_SPI_CH_SetFrameLength(SPI_MASTER, 64u); // 大于等于数据位即可
// 配置时钟特性:CPOL=0, CPHA=1 (Mode 1)
XMC_SPI_CH_ConfigureShiftClockOutput(
SPI_MASTER,
XMC_SPI_CH_BRG_SHIFT_CLOCK_PASSIVE_LEVEL_0, // 空闲低电平
XMC_SPI_CH_BRG_SHIFT_CLOCK_OUTPUT_SCLKOPT_1 // 下降沿采样(CPHA=1)
);
// 启用 MSB 优先
XMC_SPI_CH_SetTransmitMode(SPI_MASTER, XMC_SPI_CH_TRANSFER_MODE_0);
// 启用 SPI 通道
XMC_SPI_CH_Start(SPI_MASTER);
2. 配置 GPIO 引脚(SCLK/MOSI/MISO/CS)
// SCLK (P0.13)
XMC_GPIO_CONFIG_t sclk_config = {
.mode = XMC_GPIO_MODE_OUTPUT_PUSH_PULL_ALT7, // USIC 功能
.output_level = XMC_GPIO_OUTPUT_LEVEL_LOW
};
XMC_GPIO_Init(P0_13, &sclk_config);
// MOSI (P0.14)
XMC_GPIO_CONFIG_t mosi_config = {
.mode = XMC_GPIO_MODE_OUTPUT_PUSH_PULL_ALT7
};
XMC_GPIO_Init(P0_14, &mosi_config);
// MISO (P0.15)
XMC_GPIO_CONFIG_t miso_config = {
.mode = XMC_GPIO_MODE_INPUT_TRISTATE // 浮空输入
};
XMC_GPIO_Init(P0_15, &miso_config);
// 软件片选 CS (自定义 GPIO,如 P0.12)
XMC_GPIO_CONFIG_t cs_config = {
.mode = XMC_GPIO_MODE_OUTPUT_PUSH_PULL,
.output_level = XMC_GPIO_OUTPUT_LEVEL_HIGH // 初始高电平(无效)
};
XMC_GPIO_Init(P0_12, &cs_config);
3. 数据传输函数(发送 22 个 16 位字)
void SPI_TransmitPacket(uint16_t *data, uint32_t len) {
// 拉低 CS(使能从机)
XMC_GPIO_SetOutputLow(P0_12);
for (uint32_t i = 0; i < len; i++) {
// 等待发送缓冲空
while (!XMC_SPI_CH_GetTransmitBufferStatus(SPI_MASTER));
// 发送 16 位数据
XMC_SPI_CH_Transmit(SPI_MASTER, data[i], XMC_SPI_CH_MODE_STANDARD);
// 可选:等待接收(全双工时需读取)
// while (!XMC_SPI_CH_GetReceiveBufferStatus(SPI_MASTER));
// uint16_t rx = XMC_SPI_CH_GetReceivedData(SPI_MASTER);
}
// 等待最后一次传输完成
while (!XMC_USIC_CH_GetTransmitBufferStatus(SPI_MASTER->channel));
// 拉高 CS(释放从机)
XMC_GPIO_SetOutputHigh(P0_12);
}
常见问题排查
片选(CS)信号问题:
- 使用 软件控制 CS 确保每次传输前拉低、结束后拉高。
- 传输期间逻辑分析仪检查 CS 是否持续有效(低电平)。
时钟相位/极性不匹配:
- 主机 CPOL=0/CPHA=1(Mode 1)必须严格匹配从机配置。
- 逻辑分析仪验证:SCLK 空闲低电平,数据在下降沿采样。
数据对齐问题:
- 确保主机和从机均为 16 位帧,MSB 优先。
- 检查传输函数是否正确处理 16 位数据(
uint16_t 类型)。
时钟频率偏差:
- 使用逻辑分析仪测量实际 SCLK 频率是否为 6 MHz。
- 计算公式:
SCLK = f_PERIPH / (DV + 1),调整分频值 DV。
延迟不足:
调试建议
逻辑分析仪检查:
- 捕获 SCLK、MOSI、MISO、CS 波形,验证时序是否符合 Mode 1。
- 对比主机发送的数据与从机接收的数据是否一致。
简化测试:
- 先发送单字(如
0xAA55),检查从机是否收到正确值。
- 逐步增加数据长度至 22 字。
STM32 从机配置:
通过以上配置和排查步骤,您应能解决 SPI 主机模式的数据异常问题。确保主从设备参数严格同步,重点关注时序波形和片选信号的控制。