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.

[参考译文] PGA970:PGA970 和 SPI

Guru**** 2826755 points

Other Parts Discussed in Thread: PGA970

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

https://e2e.ti.com/support/sensors-group/sensors/f/sensors-forum/1621880/pga970-pga970-and-spi

部件号: PGA970

您好、

我正在尝试通过 SPI 在 PGA970 和 STM32H7A3 - Nucleo-144 之间创建通信

这是我对 Nucleo 板的设置:

static void MX_SPI1_Init(void)
{
__HAL_RCC_SPI1_CLK_ENABLE();
hspi1.Instance = SPI1;
hspi1.Init.Mode = SPI_MODE_MASTER;
hspi1.Init.Direction = SPI_DIRECTION_2LINES;
hspi1.Init.DataSize = SPI_DATASIZE_8BIT;
hspi1.Init.CLKPolarity = SPI_POLARITY_LOW;
hspi1.Init.CLKPhase = SPI_PHASE_1EDGE; // Mode 0
hspi1.Init.NSS = SPI_NSS_SOFT;
hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_32;  //1MHz
hspi1.Init.FirstBit = SPI_FIRSTBIT_MSB; 
HAL_SPI_Init(&hspi1);
}


在 PGA970 中:

void main()
{
    DIGITAL_Interface_Config(SPI_ENABLE | OWI_DISABLE | OWI_DEGLITCH_FILTER_1MS);
        uint16_t counter = 0xAA55;   // initial counter value
        while(1)
        {
            COM_MCU_TO_DIF_B1 = (uint8_t)(counter >> 8);   // High byte = 0xAA
            COM_MCU_TO_DIF_B2 = (uint8_t)(counter & 0xFF); // Low byte  = 0x55
            COM_TX_STATUS     = 0x01;                      // important!
            // to show changes clearly in Oscilloscope
            counter += 0x1111;   // change every time
            delay_ms(40);
        }
}

 而示波器中的信号:
LM290420.BMP

但“MISO"信号“信号始终为错误  
请帮帮我。

谢谢

