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.

[参考译文] PGA460:从 EVM 配置到 Energia 库

Guru**** 2553260 points
Other Parts Discussed in Thread: PGA460, ENERGIA

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

https://e2e.ti.com/support/sensors-group/sensors/f/sensors-forum/1566779/pga460-configuring-from-evm-to-energia-library

器件型号:PGA460
主题中讨论的其他器件:Energia

工具/软件:

您好:

当尝试在 Energia 库 (GetDistance.io) 中配置 PGA460 以匹配我成功在 GUI 中使用的设置时、遇到问题。 我的工作流程如下:

  1. 在 GUI 中配置 PGA460 以实现所需的结果。

  2. 使用其内置导出功能将所有配置文件从 GUI 导出到文本文档。

  3. case在我的 Energia 代码中创建一条单独的语句、以复制所有配置函数、例如:

    1. ussc.initBoostXLPGA460(commMode、baudrate、uartAddrUpdate);
      ussc.initThresholds(fixedThr);
      ussc.defaultPGA460(xdcr);
      ussc.initTVG(agrTVG、fixedTVG);
      ussc.runDiagnostics(1、0);
      USSC.BURNEEPROM ();
  4. 在 Energia 代码中使用从 GUI 导出的寄存器值。

但是、当我运行此测试时、测量结果会显示在 Energia 中 与 GUI 的结果不匹配 、尽管我已确保已  正确设置#define userInputMode、并且我的所有选择都已正确传递。

