You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

寻求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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 16:53:16