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.

[参考译文] BQ79600EVM:SPI 自动寻址不工作

Guru**** 2390270 points
Other Parts Discussed in Thread: BQ79616, LP-MSP430FR2476, BQ79600EVM, USB2ANY
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/power-management-group/power-management/f/power-management-forum/1079859/bq79600evm-spi-autoaddressing-not-working

部件号:BQ79600EVM
《线程》中讨论的其他部件: LP-MSP430FR2476USB2ANY

我有 一个 LP-MSP430FR2476,使用 SPI 与 BQ79600EVM 通话,以及一个 BQ79616 EVM。

我无法成功完成“丢弃”阅读。 发出第一个读取请求命令帧后,范围显示 SPI_RDY 不可用。  

我使用 GUI 编写自动寻址命令。 下面是我尝试的顺序:

# BQ796xx 命令序列
#文件创建于2022-02-23 7:06:04 PM
B0 03 43 00 E7 D4
B0 03 44 00 E5 E4
B0 03 45 00 E4 74
B0 03 46 00 E4 84
B0 03 47 00 E5 14
B0 03 48 00 E0 E4
B0 03 49 00 E1 74
B0 03 4A 00 E1 84
B0 03 09 00 D0 B4
B0 03 06 00 D5 44
B0 03 06 01 14 84
d0 03 08 02 4E E5
90 00 03 08 03 53 DC
A0 03 43 00 E3 14
A0 03 44 00 E1 24
A0 03 45 00 E0 B4
A0 03 46 00 E0 44
A0 03 47 00 E1 D4
A0 03 48 00 E4 24
A0 03 49 00 E5 B4
A0 03 4A 00 E5 44

这无法成功运行。 无论我拔下多少次电源插头并将其放回,USB2ANY 上的指示灯都会开始闪烁。 你能告诉我为什么会这样? 当我使用 BQ UART 时,自动寻址已成功完成。

谢谢,

