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.

[参考译文] PGA4311EVM:PGA411Q1EVM:通过 F28379D 控制卡对 PGA411-EVM 进行外部控制

Guru**** 2514775 points
Other Parts Discussed in Thread: SYSCONFIG, LAUNCHXL-F28379D

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

https://e2e.ti.com/support/audio-group/audio/f/audio-forum/1042401/pga4311evm-pga411q1evm-external-control-of-the-pga411-evm-with-f28379d-control-card

器件型号:PGA4311EVM
主题中讨论的其他器件:PGA411Q1EVMPGA411-Q1SysConfigLAUNCHXL-F28379D
  • Hellow

     我遇到的问题与  在他的原始线程中遇到的问题相同、在该线程中、任何命令请求都使用0x46之类的消息进行响应。 我能否知道这是如何解决的?

      我正在尝试通过外部控制器(F28379D)开发套件从 PGA411Q1EVM 读取 Dev_Stat5和 Dev_Stat6寄存器。  

    F28379D 是主器件   

    PGA411-EVM 是从器件、

    我正在尝试通过 PGA411-EVM 上的 J11 ping 读取寄存器值。

     在示波器上、我确认 NCS、SCK 和 SDI 引脚均有效、但 SDO 输出始终为0x41、0XFF、0x41

    执行代码后,我会得到 hal_dassert()错误。  

    感谢您的任何帮助。

    下面连接了遵循的代码和引脚连接  

    逻辑分析仪接收到数据  

    引脚连接主器件(f28379d)从器件 PGA411_Q1_EVM

    //########################################################################################################################
    //
    //文件:empty_bitfield_driverlib_main.c
    //
    //标题:空示例
    //
    //空位字段和 Driverlib 示例
    //
    //此示例是 bit-Field 和 Driverlib 的空项目设置
    //开发。
    //
    //########################################################################################################################
    //$TI 发行版:F2837xD 支持库 v3.10.00.00 $
    //$Release Date:Tue May 26 17:13:46 IST 2020 $
    //版权所有:
    //版权所有(C) 2013-2020 Texas Instruments Incorporated - http://www.ti.com/
    //
    //以源代码和二进制形式重新分发和使用,有无
    //如果满足以下条件,则允许进行修改
    //满足:
    //
    //重新分发源代码必须保留上述版权
    //注意、此条件列表和以下免责声明。
    //
    //二进制形式的重新分发必须复制上述版权
    //注意、中的条件列表和以下免责声明
    //随提供的文档和/或其他材料
    //分布。
    //
    //德州仪器公司的名称和的名称都不是
    //其贡献者可用于认可或推广衍生产品
    //未经特定的事先书面许可,从该软件下载。
    //
    //本软件由版权所有者和作者提供
    //“原样”以及任何明示或暗示的保证,包括但不包括
    //限于对适销性和适用性的暗示保证
    //一个特定的目的是免责的。 在任何情况下、版权均不得
    //所有者或贡献者应对任何直接、间接、偶然、
    //特殊、典型或必然的损害(包括但不包括)
    //仅限于采购替代货物或服务;
    //数据或利润;或业务中断)
    //责任理论,无论是合同责任、严格责任还是侵权行为
    //(包括疏忽或其他)以任何方式因使用而产生
    //此软件,即使已被告知可能会发生此类损坏。
    //$
    //########################################################################################################################

    //
    //包含的文件
    //

    #include "F28x_Project.h"
    #include "driverlib.h"
    #include "device.h"

    //来自 TIDA-00796
    #include /* IQ 数学库*/
    #include /*标准输入输出库*/
    #include /*字符串和数组(对于 mcmcpy)*/
    #include "hal.h"/*硬件管理器*/
    #include "pga411.h"/* PGA411-Q1驱动器*/

    #include "F2837xD_DEVICE.h"
    #include "F2837xD_examples.h"
    #include "Board1.h"

    //
    //定义
    //
    #define START_TIMER (x){\
    x = CpuTimer1Regs.TIM.all;\
    CpuTimer1Regs.TCR.bit.TSS = 0;\

    #define STOP_TIMER (x){\
    CpuTimer1Regs.TCR.bit.TSS = 1;\
    x = CpuTimer1Regs.TIM.all;\
    CpuTimer1Regs.TCR.bit.TRB = 1;\


    #define RED_LED_LOW GPIO_WritePin (RED_LED、1)// 1低0高
    #define RED_LED_HIGH GPIO_WritePin (RED_LED、0)// 0 HIGH

    #define LOGIC_CHECK_LOW GPIO_WritePin (logic_check、1)// 1低0高
    #define LOGIC_CHECK_HIGH GPIO_WritePin (logic_check、0)// 0 HIGH
    //未验证
    float start_time = 0.0;
    float stop_time = 0.0;
    //
    浮点节拍、TIME_IN_us、时间、温度、temp1;

    char outbuf[30];//用于字符串转换的 UART 输出数据缓冲器*/
    uint16 angle1;

    /*********
    *内部函数原型
    (小部分 /

    /*函数从 PGA411读取角度并通过 UART 发送*
    void MAIN_GetAngleAndPrint (void);

    /*函数从 PGA411读取速度并通过 UART 发送*
    void MAIN_GetVeloAndPrint (void);

    /*********
    *内部功能
    (小部分 /

    /*函数从 PGA411读取角度并通过 UART 发送*
    void MAIN_GetAngleAndPrint (空)


    //使用 IQmathLib 库计算 PGA411-Q1的角度//
    //_iq19以0.000001907分辨率存储-4096至4095.9998093 //
    int16 angle_raw;//来自 PGA411-Q1寄存器的原始数据//
    _IQ 角度;// IQ 数学角度//
    //浮点 angle2;

    //终端命令//
    HAL_PutsUART ("角度[Deg]:");

    //从 PGA411-Q1读取数据//
    angle_raw = pga411_ReadReg (DEV_STAT5);
    angle_raw 和= 0x1FFF;//仅保留 ORDANGLE 位//
    //将最小步长(LSB)与 ORDANGLE 值相乘//
    角度=_IQ19mpy (_IQ19 (360.0 / 4096)、_IQ19 (angle_raw));// 12b 示例////原始代码
    //角度=_IQ19mpy (_IQ19 (360.0 / 1024)、_IQ19 (angle_raw));// 10位模式示例//
    //将 IQ 变量转换为字符串//
    _IQ19toa (outbuf、"%4.5f"、角度);
    // angle1 =(int) outbuf[0];

    //打印出缓冲区//
    HAL_PutsUART (outbuf);
    //终端命令//
    HAL_PutsUART ("\t\t");


    /*函数从 PGA411读取速度并通过 UART 发送*
    void MAIN_GetVeloAndPrint (void)

    使用 IQmathLib 库*计算 PGA411-Q1的速度*
    /*_iq14以0.000061035分辨率存储-131072至131071.9938965 */
    int16 velocity_raw;/*来自 PGA411-Q1寄存器的原始数据*
    float velocity_float;//第二个补码到浮点转换的 temp
    _IQ 速度;/* IQ 数学速度*


    /*终端命令*/
    HAL_PutsUART ("Velocity [RPM]:");

    /*从 PGA411-Q1读取数据*/
    Velocity_raw = pga411_ReadReg (DEV_STAT6);

    /*将第二个补码转换为浮点*/
    if (velocity_raw & 0x0800)/*负数? *

    /*首先转换为正数*/
    Velocity_float =(((~velocity_raw)+ 1)& 0x07FF);
    Velocity_float *=-1;/*并使 float 变为负*/

    其他

    /*正数、仅保留所需的位*/
    Velocity_float =(velocity_raw & 0x07FF);

    速度=_IQ14mpy (_IQ14 (60 * 20000000 / 33554432)、_IQ14 (velime_float + 1));/* 12b 示例*///原始代码
    //速度=_IQ14mpy (_IQ14 (60 * 20000000 / 2097152)、_IQ14 (velime_float + 1));// 10b 示例*/

    /*将 IQ 变量转换为字符串*/
    _IQ14toa (outbuf、"%7.5f"、速度);

    /*打印出缓冲区*/
    HAL_PutsUART (outbuf);
    /*终端命令*/
    HAL_PutsUART ("\n"r);


    //
    //主函
    //
    void main (void)

    //
    //初始化设备时钟和外设
    //
    device_init();

    //
    //将 GPIO 引脚配置为推挽输出
    //
    DEVICE_initGPIO();

    //
    //初始化 PIE 并清除 PIE 寄存器。 禁用 CPU 中断。
    //
    interrupt_initModule();

    //
    //使用指向 shell 中断的指针初始化 PIE 矢量表
    //服务例程(ISR)。
    //
    interrupt_initVectorTable();

    //
    //初始化板外设。 这由 SysConfig 文件生成
    //
    Board_init_1 ();

    ////
    //// UART 代码结束-可在 LAUNCHXL-F28379D 的引脚19和18上看到
    ////
    GPIO_togglePin (LED1);
    DEVICE_DELAY_US (1000000);
    HAL_PutsUART ("\r\nhal_PutsUART 函数正在工作! \n\n");
    GPIO_togglePin (LED1);
    DEVICE_DELAY_US (1000000);
    GPIO_writePin (AMODE、0);
    GPIO_WritePin (RED_LED、1);
    GPIO_WritePin (故障、1);
    pga411_Reset ();
    pga411_FaultReset();

    DELAY_US (100000);/* 100ms 延迟*/

    pga411_DefaultCfg ();/*在"pga411_regs"中定义的默认配置*/
    DELAY_US (10000);/*当激励启用时、抗尖峰脉冲周期为10ms

    /*无限循环*/
    while (1)

    HAL_PutsUART ("\r\nhal_PutsUART 函数正在工作! \n\n");
    DELAY_US (100000);/* 100ms 延迟*/
    MAIN_GetAngleAndPrint();
    MAIN_GetVeloAndPrint();

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

    ////////////////////////////////////////////////////////////////////////////////////////////  PGA411初始化着色器文件  //////////////////////////

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

    /*********
    *基于 PGA411-Q1的 TIDA-00796旋转变压器前端
    *模块:PGA411驱动程序
    *作者:Jiri Panacek、j-panacek@ti.com
    *
    *版权所有2016 Texas Instruments Incorporated。 保留所有权利。
    秘书长的报告 /

    #include "pga411.h"
    #include "hal.h"
    #include "F2837xD_DEVICE.h"
    #include "F28x_Project.h"


    /*********
    *宏
    (小部分 /

    #define CRC_BITCOUNT 24 //对于 CRC6、UINT32的前24位
    #define CRC_BYTECOUNT 3 /*用于 CRC6的 UINT32的前3 B *
    #define CRC_INITSEED 0x3F // CRC6的初始种子*
    #define CRC_POLYNOM 0x5B // CRC = X6+X4+X3+X+1 */

    #define SPI_dummy 0xF0/*用于读取操作的虚拟 SPI 数据*

    #define empty_loop

    /*********
    *枚举
    (小部分 /

    /*********
    * typedef
    (小部分 /

    /*********
    变量、常量
    (小部分 /

    volatile pga411_SPI_FRAME_t pga411_SPI_FRAME ={.addr = 0x00、
    .dataout = 0x0000、
    .reserved = 0x0、
    .mcRC = 0x00
    };

    pga411_reg_t pga411_regs[PGA411_REG_COUNT + 1]=

    /*内存常量 init */
    [DEV_OVUV1]={.read_add = 0x53、.write_add = 0x87、.def_val = 0x8B40}、
    [DEV_OVUV2]={.read_add = 0x6B、.write_add = 0x26、.def_val = 0x00ED}、
    [DEV_OVUV3]={.read_add = 0x65、.write_add = 0x17、.def_val = 0xFCFF}、
    [DEV_OVUV4]={.read_add = 0xEC、.write_add = 0x39、.def_val = 0x07F2}、
    [DEV_OVUV5]={.read_add = 0x52、.write_add = 0x75、.def_val = 0x1C00}、
    [DEV_OVUV6]={.read_add = 0xE9、.write_add = 0x83、.def_val = 0x038F}、
    [DEV_TLOOP_CFG]={.read_add = 0xA6、.write_add = 0x42、.def_val = 0x0514}、
    [DEV_AFE_CFG]={.read_add = 0xC2、.write_add = 0x91、.def_val = 0x0005}、
    [DEV_PHASE_CFG]={.read_add = 0x57、.write_add = 0x85、.def_val = 0x1400}、
    [DEV_CONFIG1]={.read_add = 0xBE、.write_add = 0xEB、.def_val = 0x0002}、
    [DEV_CONTROL1 ={.READ_ADD = 0x90、.WRITE_ADD = 0x0D、.def_val = 0x0000}、
    [DEV_CONTROL2]={.read_add = 0x63、.write_add = 0x38、.def_val = 0x0000}、
    [DEV_CONTROL3 ]={.read_add = 0xDD、.write_add = 0xAE、.def_val = 0x0003}、
    [DEV_STAT1]={.read_add = 0x81、.write_add = 0x00、.def_val = 0x0000}、
    [DEV_STAT2]={.read_add = 0x4D、.write_add = 0x00、.def_val = 0x0000}、
    [DEV_STAT3]={.read_add = 0x84、.write_add = 0x00、.def_val = 0x0000}、
    [DEV_STAT4]={.read_add = 0x1F、.write_add = 0x00、.def_val = 0x0000}、
    [DEV_STAT5]={.read_add = 0x41、.write_add = 0x00、.def_val = 0x0000}、
    [DEV_STAT6]={.read_add = 0x6f、.write_add = 0x00、.def_val = 0x0000}、
    [DEV_STAT7]={.read_add = 0xE1、.write_add = 0x00、.def_val = 0x0000}、
    [DEV_CLCRC]={.read_add = 0x4F、.write_add = 0xFC、.def_val = 0x0000}、
    [DEV_CRC]={.read_add = 0x0F、.write_add = 0xE7、.def_val = 0x0000}、
    [CRCCALC]={.read_add = 0xD9、.write_add = 0xFF、.def_val = 0x0000}、
    [DEV_EE_CTRL1]={.read_add = 0xE3、.write_add = 0x6E、.def_val = 0x0000}、
    [DEV_CRC_CTRL1]={.read_add = 0x7A、.write_add = 0xB6、.def_val = 0x0000}、
    [DEV_EE_CTRL4]={.read_add = 0xBA、.write_add = 0x56、.def_val = 0x0000}、
    [DEV_UNLK_CTRL1]={.read_add = 0x64、.write_add = 0x95、.def_val = 0x0000}、
    /*连续读取需要读取28次。 这对*/大有帮助
    [dummy_REG]={.read_add = 0x53、.write_add = 0x87、.def_val = 0x0000}、
    };

    /*********
    *内部函数原型
    (小部分 /

    /*计算输出数据的 CRC6,函数获取前3B 左对齐数据*/
    UINT16 pga411_CRC2 (UINT32数据输入);

    //通过 SPI 将数据发送到 PGA,对于寄存器使用定义的宏,返回传入帧*/
    pga411_spi_frame_t pga411_XmitSPI (uint16 dir、uint16 reg、uint16 wdata);

    /*********
    *内部功能
    (小部分 /

    /* CRC6计算-针对 PGA411进行了优化*/
    UINT16 pga411_CRC2 (UINT32数据输入)

    uint16 byte_idx、bit_idx、CRC =(CRC_INITSEED << 2);

    /*从最高有效(3-2-1)开始逐字节开始*/
    对于(byte_idx = CRC_BYTECOUNT;byte_idx >= 1;byte_idx--)

    /*从左到右 XOR 输入新字节*/
    CRC ^=((Datin >>(byte_idx << 3))& 0x000000FF);

    对于每个字节、/*逐位进行*
    对于(bit_idx = 0;bit_idx < 8;bit_idx++)

    CRC = CRC << 1 ^μ s (CRC & 0x80? (CRC_POLYNOM <<2):0);

    返回(CRC >> 2和 CRC_INITSEED);/*恢复两位偏移*/


    /*将默认配置写入 PGA */
    void pga411_DefaultCfg (void)

    int i;
    /*转至诊断状态*/
    Pga411_State (DIAG);
    /*解锁寄存器*/
    pga411_DeviceUnlock();

    /*前12个寄存器默认为*/
    /*注意:对于某些您需要先解锁它们! *
    对于(I = 0;I < 12;I++)

    pga411_XmitSPI (write、i、pga411_regs[i]。def_val);

    /*转至正常状态*/
    pga411_State (正常);


    /*更改状态诊断/正常*/
    void pga411_State (UINT16状态)

    uint16温度;

    /*进入诊断状态*/
    如果(状态= DIAG)

    /*读取 DEV_CONTROL3寄存器的内容*/
    temp = pga411_ReadReg (DEV_CONTROL3);
    temp |= 0x0004;//设置位 SPIDIAG *
    pga411_WriteReg (DEV_CONTROL3、temp);//完成 R-M-W */

    /*返回正常状态*/
    其他

    /*读取 DEV_CONTROL1寄存器的内容*/
    temp = pga411_ReadReg (DEV_CONTROL1);
    temp |= 0x0001;//设置位 DIAGEXIT */
    pga411_WriteReg (DEV_CONTROL1、temp);/*完成 R-M-W *


    /*从定义的寄存器读取数据*/
    UINT16 pga411_ReadReg (UINT16 reg)

    /*首次读取返回任何*/
    pga411_XmitSPI (读取、寄存器、SPI_dummy);
    /*第二次读取返回请求的数据*/
    返回(pga411_XmitSPI (读取、寄存器、SPI_dummy).datain);

    pga411_spi_frame_t pga411_XmitSPI (uint16 dir、uint16 reg、uint16 wdata)

    pga411_spi_frame_t out、in;

    /*我们是否读取数据? *
    if (dir = read){out.addr = pga411_regs[reg].read_add;}//读取地址*/
    /*或写入数据? *
    否则{out.addr = pga411_regs[reg].write_add;}//写入地址*/

    /*组成帧的其余部分*/
    out.dataout = wdata;//实数数据(W)或虚拟数据(R)*/
    OUT.RESERVED = 0x00;/*始终为零*/
    OUT.MCRC = pga411_CRC2 (out.frame);//计算 TX CRC */
    in.frame = hal_Xmit4BSPI (out.frame);

    /*检查 RX CRC */
    if (pga411_CRC2 (in.frame)!= in.scrc)

    HAL_assert();/*如果出错->终止*/

    返回(in );

    /*将数据写入定义的寄存器*/
    void pga411_WriteReg (uint16 reg、uint16数据)

    //这里我们只是使它变得很好,也可以是宏*/
    pga411_XmitSPI (写入、寄存器、数据);

    /*从 PGA 读取所有寄存器*/
    void pga411_ReadAll (void)

    int i;
    uint16 rx_data;

    /*按寄存器(27+1)注册*/
    /* PGA411始终返回先前的读取寄存器值*/
    /*这就是为什么需要28次读取(第一次读取返回任何数据)*/
    对于(I = 0;I < PGA411_REG_COUNT + 1;I++)

    RX_DATA = pga411_XmitSPI (读取、I、SPI_dummy).datain;

    /*boolean tick -如果不是第一个周期,则保存数据*/
    如果(I)

    pga411_regs[I - 1].real-val = rx_data;



    /*设备解锁(必须处于诊断状态)*/
    void pga411_DeviceUnlock (void)

    Pga411_WriteReg (DEV_UNLK_CTRL1、0x000F);
    Pga411_WriteReg (DEV_UNLK_CTRL1、0x0055);
    Pga411_WriteReg (DEV_UNLK_CTRL1、0x00AA);
    Pga411_WriteReg (DEV_UNLK_CTRL1、0x00F0);

    /* EEPROM 解锁(必须处于诊断状态)*/
    void pga411_EEPROMUnlock (void)

    Pga411_WriteReg (DEV_EE_CTRL4、0x000F);
    Pga411_WriteReg (DEV_EE_CTRL4、0x0055);
    pga411_WriteReg (DEV_EE_CTRL4、0x00AA);
    Pga411_WriteReg (DEV_EE_CTRL4、0x00F0);

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

    /* PGA411-Q1寄存器及其偏移量*/

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

    #define DEV_OVUV1 0x00
    #define DEV_OVUV2 0x01
    #define DEV_OVUV3 0x02
    #define DEV_OVUV4 0x03
    #define DEV_OVUV5 0x04
    #define DEV_OVUV6 0x05
    #define DEV_TLOOP_CFG 0x06
    #define DEV_AFE_CFG 0x07
    #define DEV_PHASE_CFG 0x08
    #define DEV_CONFIG1 0x09
    #define DEV_CONTROL1 0x0A //需要器件解锁*/
    #define DEV_CONTROL2 0x0B //需要解锁器件*/
    #define DEV_CONTROL3 0x0C
    #define DEV_STAT1 0x0D
    #define DEV_STAT2 0x0E
    #define DEV_STAT3 0x0F
    #define DEV_STAT4 0x10
    #define DEV_STAT5 0x11
    #define DEV_STAT6 0x12
    #define DEV_STAT7 0x13
    #define DEV_CLCRC 0x14
    #define DEV_CRC 0x15
    #define CRCCALC 0x16
    #define DEV_EE_CTRL1 0x17 /*需要 EEPROM 解锁*/
    #define DEV_CRC_CTRL1 0x18
    #define DEV_EE_CTRL4 0x19
    #define DEV_UNLK_CTRL1 0x1A
    #define dummy_REG 0x1B //这简化了连续读取*/

    #define PGA411_REG_COUNT 27

    #define dummy 0x00 /* dummy for SPI read */

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

    用户好!  

    我将把这个线程重定向到有助于 F28379D 的组。 感谢您在这里的耐心等待。  

    谢谢。  

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

    您好、Arjun Prakash  

    非常感谢您的回答。

    我在等这个。

    感谢您的任何帮助。

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

    尊敬的 Arjun:

    你好。 我想在这篇帖子中跟进我们客户的问题。 非常感谢。

    此致、

    Ray Vincent

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

    您好!

    我是 C2000团队的一员。

    [引用 userid="494274" URL"~/support/audio-group/audio/f/audio-forum/1042401/pga4311evm-pga411q1evm-external-control-of-the-pga411-evm-with-f28379d-control-card "]在范围内,我确认 NCS、SCK 和 SDI 引脚均有效,但 SDO 输出始终为0x41、0XFF、0x41

    以下行用于读取 DEV_STAT5寄存器:  

    Pga411_ReadReg (DEV_STAT5)

    只需浏览代码、用于读取该寄存器的帧即为:0x41、0xF0、0x00和 CRC。 在我看来、C2000代码执行编程所执行的操作。 您是否期望 MOSI 引脚上具有不同的输出?

    此外、采用逻辑分析仪设置的器件外观不正确。 从机绝对不会输出屏幕截图上显示的所有0xFFs。 我会仔细检查它。  

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

    为了扩展我的最后一个响应、这里是我查看过的代码行。

    /*从定义的寄存器读取数据*/
    UINT16 pga411_ReadReg (UINT16 reg)

    /*首次读取返回任何*/
    pga411_XmitSPI (读取、寄存器、SPI_dummy);
    /*第二次读取返回请求的数据*/
    返回(pga411_XmitSPI (读取、寄存器、SPI_dummy).datain);

    pga411_spi_frame_t pga411_XmitSPI (uint16 dir、uint16 reg、uint16 wdata)

    pga411_spi_frame_t out、in;

    /*我们是否读取数据? *
    if (dir = read){out.addr = pga411_regs[reg].read_add;}//读取地址*/
    /*或写入数据? *
    否则{out.addr = pga411_regs[reg].write_add;}//写入地址*/

    /*组成帧的其余部分*/
    out.dataout = wdata;//实数数据(W)或虚拟数据(R)*/
    OUT.RESERVED = 0x00;/*始终为零*/
    OUT.MCRC = pga411_CRC2 (out.frame);//计算 TX CRC */
    in.frame = hal_Xmit4BSPI (out.frame);

    /*检查 RX CRC */
    if (pga411_CRC2 (in.frame)!= in.scrc)

    HAL_assert();/*如果出错->终止*/

    返回(in );

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

    尊敬的 Gus Martinez:

    非常感谢您的回答。

    你能告诉我我我在那里犯了什么错误我不能理解我在那里犯了什么错误  

    如果您需要该代码、我可以与您分享该代码吗?

     

    感谢您的任何帮助。

    /*
    * PGA411.c
    *
    *创建日期:2021年10月11日
    *作者:Devilal
    *


    /*
    * pga411.c
    *
    *创建日期:2020年9月30日
    作者:Abhinav
    *

    #include "PGA411.h"
    //#include "hal.h"
    #include "F28x_Project.h"
    #include "hw_types.h"
    #include // IQ 数学库//
    #include "Communication.h"

    //
    //宏
    //
    #define CRC_BITCOUNT 24 //对于 CRC6、uint32的前24位//
    #define CRC_BYTECOUNT 3 //对于 CRC6、uint32的前3 B //
    #define CRC_INITSEED 0x3F // CRC6的初始种子//
    #define CRC_POLYNOM 0x5B // CRC = X6+X4+X3+X+1 //

    #define SPI_dummy 0xF0 //用于读取操作的虚拟 SPI 数据//

    #define empty_loop

    //
    //枚举
    //

    //
    // typedef
    //

    //
    //变量、常量
    //

    volatile pga411_SPI_FRAME_t pga411_SPI_FRAME ={.addr = 0x00、
    .dataout = 0x0000、
    .reserved = 0x0、
    .mcRC = 0x00
    };

    pga411_reg_t pga411_regs[PGA411_REG_COUNT + 1]=

    //内存常量 init //
    [DEV_OVUV1]={.read_add = 0x53、.write_add = 0x87、.def_val = 0x8B40}、
    [DEV_OVUV2]={.read_add = 0x6B、.write_add = 0x26、.def_val = 0x00ED}、
    [DEV_OVUV3]={.read_add = 0x65、.write_add = 0x17、.def_val = 0xFCFF}、
    [DEV_OVUV4]={.read_add = 0xEC、.write_add = 0x39、.def_val = 0x07E2}、
    [DEV_OVUV5]={.read_add = 0x52、.write_add = 0x75、.def_val = 0x1C00}、
    [DEV_OVUV6]={.read_add = 0xE9、.write_add = 0x83、.def_val = 0x038F}、
    [DEV_TLOOP_CFG]={.read_add = 0xA6、.write_add = 0x42、.def_val = 0x0514}、
    [DEV_AFE_CFG]={.read_add = 0xC2、.write_add = 0x91、.def_val = 0x0005}、
    [DEV_PHASE_CFG]={.read_add = 0x57、.write_add = 0x85、.def_val = 0x1800}、
    [DEV_CONFIG1]={.read_add = 0xBE、.write_add = 0xEB、.def_val = 0x0002}、
    [DEV_CONTROL1 ={.READ_ADD = 0x90、.WRITE_ADD = 0x0D、.def_val = 0x0000}、
    [DEV_CONTROL2]={.read_add = 0x63、.write_add = 0x38、.def_val = 0x0000}、
    [DEV_CONTROL3 ]={.read_add = 0xDD、.write_add = 0xAE、.def_val = 0x0003}、
    [DEV_STAT1]={.read_add = 0x81、.write_add = 0x00、.def_val = 0x0000}、
    [DEV_STAT2]={.read_add = 0x4D、.write_add = 0x00、.def_val = 0x004C}、
    [DEV_STAT3]={.read_add = 0x84、.write_add = 0x00、.def_val = 0x0000}、
    [DEV_STAT4]={.read_add = 0x1F、.write_add = 0x00、.def_val = 0x0004}、
    [DEV_STAT5]={.read_add = 0x41、.write_add = 0x00、.def_val = 0x4398}、
    [DEV_STAT6]={.read_add = 0x6f、.write_add = 0x00、.def_val = 0x3FFF}、
    [DEV_STAT7]={.read_add = 0xE1、.write_add = 0x00、.def_val = 0x004B}、
    [DEV_CLCRC]={.read_add = 0x4F、.write_add = 0xFC、.def_val = 0x00CE}、
    [DEV_CRC]={.read_add = 0x0F、.write_add = 0xE7、.def_val = 0x0000}、
    [CRCCALC]={.read_add = 0xD9、.write_add = 0xFF、.def_val = 0x00FF}、
    [DEV_EE_CTRL1]={.read_add = 0xE3、.write_add = 0x6E、.def_val = 0x0000}、
    [DEV_CRC_CTRL1]={.read_add = 0x7A、.write_add = 0xB6、.def_val = 0x0000}、
    [DEV_EE_CTRL4]={.read_add = 0xBA、.write_add = 0x56、.def_val = 0x0000}、
    [DEV_UNLK_CTRL1]={.read_add = 0x64、.write_add = 0x95、.def_val = 0x0000}、
    //对于连续读取,我们需要读取28次。 这对//有很大帮助
    [dummy_REG]={.read_add = 0x53、.write_add = 0x87、.def_val = 0x0000}、
    };


    char outbuf[30];//用于字符串转换的 UART 输出数据缓冲器//

    //
    //内部函数原型
    //

    //函数从 PGA411读取角度并通过 UART 发送//
    void GetAngleAndPrint (void);

    //函数从 PGA411读取速度并通过 UART 发送。//
    void GetVeloAndPrint (void);

    //计算输出数据的 CRC6,函数获取第一个3B 左对齐数据//
    UINT16 pga411_CRC2 (UINT32数据输入);

    //通过 SPI 将数据发送到 PGA,对于寄存器使用定义的宏,返回传入帧//
    pga411_spi_frame_t pga411_XmitSPI (uint16 dir、uint16 reg、uint16 wdata);

    //
    //内部功能
    //

    //函数从 PGA411读取角度并通过 UART 发送//
    空 GetAngleAndPrint (空)

    //使用 IQmathLib 库计算 PGA411-Q1的角度//
    //_iq19以0.000001907分辨率存储-4096至4095.9998093 //
    int16 angle_raw;//来自 PGA411-Q1寄存器的原始数据//
    _IQ 角度;// IQ 数学角度//
    //浮点 angle2;

    //终端命令//
    // hal_PutsUART ("角度[Deg]:");//将数据发送到 UART
    HAL_PutsRS232 ("角度[Deg]:");//将数据发送到 RS-232

    //从 PGA411-Q1读取数据//
    angle_raw = pga411_ReadReg (DEV_STAT5);
    angle_raw 和= 0x1FFF;//仅保留 ORDANGLE 位//

    //将最小步长(LSB)与 ORDANGLE 值相乘//
    角度=_IQ19mpy (_IQ19 (360.0 / 4096)、_IQ19 (angle_raw));// 12位模式//
    // angle2 =((360.0 / 4096)*(angle_raw & 0x1FFF);// 12位模式//可以代替 IQ 库

    //将 IQ 变量转换为字符串//
    _IQ19toa (outbuf、"%4.5f"、角度);

    //打印出缓冲区//
    // hal_PutsUART (outbuf);//将数据发送到 UART
    HAL_PutsRS232 (outbuf);//将数据发送到 RS-232

    //终端命令//
    // hal_PutsUART ("\n"r");
    HAL_PutsRS232 ("\n"r);


    //函数从 PGA411读取速度并通过 UART 发送。//
    空 GetVeloAndPrint (空)

    //使用 IQmathLib 库计算 PGA411-Q1的速度//
    //_iq14以0.000061035分辨率存储-131072到131071.9938965 //
    int16 velocity_raw;//来自 PGA411-Q1寄存器的原始数据//
    float velocity_float;//第二个补码到浮点转换的温度//
    _IQ 速度;// IQ 数学速度//


    //终端命令//
    // hal_PutsUART ("Velocity [RPM]:");//将数据发送到 UART
    HAL_PutsRS232 ("Velocity [RPM]:");//将数据发送到 RS-232
    //从 PGA411-Q1读取数据//
    Velocity_raw = pga411_ReadReg (DEV_STAT6);

    //将第二个补码转换为浮点//
    if (velocity_raw 和0x0800)//负数? //

    //首先转换为正数//
    Velocity_float =(((~velocity_raw)+ 1)& 0x07FF);
    Velocity_float *=-1;//并将 float 设为负//

    其他

    //正数,仅保留所需的位//
    Velocity_float =(velocity_raw & 0x07FF);

    速度=_IQ14mpy (_IQ14 (60 * 20000000 / 33554432)、_IQ14 (velime_float + 1));// 12b 示例//

    //将 IQ 变量转换为字符串//
    _IQ14toa (outbuf、"%4.5f"、速度);

    //打印出缓冲区//
    // hal_PutsUART (outbuf);//将数据发送到 UART
    HAL_PutsRS232 (outbuf);//将数据发送到 RS-232

    //终端命令//
    // hal_PutsUART ("\n"r");
    HAL_PutsRS232 ("\n"r);

    // CRC6计算-针对 PGA411进行了优化//
    UINT16 pga411_CRC2 (UINT32数据输入)

    int byte_idx;
    unsigned int bit_idx、CRC = 0x3F;

    for (byte_idx = 18;byte_idx>=0;byte_idx-=6)

    CRC^=(数据输入>>字节_idx)&0x3F;
    for (bit_idx=0;bit_idx<6;bit_idx++)

    CRC<<=1;
    CRC^=(CRC 和0x40)? 0x5B:0;


    返回(CRC&0x3F);


    //
    //系统接口功能
    //

    //使用 GPIO 执行 PGA411-Q1复位//
    void pga411_Reset (void)(空)

    GPIO_WritePin (nRESET、0);
    DELAY_US (100000);// 100ms 延迟//
    GPIO_WritePin (nRESET、1);
    DELAY_US (100000);// 100ms 延迟//

    //*使用 GPIO 执行 PGA411-Q1故障复位*/
    void pga411_FaultReset (void)(空)

    HAL_PGA_FAULTRES_LOW;//将 FAULTRES 置为低电平-打开收集器*/
    DELAY_US (1000);//保持状态1ms *
    HAL_PGA_FAULTRES_HIZ;//返回到 high-z*/

    //初始化 PGA411-Q1相关硬件//
    //void pga411_Init (void)
    //{
    // hal_InitPgaGPIO ();//初始化 GPIO //
    // hal_InitSPI ();//初始化 SPI 外围设备//
    // pga411_Reset ();//执行 PGA411重置//
    //}

    //使用 GPIO 执行 PGA411-Q1故障复位//
    //void pga411_FaultReset (void)(void)
    //{
    // GPIO_WritePin (FAULTRES、0);//将 FAULTRES 置为低电平-打开收集器//
    // delay_US (1000);// 1ms 延迟//
    // GPIO_WritePin (FAULTRES、1);//返回高电平 z//
    // delay_US (1000);// 1ms 延迟//
    //}


    //通过 SPI 将数据发送到 PGA,以便寄存器使用定义的宏//
    pga411_spi_frame_t pga411_XmitSPI (uint16 dir、uint16 reg、uint16 wdata)

    pga411_spi_frame_t out、in;

    //我们是否读取数据? //
    if (dir = read){out.addr = pga411_regs[reg].read_add;}//读取地址//
    //或写入数据? //
    否则{out.addr = pga411_regs[reg].write_add;}//写入地址//

    //组成帧的其余部分//
    out.dataout = wdata;//实数数据(W)或虚拟数据(R)//
    OUT.RESERVED = 0x00;//始终为零//
    OUT.MCRC = pga411_CRC2 (out.frame);//计算 TX CRC //
    in.frame = hal_Xmit4BSPI (out.frame);

    //检查 RX CRC //
    if (pga411_CRC2 (in.frame)!= in.scrc)

    HAL_assert();// if error -> Terminate //

    返回(in );

    //从定义的寄存器读取数据//
    UINT16 pga411_ReadReg (UINT16 reg)

    //第一次读取返回任何//
    pga411_XmitSPI (读取、寄存器、SPI_dummy);
    //第二次读取返回请求的数据//
    返回(pga411_XmitSPI (读取、寄存器、SPI_dummy).datain);

    //将数据写入定义的寄存器//
    void pga411_WriteReg (uint16 reg、uint16数据)

    //在这里,我们只是使它变得很好,也可以是宏//
    pga411_XmitSPI (写入、寄存器、数据);

    //从 PGA 读取所有寄存器//
    void pga411_ReadAll (void)

    int i;
    uint16 rx_data;

    //按寄存器(27+1)注册//
    // PGA411始终返回先前的读取寄存器值//
    //这就是为什么需要28次读取(第一次读取返回任何数据)//
    对于(I = 0;I < PGA411_REG_COUNT + 1;I++)

    RX_DATA = pga411_XmitSPI (读取、I、SPI_dummy).datain;

    //boolean tick -如果不是第一个周期,则保存数据//
    如果(I)

    pga411_regs[I - 1].real-val = rx_data;


    //更改状态诊断/正常//
    void pga411_State (UINT16状态)

    uint16温度;

    //输入诊断状态//
    如果(状态= DIAG)

    //读取 DEV_CONTROL3寄存器的内容//
    temp = pga411_ReadReg (DEV_CONTROL3);
    temp |= 0x0004;//设置位 SPIDIAG //
    pga411_WriteReg (DEV_CONTROL3、temp);//完成 R-M-W //

    //返回到正常状态//
    其他

    //读取 DEV_CONTROL1寄存器的内容//
    temp = pga411_ReadReg (DEV_CONTROL1);
    temp |= 0x0001;//设置位 DIAGEXIT //
    pga411_WriteReg (DEV_CONTROL1、temp);//完成 R-M-W //

    //设备解锁(必须处于诊断状态)//
    void pga411_DeviceUnlock (void)

    Pga411_WriteReg (DEV_UNLK_CTRL1、0x000F);
    Pga411_WriteReg (DEV_UNLK_CTRL1、0x0055);
    Pga411_WriteReg (DEV_UNLK_CTRL1、0x00AA);
    Pga411_WriteReg (DEV_UNLK_CTRL1、0x00F0);

    // EEPROM 解锁(必须处于诊断状态)//
    void pga411_EEPROMUnlock (void)

    Pga411_WriteReg (DEV_EE_CTRL4、0x000F);
    Pga411_WriteReg (DEV_EE_CTRL4、0x0055);
    pga411_WriteReg (DEV_EE_CTRL4、0x00AA);
    Pga411_WriteReg (DEV_EE_CTRL4、0x00F0);

    //将默认配置写入 PGA //
    void pga411_DefaultCfg (void)

    int i;
    //转至诊断状态//
    Pga411_State (DIAG);
    //解锁寄存器//
    pga411_DeviceUnlock();

    //将前12个寄存器设为默认值//
    //注意:对于某些用户,需要先解锁它们! //
    对于(I = 0;I < 12;I++)

    pga411_XmitSPI (write、i、pga411_regs[i]。def_val);

    //转至正常状态//
    pga411_State (正常);

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

    我很乐意帮助您回答有关对 C2000器件进行编程的任何问题或疑问。  根据我之前的回答、我认为 SPI 正在执行代码所指示的操作。 如果 SPI 不能满足您的期望、请告诉我、我可以查看一下。  

    您是否能够查看您的逻辑分析仪图? 正如我提到过的、您似乎在 MISO 引脚上获取数据。 这可能会提供一些线索。