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.

[参考译文] UCC5870-Q1:当 SPI 通信完成时、nFLT2变为低电平

Guru**** 2496595 points
Other Parts Discussed in Thread: UCC5870-Q1

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

https://e2e.ti.com/support/power-management-group/power-management/f/power-management-forum/1472765/ucc5870-q1-nflt2-going-low-when-spi-communication-is-done

器件型号:UCC5870-Q1

工具与软件:

您好、我将在具有 F280025c 的 CCS 中使用这些代码来写入 CONFIG1寄存器中的 UVLO1电平。 但在我运行代码的这一刻、nFLT2变为低电平。 我感觉是不知何故地爱抚是错误的,但我无法确定在哪里。

我首先通过数据表表7-3中给出的 WR_RA 命令来设置寄存器、然后更改更低位 WRL。 请提供帮助

这是我的代码:  

//UCC5870-Q1配置(使用 TI F280025C)
#include "F28002x_Device.h"//包含 F280025C 头文件
#include "driverlib.h"//包含 TI 驱动程序库
#include "device.h"//包含特定于器件的定义

//定义 SPI 设置
#define SPI_BAUD_RATE 1000000 // 1 MHz
#define SPI_CLK_POLARITY 0 //时钟极性
#define SPI_CLK_PHASE 1 //时钟相位

//为 LaunchPad 上的 SPI 定义 GPIO 引脚
#define SPI_CS_PIN 10 //片选(使用 GPIO10)
#define SPI_MISO_PIN GPIO_17_SPIA_SOMI // SDO (使用 GPIO17)
#define SPI_MOSI_PIN GPIO_16_SPIA_SIMO // SDI (使用 GPIO16)
#define SPI_CLK_PIN GPIO_9_SPIA_CLK
//定义芯片地址
#define CHIP_ADDR 0x0 //默认芯片地址


Volatile uint8_t faultDetected = 0;
//函数原型
void setupSPI (void);
void writeUCC5870 (uint16_t regAddr、uint16_t data);
uint16_t readUCC5870 (uint16_t regAddr);
void configureUCC5870 (void);
void checkFaultStatus (void);


void enterConfiguration2 (void);
void exitConfiguration2 (void);


void main (void){
//初始化设备
device_init();
device_initGPIO();

//设置 SPI
setupSPI();

//配置 UCC5870
configureUCC5870 ();

while (1){
//主循环
}
}

void setupSPI (void){
//为 LaunchPad 上的 SPI 配置 GPIO 引脚
GPIO_setPinConfig (SPI_MOSI_PIN);//配置 MOSI
GPIO_setPinConfig (SPI_MISO_PIN);//配置 MISO
GPIO_setPinConfig (SPI_CLK_PIN);//配置 CLK
GPIO_setPinConfig (GPIO_10_GPIO10);
GPIO_setDirectionMode (SPI_CS_PIN、GPIO_DIR_MODE_OUT);//将 CS 设置为输出

//配置 SPI
SPI_setConfig (SPIA_BASE、DEVICE_LSPCLK_FREQ、SPI_PROT_POL0PHA1、SPI_MODE_MASTER、SPI_BAUD_RATE、 16);
SPI_enableModule (SPIA_BASE);
SPI_setEmulationMode (SPIA_BASE、SPI_EMULATION_FREE_RUN);
}

void writeUCC5870 (uint16_t regAddr、uint16_t data)

GPIO_writePin (SPI_CS_PIN、0);//将 CS 拉至低电平
//步骤1:使用 WR_RA (0xC)设置寄存器地址
uint16_t 命令;
命令=(CHIP_ADDR << 12)|(0xC << 8)|(regAddr & 0x1F);
SPI_writeDataBlockingNonFIFO (SPIA_BASE、command);
DEVICE_DELAY_US (10);

//步骤2:使用 WRL 写入数据(0xB)
uint16_t txData =((CHIP_ADDR << 12)|(0xB << 8)|(DATA & 0xFF));
SPI_writeDataBlockingNonFIFO (SPIA_BASE、txData);

while (SPI_isBusy (SPIA_BASE));
GPIO_writePin (SPI_CS_PIN、1);//释放 CS
}

void configureUCC5870 (void){
//将 UVLO1 (寄存器地址0x00)配置为值0x00
写入 UCC5870 (0x00、0x00);
}

