This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] AFE031:AFE031 SPI 通信无法与 STM32 进行通信

Guru**** 2666065 points

Other Parts Discussed in Thread: AFE031, SYSCONFIG

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/amplifiers-group/amplifiers/f/amplifiers-forum/1587280/afe031-afe031-spi-communication-not-working-with-stm32

器件型号: AFE031

尊敬的 TI 团队:

我正在尝试与连接 AFE031 IC STM32 微控制器 但我无法获得正确的通信。
所有读取尝试都会返回 0xFF 和写入操作似乎不起作用。

以下是我的设置的详细信息:

Cube IDE SPI 配置:-

hspi1.instance = SPI1;
hspi1.Init.Mode = SPI_MODE_MASTER;
hspi1.Init.Direction = SPI_DIRECTION_2LINES;
hspi1.Init.DataSize = SPI_DATASIZE_8 位;
hspi1.Init.CLKPolarity = SPI_POLARITY_LOW ;
hspi1.Init.CLKPhase = SPI_PHASE_2EDGE
hspi1.Init.nss = SPI_NSS_SOFT;
hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_64;
hspi1.Init.FirstBit = SPI_FIRSTBIT_MSB;
hspi1.Init.TIMode = SPI_TIMODE_DISABLE;
hspi1.Init.CRCCcalculation = SPI_CRCCALCULATION_disable;
hspi1.Init.CRCPolynomial = 7;
hspi1.Init.CRCLlength = SPI_CRC_LENGTH_DATASIZE;
hspi1.Init.NSSPMode = SPI_NSS_PULSE_ENABLE;
HAL_SPI_Init (&hspi1);

 

SPI 写入操作:-  

uint8_t Spi_Write_Buffer [2];
Spi_Write_Buffer [0]= RegAddress & 0x7F; //写入命令 (MSB = 0)
Spi_Write_Buffer [1]=数据;

HAL_GPIO_WritePin (AFE_MODEM_CS_GPIO_Port、AFE_MODEM_CS_Pin、0);
HAL_SPI_TRANSMIT (&hspi1、Spi_Write_Buffer、2、HAL_MAX_DELAY);
HAL_GPIO_WritePin (AFE_MODEM_CS_GPIO_Port、AFE_MODEM_CS_Pin、1);

 

SPI 读取操作:-  

unsigned char Spi_Write_Buffer [2]={ 0x00 };
unsigned char Spi_Read_Buffer [2]={ 0x00 };

Spi_Write_Buffer [0]= RegAddress | 0x80; //读取命令 (MSB = 1)
Spi_Write_Buffer [1]= 0x00;

 HAL_GPIO_WritePin (AFE_MODEM_CS_GPIO_Port、AFE_MODEM_CS_Pin、0);
HAL_SPI_TRANSMIT (&hspi1、Spi_Write_Buffer、2、HAL_MAX_DELAY);
HAL_SPI_Receive (&hspi1、Spi_Read_Buffer、2、HAL_MAX_DELAY);
HAL_GPIO_WritePin (AFE_MODEM_CS_GPIO_Port、AFE_MODEM_CS_Pin、1);

 

AFE031 SPI 模式:CPOL = 1、CPHA = 1(模式 3)
DAC 引脚= 驱动至低电平
D 引脚= 驱动至低电平
MCU SPI FREQ = 3MHz(已测试 1.5 MHz)  

 

问题描述

  • 所有 SPI 读取操作都会返回0xFF

  • 写入操作似乎不会更新任何寄存器。

  • 示波器上的 SPI 信号 (SCK、MOSI 和 CS) 显示正确。

  • 验证了 STM32 和 AFE031 之间的引脚连接且正确。

 

请您帮忙确定一下 可能的原因 为什么即使 SPI 信号看起来正确、与 AFE031 的 SPI 通信也可能失败?
任何已知的初始化要求、时序注意事项或可能阻止寄存器访问的引脚条件都将非常有帮助。

 