Liam

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

    您好 Liam、  

    欢迎来到 E2E!

    能否分享您要发送到 PGA970 的 SPI 命令? 它需要 24 位命令、但我看到您正在发送 48 位命令。 前 24 位看起来像是您尝试读取 0x2 页上的寄存器 0x18、这不是您读取 COMBUF 数据的位置、即第 0x0 页上的寄存器 0x04 和 0x05。  

    谢谢、

    Maggie

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

    您好、Maggie、

    谢谢、这是我的 Nucleo-H7A3ZI-Q 电路板代码:

    内部 main (void)

     HAL_Init();
     Systemm Clock_Config ();

     mx_gpio_Init();
     mx_SPI1_Init();

     /*只运行一次*/
     PGA_SPI_Write (0x0C、0x01);  // IF_SEL=1、MICRO_RESET=0(释放 MCU)
     HAL_DELAY (50);

     while (1)
     {
      LASTDAC = PGA_SPI_READ_DAC_REG0 ();

      HAL_GPIO_TogglePin (GPIOB、GPIO_PIN_7);   //蓝色 LD2 显示其正在运行

      if (lastDAC == 0xFFFF)
       HAL_GPIO_TogglePin (GPIOB、GPIO_PIN_14); // LD3 RED = ERROR
      暴露
       HAL_GPIO_TogglePin (GPIOB、GPIO_PIN_0);  // LD1 绿色=成功

      HAL_DELAY (250);
     }
    }

    /*构建 24 位 SPI 帧*/
    void BUILD_SPI_Frame (uint8_t addr、uint8_t data、uint8_t RW、uint8_t txBuf[3]){
      uint32_t page = 0x02;  //第 2 页中的 COMBUF
      uint32_t frame =((uint32_t) page << 21)|(uint32_t) addr << 13)|((uint32_t) rw << 12)|((uint32_t) data << 4);
      txBuf[0]=(frame >> 16)& 0xFF;
      txBuf[1]=(frame >> 8)& 0xFF;
      txBuf[2]= frame & 0xFF;
    }

    /*写入*/
    void PGA_SPI_Write (uint8_t addr、uint8_t data){
      uint8_t txBuf[3];
      BUILD_SPI_Frame (addr、DATA、1、txBuf);
      HAL_GPIO_WritePin (PGA_CS_GPIO_Port、PGA_CS_Pin、GPIO_PIN_RESET);
      HAL_SPI_TRANSMIT (&hspi1、txBuf、3、HAL_MAX_DELAY);
      HAL_GPIO_WritePin (PGA_CS_GPIO_Port、PGA_CS_Pin、GPIO_PIN_SET);
    }

    /*读取 DAC_REG0 — 单个 6 字节事务*/
    uint16_t PGA_SPI_READ_DAC_REG0 (void){
      uint8_t txBuf[6]={0};
      uint8_t rxBuf[6]={0};

      BUILD_SPI_Frame (0x04、0x00、0、txBuf);  //读取地址 0x04

      HAL_GPIO_WritePin (PGA_CS_GPIO_Port、PGA_CS_Pin、GPIO_PIN_RESET);
      HAL_SPI_TransmitReceive (&hspi1、txBuf、rxBuf、6、HAL_MAX_DELAY);
      HAL_GPIO_WritePin (PGA_CS_GPIO_Port、PGA_CS_Pin、GPIO_PIN_SET);

      如果 (rxBuf[3]!= 0x05) 返回 0xFFFF;

      返回 ((uint16_t) rxBuf[4]<< 8)| rxBuf[5];
    }

    我也尝试过类似您提到的、即第 0 页和地址 0x04 和 0x05、但 PGA970 没有答案。

    谢谢
    Liam

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

    您好 Liam、  

    感谢您分享这些详细信息。  

     PGA_SPI_Write (0x0C、0x01);  // IF_SEL=1、MICRO_RESET=0(释放 MCU

    您需要将 0x03 写入寄存器 0x0C、而不是 0x01。 如果您仅写入 0x01、则不要关闭内部 MCU、数字接口在运行时无法与 MCU 通信。  

    在 MCU 运行时可以读取/写入少数寄存器 — 这些寄存器是 COMBUF 寄存器:

    如果要读取/写入 COMBUF 寄存器、应该将 0x00 写入寄存器 0x0C。  

    uint32_t page = 0x02;  // page2 中的 COMBUF

    COMBUF 位于 0x00 页。  

    谢谢、

    Maggie

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

    您好、Maggie、

    感谢您的回答。 我正按照您的建议尝试这样做、但 MISO 始终具有恒定数据、没有变化。
    您能看一下以下函数吗:
    或者是否有任何其他应更改的标志或寄存器?

    在 NUCLEO 板中:
    内部 main (void)

     HAL_Init();
     Systemm Clock_Config ();
     mx_gpio_Init();
     mx_SPI1_Init();

     /*启用 PGA970 */
     PGA_SPI_Write (0、0x0C、0x3);
     HAL_DELAY (300);
     while (1)
     {
     PGA_SPI_READ_DAC_REG0 ();
     HAL_DELAY (10);
     LASTDAC = PGA_SPI_READ_DAC_REG0 ();
     HAL_GPIO_TogglePin (GPIOE、GPIO_PIN_1);// LD2
     if (lastDAC == 0 || lastDAC == 0xFFFF)// LD3 = error
     {
     HAL_GPIO_WritePin (GPIOB、GPIO_PIN_14、GPIO_PIN_SET);
     HAL_GPIO_WritePin (GPIOB、GPIO_PIN_0、GPIO_PIN_RESET);
     }
     其他{
     // LD1 =成功
     HAL_GPIO_WritePin (GPIOB、GPIO_PIN_0、GPIO_PIN_SET);
     HAL_GPIO_WritePin (GPIOB、GPIO_PIN_14、GPIO_PIN_RESET);
     }
     HAL_delay (100);
     }
    }
    /*构建 24 位帧*/
    void BUILD_SPI_Frame (uint8_t page、uint8_t addr、uint8_t data、uint8_t RW、uint8_t txBuf[3])

     uint32_t frame =((uint32_t) page << 21)|(uint32_t) addr << 13)|((uint32_t) rw << 12)|((uint32_t) data << 4);
     txBuf[0]=(frame >> 16)& 0xFF;
     txBuf[1]=(frame >> 8)& 0xFF;
     txBuf[2]= frame & 0xFF;
    }

    void PGA_SPI_Write (uint8_t page、uint8_t addr、uint8_t data)

     uint8_t txBuf[3];
     BUILD_SPI_Frame (page、addr、data、1、txBuf);
     HAL_GPIO_WritePin (PGA_CS_GPIO_Port、PGA_CS_Pin、GPIO_PIN_RESET);
     HAL_SPI_TRANSMIT (&hspi1、txBuf、3、HAL_MAX_DELAY);
     HAL_GPIO_WritePin (PGA_CS_GPIO_Port、PGA_CS_Pin、GPIO_PIN_SET);
    }
    uint16_t PGA_SPI_READ_DAC_REG0 (void)

     uint8_t cmd[3]={0};//读取
     uint8_t dummy[3]={0};// dummy to read answer
     uint8_t rx[3]={0};

     /*步骤 1-发送*/
     BUILD_SPI_Frame (0、0x04、0x00、0、cmd); // 0x04
     HAL_GPIO_WritePin (PGA_CS_GPIO_Port、PGA_CS_Pin、GPIO_PIN_RESET);
     HAL_SPI_TRANSMIT (&hspi1、cmd、3、HAL_MAX_DELAY);//发送命令
     HAL_DELAY (5);// PGA970 的时间

     /*以获得假答案*/
     HAL_SPI_TransmitReceive (&hspi1、dummy、Rx、3、HAL_MAX_DELAY);
     HAL_GPIO_WritePin (PGA_CS_GPIO_Port、PGA_CS_Pin、GPIO_PIN_SET);
     如果 (rx[0]!= 0x05) 返回 0xFFFF;
     返回 ((uint16_t) rx[1]<< 8)| rx[2];
    }

    谢谢
    Liam

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

    您好 Liam、  

    您是否能够分享 PGA970 的原理图? 此外、您是否能够读取/写入任何其他寄存器(例如其中一个 DEMODx_CONFIG 寄存器)?

    谢谢、

    Maggie

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

    您好、Maggie、

    我像照片一样连接了所有 SPI 引脚:
    CS   -> CSn
    SCK  -> SCK
    MISO -> MISO
    MOSI -> MOSI
    GND  -> GND

    我也尝试读取 DEMODx_CONFIG、但 MISO 没有改变、它始终显示相同的数据。 我从 SPI 获得的数据始终是 lastDAC=0x2281

     

    有了这个建议的 breakpoin:
    HAL_SPI_TRANSMIT (&hspi1、cmd、3、HAL_MAX_DELAY);

    数据为:

    以及在此命令上带有断点:
    HAL_SPI_TransmitReceive (&hspi1、dummyRx、3、HAL_MAX_DELAY);

    我在示波器上获得了以下数据:




    谢谢
    Liam

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

    您好 Liam、  

    只是为了确认 — 您正在通过 VDD 为 PGA970 供电、对吧? 我在您的原理图上没有看到连接。  

    我会在您的代码中尝试两项操作:

    1. 您尝试读取 COMBUF 寄存器 (0x0 页上的 0x04)、之前共享的 PGA970 代码中的 PGA970 应进行计数并将值存储在 COMBUF 寄存器 (0x0 页上的 0x04 和 0x05) 中。 除非 PGA 中的微控制器正在运行、否则代码不会运行。 当将 0x03 写入 micro_control_interface 时、您会将微控制器置于复位状态。
    2. 当您读取响应时、需要在 SPI 事务之间切换 CSn 线。  

    我在下面更新了您的代码。  

    谢谢、

    Maggie  

    int main(void)
    {
     	HAL_Init();
     	SystemClock_Config();
     	MX_GPIO_Init();
     	MX_SPI1_Init();
    
     	/* Enable PGA970 */
     	//PGA_SPI_Write(0, 0x0C, 0x3);
     	HAL_Delay(300);
     	while (1)
     	{
     		PGA_SPI_Read_DAC_REG0();
     		HAL_Delay(10);
     		lastDAC = PGA_SPI_Read_DAC_REG0();
     		HAL_GPIO_TogglePin(GPIOE, GPIO_PIN_1); // LD2
     		if (lastDAC == 0 || lastDAC == 0xFFFF) // LD3 = error
     		{
     			HAL_GPIO_WritePin(GPIOB, GPIO_PIN_14, GPIO_PIN_SET);
     			HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_RESET);
     		}
     		else{
     			// LD1 = success
     			HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_SET);
     			HAL_GPIO_WritePin(GPIOB, GPIO_PIN_14, GPIO_PIN_RESET);
     		}
     		HAL_Delay(100);
     	}
    }
    /* Build 24-bit Frame */
    void Build_SPI_Frame(uint8_t page, uint8_t addr, uint8_t data, uint8_t rw, uint8_t txBuf[3])
    {
     	uint32_t frame = ((uint32_t)page << 21) | ((uint32_t)addr << 13) | ((uint32_t)rw << 12) | ((uint32_t)data 			<< 4);
     	txBuf[0] = (frame >> 16) & 0xFF;
     	txBuf[1] = (frame >> 8) & 0xFF;
     	txBuf[2] = frame & 0xFF;
    }
    
    void PGA_SPI_Write(uint8_t page, uint8_t addr, uint8_t data)
    {
     	uint8_t txBuf[3];
     	Build_SPI_Frame(page, addr, data, 1, txBuf);
     	HAL_GPIO_WritePin(PGA_CS_GPIO_Port, PGA_CS_Pin, GPIO_PIN_RESET);
     	HAL_SPI_Transmit(&hspi1, txBuf, 3, HAL_MAX_DELAY);
     	HAL_GPIO_WritePin(PGA_CS_GPIO_Port, PGA_CS_Pin, GPIO_PIN_SET);
    }
    uint16_t PGA_SPI_Read_DAC_REG0(void)
    {
     	uint8_t cmd[3] = {0}; // read
     	uint8_t dummy[3] = {0}; // dummy to read answer
     	uint8_t rx[3] = {0};
    
     	/* step1- send */
     	Build_SPI_Frame(0, 0x04, 0x00, 0, cmd); // 0x04
     	HAL_GPIO_WritePin(PGA_CS_GPIO_Port, PGA_CS_Pin, GPIO_PIN_RESET);
     	HAL_SPI_Transmit(&hspi1, cmd, 3, HAL_MAX_DELAY); // send command
     	HAL_GPIO_WritePin(PGA_CS_GPIO_Port, PGA_CS_Pin, GPIO_PIN_SET);
     	HAL_Delay(5); // time for PGA970
    
     	/* to get answer dummy */
     	HAL_GPIO_WritePin(PGA_CS_GPIO_Port, PGA_CS_Pin, GPIO_PIN_RESET);
     	HAL_SPI_TransmitReceive(&hspi1, dummy, rx, 3, HAL_MAX_DELAY);
     	HAL_GPIO_WritePin(PGA_CS_GPIO_Port, PGA_CS_Pin, GPIO_PIN_SET);
     	if (rx[0] != 0x05) return 0xFFFF;
     	return ((uint16_t)rx[1] << 8) | rx[2];
    }

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

    您好、Maggie、

    是的、我已经为 PGA970 供电、一切都可以与 LVDT 传感器和输出信号配合使用、但我只是尝试通过 SPI 发送数据以与其他微控制器通信。 PCB 上的电源为:

    AVDD=3.049v
    DVDD= 1.869v
    VDD= 15V

    目前、我的测试板损坏了。 我尝试在新电路板上应用您的建议、我很快会向您提供反馈。

    谢谢
    Liam

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

    您好、Maggie、

    我刚刚测试了您发送的代码、通过更改 PGA970 端的数据、它不会更改 MISO 数据、它始终是这样的:  



    我只在我的 PGA970 中使用以下代码:

    void main(){
    //配置函数
      DIGITAL_TCH Interface_Config (SPI_ENABLE | OWI_DISABLE | OWI_DEGLITCH_FILTER_1ms);

        while (1)
        {
          COM_MCU_TO_DIF_B1 = 0xAA;
          COM_MCU_TO_DIF_B2 = 0x55;
          COM_TX_STATUS   = 0x01;
        }
    //其他用于转换解调器数据的函数
    }

    你有什么建议吗?

    谢谢
    Liam

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

    您好 Liam、  

    您是否可以尝试将 0x03 读取到页 0x0 上的寄存器 0x0C、然后读回该值? 您的 PGA970 固件不应该有所不同。  

    谢谢、

    Maggie

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

    您好 Liam、  

    您是否可以尝试更改为 SPI 模式 1 (CPHA = 1、CPOL = 0)?

    谢谢、

    Maggie

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

    您好、Maggie、

    是的、我做到了、它现在运行得非常完美。 仅将 SPI 更改为模式 1 (CPHA = 1 和 CPOL=0)。

    非常感谢
    Liam