这是我在示波器上看到的内容(红色- nCS、蓝色- CLK、黑色- SDI)

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

    尊敬的 Mohd:

    需要澄清的是、器件上电后 nFLT1引脚是低电平还是在执行 SPI 命令后为低电平?

    您的代码与按照流程图将 UCC5870置于正确的运行模式来配置器件不同。 看起来您正在尝试写入 CFG1 (0x00)以配置 UVLO1、而没有进入 配置2 MODE。

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

    为了首先进行写入、我们必须转至配置2、然后使用 wr_RA 命令、接着使用 WRH 或 WRL、具体取决于我们需要对哪个位进行正确编程?
    为了进行读取、我们必须使用寄存器名称正确的 RD_DATA 命令?
    但在我完成寄存器写入后、它不会在 SDO 线路上为我提供数据。 虽然现在没有触发 FLT 引脚、但我希望正在进行写入。 您能否检查一下、这是更新后的代码:



    //UCC5870-Q1配置(使用 TI F280025C)
    #include "F28002x_Device.h"//包含 F280025C 头文件
    #include "driverlib.h"//包含 TI 驱动程序库
    #include "device.h"//包含特定于器件的定义

    //定义 SPI 设置
    #define SPI_BAUD_RATE 1000000 // 1 MHz
    #define SPI_CLK_POLARITY 0 //时钟极性
    #define SPI_CLK_PHASE 1 //时钟相位

    //为 LaunchPad 上的 SPI 定义 GPIO 引脚
    #define SPI_CS_PIN 10 //片选(使用 GPIO10)
    #define SPI_MISO_PIN GPIO_17_SPIA_SOMI // SDO (使用 GPIO17)
    #define SPI_MOSI_PIN GPIO_16_SPIA_SIMO // SDI (使用 GPIO16)
    #define SPI_CLK_PIN GPIO_9_SPIA_CLK
    //定义芯片地址
    #define CHIP_ADDR 0x0 //默认芯片地址

    Volatile uint8_t faultDetected = 0;
    //函数原型
    void setupSPI (void);
    void sendWR_RA (uint16_t regAddr);
    void writeUCC5870 (uint16_t data);
    void configureCOMMANDUCC5870 (void);
    void enterConfiguration2 (void);
    void exitConfiguration2 (void);
    void enterConfigMode();
    uint16_t readUCC5870 (uint16_t regAddr);
    volatile uint16_t regVal = 0;//将其设为全局


    void main (void){
    //初始化设备
    device_init();
    device_initGPIO();

    //设置 SPI
    setupSPI();

    GPIO_writePin (SPI_CS_PIN、0);
    DEVICE_DELAY_US (20);

    //配置 UCC5870
    EnterConfigMode ();//发送 CONFIG_IN 命令(请参阅表7-3)以转换到通过 MCU 对器件配置进行编程所需的配置2状态[1111 0010 0010]
    DEVICE_DELAY_US (10);

    // enterConfiguration2();
    // exitConfiguration2();
    configureCOMMANDUCC5870();

    DEVICE_DELAY_US (40);
    GPIO_writePin (SPI_CS_PIN、1);

    DEVICE_DELAY_US (20);
    GPIO_writePin (SPI_CS_PIN、0);
    writeUCC5870 (0x20);
    DEVICE_DELAY_US (20);
    GPIO_writePin (SPI_CS_PIN、1);


    while (1)

    //主循环
    }
    }

    void setupSPI (void){
    //为 LaunchPad 上的 SPI 配置 GPIO 引脚
    GPIO_setPinConfig (SPI_MOSI_PIN);//配置 MOSI
    GPIO_setPinConfig (SPI_MISO_PIN);//配置 MISO
    GPIO_setPinConfig (SPI_CLK_PIN);//配置 CLK
    GPIO_setPinConfig (SPI_CS_PIN);
    GPIO_setDirectionMode (SPI_CS_PIN、GPIO_DIR_MODE_OUT);//将 CS 设置为输出

    //配置 SPI
    SPI_setConfig (SPIA_BASE、DEVICE_LSPCLK_FREQ、SPI_PROT_POL0PHA1、SPI_MODE_MASTER、SPI_BAUD_RATE、 16);
    SPI_enableModule (SPIA_BASE);
    SPI_setEmulationMode (SPIA_BASE、SPI_EMULATION_FREE_RUN);
    //
    // GPIO_setPadConfig (SPI_MISO_PIN、GPIO_PIN_TYPE_STD);//确保标准输入模式
    // GPIO_setQualificationMode (SPI_MISO_PIN、GPIO_QUAL_ASYNC);//设置为异步模式


    }

    void enterConfigMode (void){
    uint16_t cfgInCommand = 0xF222;// 16位格式1111 0010 0010 0010的 CFG_IN 命令

    // GPIO_writePin (SPI_CS_PIN、0);//将 CS 拉至低电平
    // device_delay_US (20);
    SPI_writeDataBlockingNonFIFO (SPIA_BASE、cfgInCommand);
    while (SPI_isBusy (SPIA_BASE));//等待传输完成
    DEVICE_DELAY_US (20);
    // GPIO_writePin (SPI_CS_PIN、1);//将 CS 拉至高电平
    }


    void sendWR_RA (uint16_t regAddr)

    uint16_t command =((CHIP_ADDR << 12)|(0xC << 8)|(regAddr & 0x1F));// WR_RA 格式

    GPIO_writePin (SPI_CS_PIN、0);//在事务之前将 CS 拉至低电平
    DEVICE_DELAY_US (2);//稳定的小延迟

    SPI_writeDataBlockingNonFIFO (SPIA_BASE、COMMAND);//发送 WR_RA 命令
    while (SPI_isBusy (SPIA_BASE));//等待 SPI 事务完成

    // GPIO_writePin (SPI_CS_PIN、1);//在事务后将 CS 拉至高电平
    }

    void writeUCC5870 (uint16_t data)

    while (SPI_isBusy (SPIA_BASE));//确保 SPI 在启动前处于空闲状态

    // GPIO_writePin (SPI_CS_PIN、0);//在写入数据之前将 CS 拉至低电平
    // DEVICE_DELAY_US (10);//稳定 CS 线路的小延迟

    // uint16_t txData =((CHIP_ADDR << 12)|(0xB << 8)|(regAddr << 3)|(DATA & 0xFF));//更正了写入命令格式
    //将变量定义为00100000

    uint16_t txData =((CHIP_ADDR << 12)|(0xA << 8)|(DATA & 0xFF));


    SPI_writeDataBlockingNonFIFO (SPIA_BASE、txData);

    while (SPI_isBusy (SPIA_BASE));//等待 SPI 事务完成

    // device_delay_us (20);//小延迟以确保完整传输
    // GPIO_writePin (SPI_CS_PIN、1);//仅在 SPI 完成后释放 CS
    }
    //

    uint16_t readUCC5870 (uint16_t regAddr)

    uint16_t txData =((CHIP_ADDR << 12)|(0x1 << 8)|(regAddr << 3));//更正了读取命令格式[1111 0001 0000 0000]

    GPIO_writePin (SPI_CS_PIN、0);//将 CS 拉至低电平
    DEVICE_DELAY_US (10);
    SPI_writeDataBlockingNonFIFO (SPIA_BASE、txData);
    while (SPI_isBusy (SPIA_BASE));
    SPI_readDataBlockingNonFIFO (SPIA_BASE);
    // DEVICE_DELAY_US (10);
    // GPIO_writePin (SPI_CS_PIN、1);//释放 CS
    // DEVICE_DELAY_US (10);//小延迟

    // SPI_writeDataBlockingNonFIFO (SPIA_BASE、0xF542);//发送 NOP 以进行时钟输出数据
    // while (SPI_isBusy (SPIA_BASE));

    // uint16_t rxData = SPI_readDataBlockingNonFIFO (SPIA_BASE);//现在读取实际的寄存器数据

    返回0;//返回有效寄存器数据


    }


    //
    //void enterConfiguration2 (void)
    //{
    // writeUCC5870 (0x1B、0x0001);//写入 CONTROL1寄存器以进入配置2
    // DEVICE_DELAY_US (10);//允许转换的小延迟
    //}
    //
    // void exitConfiguration2 (void)
    //{
    // writeUCC5870 (0x1B、0x0000);//根据需要退出配置2
    //}


    空 configureCOMMANDUCC5870 (空)

    //将 UVLO1 (寄存器地址0x00)配置为值0x00
    GPIO_writePin (SPI_CS_PIN、0);//在写入数据之前将 CS 拉至低电平


    sendWR_RA (0x00);//1111 1100 000[0 0000]
    writeUCC5870 (0x20);//1111 1011 0010 0000
    //回读以验证配置
    readUCC5870 (0x00);

    DEVICE_DELAY_US (20);
    // readUCC5870 (0x00);


    }

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

    尊敬的 Mohd:

    您能否提供您的设计和电源条件的示意图? 请随时直接发送给我、因为这是一个公共论坛。

    执行 SPI 时、您通常不会看到故障  

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

    我如何在这个论坛中私下回复您?

    另外告诉我一点、如果我使用的是独立从配置、那么在芯片地址中应该放什么来读写数据? 0xF 是否可以用作 广播地址? 因为如果我使用的是0x0或0xF、则数据表第7.5.1.2节中显示为:

    "当接收到无效寻址命令或0xF (广播地址)时、SDO 恢复为高阻抗、 从而允许其他器件控制共享的 MISO (SDO)总线。"

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

    尊敬的 Mohd:

    我已接受您朋友的请求、您现在可以通过直接消息向我发送您的原理图。

    使用独立从器  件配置时、0x0或0xF 可用于系统中的所有器件。

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

    请回复我的私人留言!

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

    尊敬的 Mohd:

    很抱歉耽误您的时间、请检查您的收件箱。

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

    尊敬的 Mohd:

    根据波形、您可能会 由于 SPI 命令不匹配而出现故障。 当 nCS 转换为低电平和高电平而未接收到适当数量的 SCLK 脉冲(16的倍数)时、器件将触发 SPI 通信故障。

    我将让 C2000团队的一名成员了解该问题、他们将能够进一步帮助您更正您的 SPI 代码。

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

    该故障触发问题之前已经解决、我已经告诉过您。 现在的问题是即使 SDI、时钟和 nCS 保持预期, SDO 似乎保持高阻抗,因此没有读数是可能的,如果我不读取,只是前进到启用驱动器通过发送, DR_EN 它不启用驱动器,因为栅极电压保持在-SDO VEE