寻求XMC4700与ADS7961 SPI接口电流传感器驱动代码示例
ADS7961 + XMC4700 SPI驱动排查与示例代码
核心排查点(对比Arduino配置差异)
- 确认SPI模式:ADS7961使用SPI Mode 0(CPOL=0,CPHA=0),XMC4700的SPI控制器必须匹配该模式,Arduino默认Mode 0但XMC需要手动配置寄存器。
- 时钟分频:ADS7961最高支持20MHz,XMC的SPI时钟需通过
SCU_CCUCON和SPI分频寄存器调整,避免超出器件上限。 - CS引脚控制:ADS7961低电平有效,XMC的CS引脚要配置为推挽输出,传输前拉低,传输完成后拉高,不建议用硬件自动CS(部分XMC SPI外设的自动CS时序可能不匹配)。
- 数据帧格式:ADS7961采用16位MSB优先传输,XMC需设置SPI为16位帧长度,或分两次8位传输(先写高字节配置,再读低字节采样)。
示例代码片段
SPI初始化(XMC4700)
#include <xmc_spi.h> #include <xmc_gpio.h> #define SPI_MASTER XMC_SPI0_CH0 #define CS_PIN P1_5 void SPI_Init(void) { // 配置SPI引脚映射 XMC_GPIO_SetMode(P1_2, XMC_GPIO_MODE_OUTPUT_PUSH_PULL_ALT7); // SCK XMC_GPIO_SetMode(P1_3, XMC_GPIO_MODE_OUTPUT_PUSH_PULL_ALT7); // MOSI XMC_GPIO_SetMode(P1_4, XMC_GPIO_MODE_INPUT_TRISTATE_ALT7); // MISO XMC_GPIO_SetMode(CS_PIN, XMC_GPIO_MODE_OUTPUT_PUSH_PULL); XMC_GPIO_SetOutputHigh(CS_PIN); // 初始CS拉高 // SPI控制器核心配置 XMC_SPI_CH_CONFIG_t spi_config = { .baudrate = 10000000, // 10MHz,低于20MHz上限 .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, .word_length = 16U, // 匹配ADS7961的16位传输 .shift_out = XMC_SPI_CH_SHIFT_OUT_MSB_FIRST, .clock_polarity = XMC_SPI_CH_CLOCK_POLARITY_0, // Mode 0 .clock_phase = XMC_SPI_CH_CLOCK_PHASE_0 }; XMC_SPI_CH_Init(SPI_MASTER, &spi_config); XMC_SPI_CH_SetInputSource(SPI_MASTER, XMC_SPI_CH_INPUT_DIN0, USIC0_C0_DX0_P1_4); XMC_SPI_CH_Start(SPI_MASTER); }
读取ADS7961通道数据
uint16_t ADS7961_ReadChannel(uint8_t channel) { uint16_t tx_data = 0; uint16_t rx_data = 0; // 构造配置帧:单通道读取模式,选择目标通道(参考ADS7961 datasheet) tx_data = (0x08 << 12) | (channel << 9); XMC_GPIO_SetOutputLow(CS_PIN); // 拉低CS启动传输 // 发送配置并同步读取采样值 XMC_SPI_CH_Transmit(SPI_MASTER, tx_data); while(XMC_SPI_CH_GetStatusFlag(SPI_MASTER, XMC_SPI_CH_STATUS_FLAG_TRANSMIT_IN_PROGRESS)); rx_data = XMC_SPI_CH_GetReceivedData(SPI_MASTER); XMC_GPIO_SetOutputHigh(CS_PIN); // 传输完成拉高CS // 提取12位有效采样值(高4位为状态位,低12位是采样数据) return (rx_data & 0x0FFF); }
额外调试提示
- 用示波器抓取SCK、CS、MOSI信号,验证时序是否符合ADS7961 datasheet要求,重点看CS拉低后是否有连续的SCK脉冲,数据帧是否正确输出。
- 若仍无输出,可尝试在CS拉低后添加1-2us的延时,部分器件需要稳定的CS信号后才响应SPI传输。
内容的提问来源于stack exchange,提问作者Kshitij Palghane
相关产品推荐
相关产品推荐