如果您有关于测量结果为何不同以及如何确保独立 Energia 配置与 GUI 行为匹配的指导、我将不胜感激。

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

    尊敬的 Sahaj:

    感谢您发布到传感器论坛!

    Energia 的结果与 GUI 显示的结果相比如何? 请放心、您是否能够验证器件是否已 正确编程(即,Energia 和 GUI 的 RXD/TXD 通信信号相同)?

    好极了

    ~Alicia

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

    尊敬的 Sahaj:

    感谢您提供的额外数据、我将需要一些时间来了解您分享的内容、并将于明天返回给您。

    此致、

    ~Alicia

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

    尊敬的 Sahaj:

    为短距离突发发送命令后、输出是什么样子的? 您能否从 GUI 和 Energia 代码共享波形图像?

    此致、

    ~Alicia

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

    尊敬的 Alicia:

    感谢您的答复。为解决此问题、我手动编写了一个函数来定义寄存器、计算校验和、并一次写入一个寄存器、与 GUI 类似、我会将其留待社区中可能也希望使用它的人员使用。 锁定/解锁 EEPROM 命令有辅助函数、我定义了寄存器以提高可读性。

    /*----------------------------------------------------------------
    | PGA460 寄存器地址
    -------------------------------------------------------- */
    #define USER_DATA1 0x00
    #define USER_DATA2 0x01
    #define USER_DATA3 0x02
    #define USER_DATA4 0x03
    #define USER_Data5 0x04
    #define USER_DATA6 0x05
    #define USER_DATA7 0x06
    #define USER_DATA8 0x07
    #define USER_DATA9 0x08
    #define USER_DATA10 0x09
    #define USER_DATA11 0x0A
    #define USER_DATA12 0x0B
    #define USER_DATA13 0x0C
    #define USER_DATA14 0x0D
    #define USER_DATA15 0x0E
    #define USER_DATA16 0x0F
    #define USER_DATA17 0x10
    #define USER_DATA18 0x11
    #define USER_DATA19 0x12
    #define USER_DATA20 0x13

    #define TVGAIN0 0x14
    #define TVGAIN1 0x15
    #define TVGAIN2 0x16
    #define TVGAIN3 0x17
    #define TVGAIN4 0x18
    #define TVGAIN5 0x19
    #define TVGAIN6 0x1A
    define INIT_GAIN 0x1B
    #define FREQUENCY 0x1C
    定义死区时间 0x1D
    #define PULSE_P1 0x1E
    #define PULSE_P2 0x1F

    #define CURR_LIM_P1 0x20
    #define CURR_LIM_P2 0x21
    #define REC_LENGTH 0x22
    #define FREQ_DIAG 0x23
    #define SAT_FDIAG_TH 0x24
    #define FVOLT_DEC 0x25
    #define DECPL_TEMP 0x26
    #define DSP_SCALE 0x27
    #define TEMP_TRIM 0x28
    #define P1_GAIN_CTRL 0x29
    #define P2_GAIN_CTRL 0x2A
    #define EE_CRC 0x2B

    #define EE_CNTRL 0x40
    #define BPF_A2_MSB 0x41
    #define BPF_A2_LSB 0x42
    #define BPF_A3_MSB 0x43
    #define BPF_A3_LSB 0x44
    #define BPF_B1_MSB 0x45
    #define BPF_B1_LSB 0x46
    #define LPF_A2_MSB 0x47
    #define LPF_A2_LSB 0x48
    #define LPF_B1_MSB 0x49
    #define LPF_B1_LSB 0x4A
    #define TEST_MUX 0x4B

    #define P1_THR_0 0x5F
    #define P1_THR_1 0x60
    #define P1_THR_2 0x61
    #define P1_THR_3 0x62
    #define P1_THR_4 0x63
    #define P1_THR_5 0x64
    #define P1_THR_6 0x65
    #define P1_THR_7 0x66
    #define P1_THR_8 0x67
    #define P1_THR_9 0x68
    #define P1_THR_10 0x69
    #define P1_THR_11 0x6A
    #define P1_THR_12 0x6B
    #define P1_THR_13 0x6C
    #define P1_THR_14 0x6D
    #define P1_THR_15 0x6E

    #define P2_THR_0 0x6F
    #define P2_THR_1 0x70
    #define P2_THR_2 0x71
    #define P2_THR_3 0x72
    #define P2_THR_4 0x73
    #define P2_THR_5 0x74
    #define P2_THR_6 0x75
    #define P2_THR_7 0x76
    #define P2_THR_8 0x77
    #define P2_THR_9 0x78
    #define P2_THR_10 0x79
    #define P2_THR_11 0x7A
    #define P2_THR_12 0x7B
    #define P2_THR_13 0x7C
    #define P2_THR_14 0x7D
    #define P2_THR_15 0x7E
    #define THR_CRC 0x7F

    /*----------------------------------------------------------------
    寄存器结构
    -------------------------------------------------------- */
    typedef 结构{
    uint8_t 地址;
    uint8_t 值;
    } PGA460_Register;



    /*----------------------------------------------------------------
    |默认寄存器值
    -------------------------------------------------------- */
    静态 PGA460_Register pga460_REGISTERS[]={
    {USER_DATA1、0x00}、{USER_DATA2、0x00}、{USER_DATA3、 0x00}、{USER_DATA4、0x00}、
    {USER_DATA5、0x00}、{USER_DATA6、0x00}、{USER_DATA7、 0x00}、{USER_DATA8、0x00}、
    {USER_DATA9、0x00}、{USER_DATA10、0x00}、{USER_DATA11、 0x00}、{USER_DATA12、0x00}、
    {USER_DATA13、0x00}、{USER_DATA14、0x00}、{USER_DATA15、 0x00}、{USER_DATA16、0x00}、
    {USER_DATA17、0x00}、{USER_DATA18、0x00}、{USER_DATA19、 0x00}、{USER_DATA20、0x00}、

    {TVGAIN0、0xBF}、{TVGAIN1、0xFF}、{TVGAIN2、 0xFF}、{TVGAIN3、0x6E}、
    {TVGAIN4、0x98}、{TVGAIN5、0x36}、{TVGAIN6、 0xFC}、{INIT_GAIN、0x00}、
    {FREQUENCY、0x32}、{DEADTIME、0x00}、{PULSE_P1、 0x09}、{PULSE_P2、0x12}、

    {CURR_LIM_P1、0x42}、{CURR_LIM_P2、0x3F}、{REC_LENGTH、 0x3C}、{FREQ_DIAG、0x00}、
    {SAT_FDIAG_TH、0xEE}、{FVOLT_DEC、0x7C}、{DECPL_TEMP、 0x0A}、{DSP_SCALE、0x00}、
    {TEMP_TRIM、0x00}、{P1_GAIN_CTRL、0x18}、{P2_GAIN_CTRL、 0x00}、{EE_CRC、0x67}、

    {EE_CNTRL、0x00}、{BPF_A2_MSB、0x84}、{BPF_A2_LSB、 0xCC}、{BPF_A3_MSB、0xFC}、
    {BPF_A3_LSB、0xCE}、{BPF_B1_MSB、0x01}、{BPF_B1_LSB、 0x99}、{LPF_A2_MSB、0x7F}、
    {LPF_A2_LSB、0x33}、{LPF_B1_MSB、0x00}、{LPF_B1_LSB、 0x67}、{TEST_MUX、0x00}、

    {P1_THR_0、0xA3}、{P1_THR_1、0x67}、{P1_THR_2、 0xAD}、{P1_THR_3、0x97}、
    {P1_THR_4、0x78}、{P1_THR_5、0x88}、{P1_THR_6、 0xf4}、{P1_THR_7、0xD6}、
    {P1_THR_8、0xB5}、{P1_THR_9、0xAF}、{P1_THR_10、 0xFF}、{P1_THR_11、0xFF}、
    {P1_THR_12、0xFF}、{P1_THR_13、0xFF}、{P1_THR_14、 0xFF}、{P1_THR_15、0x00}、

    {P2_THR_0、0x88}、{P2_THR_1、0x88}、{P2_THR_2、 0x88}、{P2_THR_3、0x88}、
    {P2_THR_4、0x88}、{P2_THR_5、0x88}、{P2_THR_6、 0x84}、{P2_THR_7、0x1B}、
    {P2_THR_8、0x08}、{P2_THR_9、0x42}、{P2_THR_10、 0x10}、{P2_THR_11、0x80}、
    {P2_THR_12、0x80}、{P2_THR_13、0x80}、{P2_THR_14、 0x80}、{P2_THR_15、0x00}、

    {THR_CRC、0xF3}
    };


    /*---------------------------------------------------------------- PGA460_解锁 EEPROM -----
    |函数 PGA460_UnlockEEPROM
    |
    |目的:解锁 PGA460 EEPROM 以进行写入或配置。
    |发送校验和正确的解锁帧。
    |
    参数:无
    |
    |返回:无
    ---------------------------------------------------------------------------- */
    void PGA460_UnlockEEPROM (void)

    uint8_t unlockCmd[5];
    unlockCmd[0]= 0x55;//同步字节
    unlockCmd[1]= 0x0A;//写入命令
    UnlockCmd[2]= 0x40;// EE_CNTRL 寄存器
    unlockCmd[3]= 0x80;//解锁值
    unlockCmd[4]= calcRegisterChecksum (unlockCmd[2]、unlockCmd[3]);//校验和

    SERCOM1_USART_Write (unlockCmd、sizeof (unlockCmd));
    DELAY_ms (20);//短延迟以允许 PGA460 处理
    }


    /*---------------------------------------------------------------- PGA460_LockEEPROM -----
    |函数 PGA460_LockEEPROM
    |
    |目的:锁定 PGA460 EEPROM 并使传感器恢复正常运行。
    发送校验和正确的锁定帧。
    |
    参数:无
    |
    |返回:无
    ---------------------------------------------------------------------------- */
    void PGA460_LockEEPROM (void)

    uint8_t lockCmd[5];
    lockCmd[0]= 0x55;//同步字节
    lockCmd[1]= 0x0A;//写入命令
    lockCmd[2]= 0x40;// EE_CNTRL 寄存器
    lockCmd[3]= 0x00;//锁定/正常运行值
    lockCmd[4]= calcRegisterChecksum (lockCmd[2]、lockCmd[3]);//校验和

    SERCOM1_USART_Write (lockCmd、sizeof (lockCmd));
    DELAY_ms (20);//短延迟以允许 PGA460 处理
    }

    /*---------------------------------------------------------------- calcRegisterChecksum -----
    |函数 calcRegisterChecksum
    |
    |用途:计算单个 PGA460 寄存器写入命令的校验和。
    |包括写入命令字节、寄存器地址和数据字节。
    |
    |参数:
    | regAddr (in)--寄存器地址
    | regData (in)--要写入的寄存器值
    |
    返回:uint8_t --计算的校验和
    ---------------------------------------------------------------------------- */
    uint8_t calcRegisterChecksum (uint8_t regAddr、uint8_t regData)

    uint8_t ChecksumInput[3];
    ChecksumInput[0]= 0x0A;//写入命令
    ChecksumInput[1]= regAddr;
    ChecksumInput[2]= regData;

    //如果需要、请附加 UART 地址
    ChecksumInput[0]+=(0 << 5);

    uint16_t 进位= 0;
    对于 (int i = 0;i < 3;i++)

    IF ((ChecksumInput[i]+ Carry)< Carry)
    Carry = Carry + ChecksumInput[i]+ 1;
    暴露
    Carry = Carry + ChecksumInput[i];

    if(进位> 0xFF)
    进位=进位 — 255;
    }

    Carry =(~Carry) 和 0xFF;
    返回 (uint8_t) 进位;
    }



    /*---------------------------------------------------------------- PGA460_WriteAllRegisters --
    |函数 PGA460_WriteAllRegisters
    |
    |目的:解锁 EEPROM、写入存储在本地 PGA460 中的所有寄存器
    |通过 UART 向器件发送寄存器数组、使用正确的校验和
    |、然后锁定 EEPROM 以恢复正常运行。
    |
    参数:无
    |
    |返回:无
    ---------------------------------------------------------------------------- */
    void PGA460_WriteAllRegisters (void)

    //在写入前解锁 EEPROM
    PGA460_Unlockeeprom ();

    适用于 (size_t i = 0;i < sizeof (pga460_registers)/sizeof (PGA460_Register);i++)

    uint8_t buf[5];
    PGA460_Register reg = pga460_REGISTERS[i];

    Buf[0]= 0x55;//起始字节
    Buf[1]= 0x0A;//写入命令
    Buf[2]= reg.address;//寄存器地址
    Buf[3]= reg.value;//寄存器值
    Buf[4]= calcRegisterChecksum (buf[2]、buf[3]);// TI 样式校验和

    //等待上一次传输完成
    while (SERCOM1_USART_WriteIsBusy ()){}

    if(!SERCOM1_USART_Write (buf、sizeof (buf)))

    //可选:处理写入启动失败(例如重试或日志)
    }

    //等待当前写入完成
    while (SERCOM1_USART_WriteIsBusy ()){}
    }

    //锁定 EEPROM/恢复正常运行
    PGA460_LockEEPROM();

    //额外延迟以确保器件已准备好正常运行
    DELAY_ms (20);
    }

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

    尊敬的 Sahaj:

    我很高兴您能使其正常工作!

    此致、

    ~Alicia