谢谢您、
米德胡尔 P K

 

 

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Midhul、

    请允许我在明天和下周初有时间分享我的想法。  我可能会向您提出后续问题。

    此致、

    Alec

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Alec:

    感谢您发送编修。
    请抽出所需时间、如果您需要我方面的任何其他信息或说明、请随时联系我们。 我很乐意协助解答任何后续问题。

    此致、
    米德胡尔

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Midhul、

    感谢您抽出宝贵时间、我一定会跟进任何问题、想法或调试步骤供您尝试。

    此致、

    Alec

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 Alec、

    我已经完成了所有 SPI 配置步骤并验证了数据字段、但 IC 仍然没有响应。 我还检查了硬件并确认所有电源均正确。 您对我接下来应该检查什么有什么建议吗?

    此致、
    米德胡尔

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Midhul、

    您能否确认系统关断引脚 (SD) 的引脚 8?

    此致、

    Alec

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 Alec、

    是的、该引脚被设置为低电平。 在寄存器访问期间、DAC 引脚保持低电平。

    以下是我使用的 SPI 帧结构:

    typedef 联合体

       uint16_t Spi_Data;//完整 16 位帧

      结构
       {
        uint16_t Data:8;// LSB(AFE 预期最后数据)
        uint16_t 地址:7;//中间位
        Uint16_t RW:1;// MSB
       }位;

    uint8_t LSB[2];// buf[0]= Spi_Buffer、buf[1]= LSB

    } SPI_FRAME;

    SPI READ 函数:

    uint8_t AFE031_Uint8_t Read_Data (uint8_t reg)

    SPI_FRAME TX ={0};
    SPI_FRAME Rx ={0};

    tx.bits.rw = 1;//读取
    tx.bits.Address =寄存器;
    tx.bits.Data = 0x00;//虚拟

    AFE031_COM Chip_Select ();

    HAL_SPI_TRANSMIT (&hspi1、TX.COM Spi_Buffer、1100);
    HAL_SPI_TRANSMIT (&hspi1、TX.COM Spi_Buffer、1100);
    HAL_SPI_Receive (&hspi1、rx.pci Spi_Buffer、2100);

    AFE031_COM Chip_Deselect ();

    返回 rx.bits.Data;
    }

    SPI 写函数:-  

    void AFE031_uint8_t reg、Write_Data 值)

    SPI_FRAME TX ={0};

    tx.bits.rw = 0;//写入
    tx.bits.Address =寄存器;
    tx.bits.Data =值;

    AFE031_COM Chip_Select ();
    HAL_SPI_TRANSMIT (&hspi1 Spi_Buffer、TX.SysConfig、2、HAL_MAX_DELAY);
    AFE031_COM Chip_Deselect ();
    }

    我相信读取/写入功能和 SPI 模式配置是正确的。 我还测试了所有 SPI 模式、但器件仍然没有响应。 。 MISO 引脚始终保持高电平

    3.1 配置 AFE031
    配置 AFE 器件需要执行两个主要步骤。 首先、确保正确配置 GPIO。 在 AFE 器件上、设置了两个主要 GPIO:DAC 模式选择和系统关断。 这两个引脚都被拉至低电平。 也可将连接的所有其他 GPIO 拉至低电平。

    下一步是通过 SPI 配置器件。 在软件示例中、该HAL_afe031Init()函数配置 AFE031AFE03x_Config.c、并在中定义。 以下步骤显示了为正确配置器件、需遵循的函数顺序:

    1. 配置 GPIO
      a.设置 AFE 器件上的 SD 和 DAC 引脚。 需要将这两个引脚拉至低电平。
      b.软件示例函数: HAL_afe031_cfgGpio()

    2. 配置 SPI
      a.针对 16 位字符配置 SPI 模块。
      b.软件示例函数: HAL_spi_cfg()

    3. 在 AFE 器件上执行软复位
      a.0x14对复位寄存器进行写入。
      b.软件示例函数: HAL_afe031_softReset()

    4. 启用偏置
      a.写入0x03 enable2 寄存器。
      b.软件示例函数: HAL_afe031_biasEnable()

    5. 选择频带
      a.将 1 或 0 写入CA_CBCD CONTROL1 寄存器中的位。 如果写入 1、则 TX 和 RX 滤波器的频率响应将配置为 CENELEC B、C、D。如果写入 0、则将配置 CENELEC A。
      b.软件示例函数: HAL_afe031_bandSelect(1)

    6. 清除所有中断
      a.0x00对 control2 寄存器进行写入。
      b.软件示例函数: HAL_afe031_clrAllInt()

    7. 配置所有中断
      a.可以通过对 control2 寄存器进行写入来配置中断。 软件示例函数当前仅启用指示热过载的 T_flag。
      b.软件示例函数: HAL_afe031_cfgInt()

    8. 启用 ZC
      a.将 1 写入 enable2 寄存器中的 ZC 位

    尽管我遵循了完整的初始化序列、但 AFE031 仍然不通过 SPI 响应、且 MISO 引脚保持高电平。 似乎没有任何硬件问题、所有电源轨都正确。

    对于我接下来应该检查的内容、您有什么建议吗?

    此致、
    米德胡尔

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Midhul、

    感谢您提供深入的报告和跟进。  如果软件是按照数据表和支持文档中所述编写的、我很担心硬件连接问题。

    您所使用的硬件是否基于 TI 的任何参考设计或 Booster Pack?  是否可以查看或交换有关硬件设置的详细信息?  如果您愿意、我可以提供我的电子邮件供您离线连接、因为这是一个开放论坛。   

    我的专业知识更多地集中在硬件而非软件上、但我会尽我所能提供支持。  我的办公桌上有一个 AFE031 BOOST-XL EVM、我正在使用示例代码进行设置、因此我至少可以查看软件交互的行为方式。   

    我们确实有客户成功使用具有 SPI 控制功能的 AFE03x 器件、因此从生产的角度来看、AFE031 不存在芯片错误或问题。  我们可以共同确定是否存在假设或不明确的通信方法。

    此致、

    Alec

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Alec:

    感谢您的回复和合作机会。 我很高兴离线继续讨论。 您能否分享您的电子邮件、以便我发送硬件设置的详细信息?

    期待您的答复。

    此致、
    米德胡尔

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Midhul、

    我已经通过 e2e 发送了申请/消息。

    谢谢你。

    此致、

    Alec

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 Alec、

    对原理图审阅进行任何更新?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Midhul、

    我留出时间明天查看原理图和详细信息 (星期二)。

    此致、

    Alec

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Midhul、

    我在几个需要进一步调试和调查的领域提供了指导:

    1. SPI 时序可能很难实现。  默认 STM32 行为可能不是所需的行为。  应考虑以下几点:

    • tCSh(CS 高电平时间) :AFE031 在事务之间至少需要 50ns CS 高电平时间
    • tCSD(CS 到数据有效) :CS 变为低电平后、第一个位必须在特定时间内有效
    • tSCK(SCK 周期) :最低时钟周期要求
    • TSU(建立时间) tH(保持时间) :数据设置和保持要求

    您可以:  

    • 使用示波器捕获 SPI 波形、并根据 AFE031 数据表时序图进行验证
    • 特别注意 CS 到第一个时钟的时序和事务之间的 CS 置为无效
    • 如果需要、在 CS 转换和数据传输之间添加显式延迟

    2.验证 SPI 模式:

    • 位顺序 :确认 MSB 优先实施
    • 字大小 :AFE031 使用 8 位事务
    • 时钟分频器 :确保 SPI 时钟处于 AFE031 规格范围内(不会太快)
    • 硬件与软件 CS 控制 :STM32 硬件 CS 控制可能无法提供足够的时间

    潜在问题 :当基本模式 (CPOL=0、CPHA=1) 正确时、其他设置可能会影响通信。

    您可以在 CS 置位和第一个时钟沿之间添加延迟。  请记住 AFE031 使用 8 位事务并确认 MSB。

    3.确认并研究寄存器访问协议:

    • 读取:MSB 设置为 1
    • 写入:MSB 设置为 0
    • // Example for reading AFE031 register
      uint8_t AFE031_ReadRegister(uint8_t reg_addr)
      {
          uint8_t read_addr = reg_addr | 0x80;  // Set MSB for read operation
          uint8_t rx_data = 0;
          
          // Manual CS control
          HAL_GPIO_WritePin(SPI_CS_GPIO_Port, SPI_CS_Pin, GPIO_PIN_RESET);  // CS low
          
          // Small delay may be needed here (1-5µs)
          delay_us(2);
          
          HAL_SPI_Transmit(&hspi1, &read_addr, 1, HAL_MAX_DELAY);  // Send address
          HAL_SPI_Receive(&hspi1, &rx_data, 1, HAL_MAX_DELAY);     // Read data
          
          // Small delay before CS deassert
          delay_us(1);
          
          HAL_GPIO_WritePin(SPI_CS_GPIO_Port, SPI_CS_Pin, GPIO_PIN_SET);    // CS high
          
          // Ensure minimum CS high time
          delay_us(1);
          
          return rx_data;
      }

    4.检查电源和复位:

    • 上电序列:选中此项
    • 复位时序:在初始化期间复位保持低电平足够的时间
    • 初始延迟:上电和通信之间是否有足够的时间?

    5.检查硬件:

    • 检查 AFE031 实现方案的电压电平是否正确
    • 适当的上拉/下拉电阻器
    • 适当的电源去耦电容器
    • 检查是否需要阻抗匹配电阻器、保持 SPI 布线较短

    最好确定 AFE031 是否加电并根据其默认行为运行;您可以绕过内部 DAC 和 SPI 通信、并驱动 PA 或 TX/RX 部分以确认已知良好的运行情况。

    此致、

    Alec