普里亚

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

    您好,Priya,

    问题似乎来自序列中的以下行。 以红色突出显示的行应为广播读取,以注册值0x01的0x309,从而启用自动寻址。 目前,此寄存器被写入0,该0将不会启动寻址。 以黄色突出显示的行应更改为广播读取。

    # BQ796xx 命令序列
    #文件创建于2022-02-23 7:06:04 PM
    B0 03 43 00 E7 D4
    B0 03 44 00 E5 E4
    B0 03 45 00 E4 74
    B0 03 46 00 E4 84
    B0 03 47 00 E5 14
    B0 03 48 00 E0 E4
    B0 03 49 00 E1 74
    B0 03 4A 00 E1 84
    B0 03 09 00 D0 B4
    B0 03 06 00 D5 44
    B0 03 06 01 14 84
    d0 03 08 02 4E E5
    90 00 03 08 03 53 DC
    A0 03 43 00 E3 14
    A0 03 44 00 E1 24
    A0 03 45 00 E0 B4
    A0 03 46 00 E0 44
    A0 03 47 00 E1 D4
    A0 03 48 00 E4 24
    A0 03 49 00 E5 B4
    A0 03 4A 00 E5 44

    谢谢,

    Geoff

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

    我正在将 LP-MSP430FR2476 SPI 与 BQ70600 EVM 配合使用。 在 SPI 传输后添加了禁用 NCS 的延迟后,BQ79616的唤醒现在是一致的。  

    但是,通过自动寻址,我可以完成第一个即点即用的读取。 在第二次抛出读取期间,SPI_RDY 变低。 这是为什么?  

    void spiTransmitData(uint32_t blocksize, uint16_t * srcbuff)
    {
        volatile uint32_t SpiBuf;
        GPIO_setOutputLowOnPin(MCU_BDG_SPI_CS_PORT, MCU_BDG_SPI_CS_PIN);
        __delay_cycles(32);            //2 us delay, per Fig 7-13 of BQ79600 datasheet, this can be 500 ns.
    
        for (SpiBuf = 0; SpiBuf < blocksize; SpiBuf++){
            while(!(MCU_BDG_IFG & UCTXIFG));
            MCU_BDG_TXBUF = *srcbuff;
            while (!(MCU_BDG_IFG & UCRXIFG));
            srcbuff++;
        }
    
        __delay_cycles(1000);
    
        GPIO_setOutputHighOnPin(MCU_BDG_SPI_CS_PORT, MCU_BDG_SPI_CS_PIN);
        __delay_cycles(1000);
    
    }
    
    void spiTransmitAndReceiveData(uint32_t blocksize, uint16_t * srcbuff, uint16_t * destbuff)
    {
        volatile uint32_t SpiBuf;
    
        for (SpiBuf = 0; SpiBuf < blocksize; SpiBuf++){
            while(!(MCU_BDG_IFG & UCTXIFG));
            MCU_BDG_TXBUF = *srcbuff;
            while (!(MCU_BDG_IFG & UCRXIFG));
            *destbuff = MCU_BDG_RXBUF;
    
            srcbuff++;
            destbuff++;
        }
    
        __delay_cycles(1000);
    
        GPIO_setOutputHighOnPin(MCU_BDG_SPI_CS_PORT, MCU_BDG_SPI_CS_PIN);
        __delay_cycles(1000);
    
    }

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

    您好,Priya,

    您是否修复了上一次回复中列出的自动寻址顺序? 如果没有,设备将无法正确寻址,因此不会响应任何读取。

    谢谢,

    Geoff

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

    #include "globals.h"
    #include "commandFuncs.h"
    #include "B0_reg.h"
    
    BYTE autoaddr_response_frame[(1+6)*TOTALBOARDS]; //response frame for auto-addressing sequence
    int currentBoard = 0;
    
    void WakeUpBQ(void){
        GPIO_setOutputLowOnPin(MCU_BDG_SPI_CS_PORT, MCU_BDG_SPI_CS_PIN);
        __delay_cycles(32);            //2 us delay
    
        GPIO_setOutputLowOnPin(MCU_BDG_SPI_SIMO_PORT, MCU_BDG_SPI_SIMO_PIN);
        __delay_cycles(44000);         //2.75 ms delay
        GPIO_setOutputHighOnPin(MCU_BDG_SPI_SIMO_PORT, MCU_BDG_SPI_SIMO_PIN);
        __delay_cycles(32);            //2 us delay
    
        GPIO_setOutputHighOnPin(MCU_BDG_SPI_CS_PORT, MCU_BDG_SPI_CS_PIN);
    
    }
    
    void AutoAddress(void){
        //DUMMY WRITE TO SNCHRONIZE ALL DAISY CHAIN DEVICES DLL (IF A DEVICE RESET OCCURED PRIOR TO THIS)
        SpiWriteReg(0, OTP_ECC_DATAIN1, 0X00, 1, FRMWRT_STK_W);
        SpiWriteReg(0, OTP_ECC_DATAIN2, 0X00, 1, FRMWRT_STK_W);
        SpiWriteReg(0, OTP_ECC_DATAIN3, 0X00, 1, FRMWRT_STK_W);
        SpiWriteReg(0, OTP_ECC_DATAIN4, 0X00, 1, FRMWRT_STK_W);
        SpiWriteReg(0, OTP_ECC_DATAIN5, 0X00, 1, FRMWRT_STK_W);
        SpiWriteReg(0, OTP_ECC_DATAIN6, 0X00, 1, FRMWRT_STK_W);
        SpiWriteReg(0, OTP_ECC_DATAIN7, 0X00, 1, FRMWRT_STK_W);
        SpiWriteReg(0, OTP_ECC_DATAIN8, 0X00, 1, FRMWRT_STK_W);
    
        //ENABLE AUTO ADDRESSING MODE
        SpiWriteReg(0, CONTROL1, 0X01, 1, FRMWRT_ALL_W);
    
        //SET ADDRESSES FOR EVERY BOARD
        for(currentBoard=0; currentBoard<TOTALBOARDS; currentBoard++)
        {
            SpiWriteReg(0, DIR0_ADDR, currentBoard, 1, FRMWRT_ALL_W);
        }
    
        //BROADCAST WRITE TO SET ALL DEVICES AS STACK DEVICE
        SpiWriteReg(0, COMM_CTRL, 0x02, 1, FRMWRT_ALL_W);
    
        //SET THE HIGHEST DEVICE IN THE STACK AS BOTH STACK AND TOP OF STACK
        SpiWriteReg(TOTALBOARDS-1, COMM_CTRL, 0x03, 1, FRMWRT_SGL_W);
    
    
        //SYNCRHONIZE THE DLL WITH A THROW-AWAY READ
        SpiReadReg(0, OTP_ECC_DATAIN1, autoaddr_response_frame, 1, 0, FRMWRT_STK_R);
        SpiReadReg(0, OTP_ECC_DATAIN2, autoaddr_response_frame, 1, 0, FRMWRT_STK_R);
        SpiReadReg(0, OTP_ECC_DATAIN3, autoaddr_response_frame, 1, 0, FRMWRT_STK_R);
        SpiReadReg(0, OTP_ECC_DATAIN4, autoaddr_response_frame, 1, 0, FRMWRT_STK_R);
        SpiReadReg(0, OTP_ECC_DATAIN5, autoaddr_response_frame, 1, 0, FRMWRT_STK_R);
        SpiReadReg(0, OTP_ECC_DATAIN6, autoaddr_response_frame, 1, 0, FRMWRT_STK_R);
        SpiReadReg(0, OTP_ECC_DATAIN7, autoaddr_response_frame, 1, 0, FRMWRT_STK_R);
        SpiReadReg(0, OTP_ECC_DATAIN8, autoaddr_response_frame, 1, 0, FRMWRT_STK_R);
    
        //OPTIONAL: read back all device addresses
        for(currentBoard=0; currentBoard<TOTALBOARDS; currentBoard++)
        {
            SpiReadReg(currentBoard, DIR0_ADDR, autoaddr_response_frame, 1, 0, FRMWRT_SGL_R);
        }
    
        //OPTIONAL: read register address 0x2001 and verify that the value is 0x14
        if (BRIDGEDEVICE)
           SpiReadReg(0, 0x2001, autoaddr_response_frame, 1, 0, FRMWRT_SGL_R);
    
        return;
    }
    

    是的,我使用的是 Hercules TI SPI 示例代码中的 AA。 我在 GUI 中作为命令序列输入的内容是 typo。

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

    我正确设置 SPI 时钟后,自动寻址似乎已完成——我已将 SPI 接口设置为2Mbps,轮询模式。 我仍然无法读取电池电压。 我想了解响应框架的部分内容。  我看 了 SLUSDS1A 的图7-7。 您能否查看随附的自动地址响应帧并告诉我它们是否正确?

    注册地址0x306,0x2001在上述图片中以4字节显示。 我看到0x14是其中一个字节。 如果你能给这一反应框架的部分贴上标签,我很感激。