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.

[参考译文] MSP-EXP430FR5994:伪波 UART 接收

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/1109092/msp-exp430fr5994-spurious-uart-receive

器件型号:MSP-EXP430FR5994
主题中讨论的其他器件: MSP430FR5994MSP430WARE

请查看 MSP430 UART 接收。 接收中断触发太早、接收到的数据不正确。

 

  • 您的完整硬件设置说明–您使用的是什么电路板、所有组件如何相互连接、您如何连接到 PC?

 

PC -> MSP-EXP430FR5994 EUSCIA1UART -> BQ79600-EVM ->定制 BQ79616

 

  • 您如何监控系统以查看结果?

断点位于:

  ReadReg (0、0x2001、autodr_Response_FRAME、1、0、 FRMWRT_SGL_R);

进入这条线会立即进入 UART ISR、而不是读取寄存器下面的函数。 仅接收到一个字节、不正确。 在该字节之后、UART ISR 不会触发。

  • 对您为进入测试示例所采取的步骤/过程的描述、您对应该发生的情况的期望以及您实际看到的情况

BQ79600应返回7个字节来响应 ReadReg 0x2001命令。 返回的地址应为字节5上的0x14。

 

  • 最后、到目前为止、您已采取哪些步骤来调试它?

除了在 CCS IDE 上观察变量/寄存器内容之外、我还在 BQ79600 EVM UART RX 和 TX 上使用了示波器探针。

/*
 * uartCommands.c
 *
 *  Created on: Apr 21, 2022
 *      Author: Priya.Nadathur
 */


#include <driverlib.h>
#include <string.h>
#include "bspFuncs.h"
#include "mbbConfig.h"
#include "uartCommands.h"
#include "timer.h"
#include "B0_reg.h"

#ifdef BQ_UART

// CRC16 TABLE
// ITU_T polynomial: x^16 + x^15 + x^2 + 1
const uint16_t crc16_table[256] = { 0x0000, 0xC0C1, 0xC181, 0x0140, 0xC301,
        0x03C0, 0x0280, 0xC241, 0xC601, 0x06C0, 0x0780, 0xC741, 0x0500, 0xC5C1,
        0xC481, 0x0440, 0xCC01, 0x0CC0, 0x0D80, 0xCD41, 0x0F00, 0xCFC1, 0xCE81,
        0x0E40, 0x0A00, 0xCAC1, 0xCB81, 0x0B40, 0xC901, 0x09C0, 0x0880, 0xC841,
        0xD801, 0x18C0, 0x1980, 0xD941, 0x1B00, 0xDBC1, 0xDA81, 0x1A40, 0x1E00,
        0xDEC1, 0xDF81, 0x1F40, 0xDD01, 0x1DC0, 0x1C80, 0xDC41, 0x1400, 0xD4C1,
        0xD581, 0x1540, 0xD701, 0x17C0, 0x1680, 0xD641, 0xD201, 0x12C0, 0x1380,
        0xD341, 0x1100, 0xD1C1, 0xD081, 0x1040, 0xF001, 0x30C0, 0x3180, 0xF141,
        0x3300, 0xF3C1, 0xF281, 0x3240, 0x3600, 0xF6C1, 0xF781, 0x3740, 0xF501,
        0x35C0, 0x3480, 0xF441, 0x3C00, 0xFCC1, 0xFD81, 0x3D40, 0xFF01, 0x3FC0,
        0x3E80, 0xFE41, 0xFA01, 0x3AC0, 0x3B80, 0xFB41, 0x3900, 0xF9C1, 0xF881,
        0x3840, 0x2800, 0xE8C1, 0xE981, 0x2940, 0xEB01, 0x2BC0, 0x2A80, 0xEA41,
        0xEE01, 0x2EC0, 0x2F80, 0xEF41, 0x2D00, 0xEDC1, 0xEC81, 0x2C40, 0xE401,
        0x24C0, 0x2580, 0xE541, 0x2700, 0xE7C1, 0xE681, 0x2640, 0x2200, 0xE2C1,
        0xE381, 0x2340, 0xE101, 0x21C0, 0x2080, 0xE041, 0xA001, 0x60C0, 0x6180,
        0xA141, 0x6300, 0xA3C1, 0xA281, 0x6240, 0x6600, 0xA6C1, 0xA781, 0x6740,
        0xA501, 0x65C0, 0x6480, 0xA441, 0x6C00, 0xACC1, 0xAD81, 0x6D40, 0xAF01,
        0x6FC0, 0x6E80, 0xAE41, 0xAA01, 0x6AC0, 0x6B80, 0xAB41, 0x6900, 0xA9C1,
        0xA881, 0x6840, 0x7800, 0xB8C1, 0xB981, 0x7940, 0xBB01, 0x7BC0, 0x7A80,
        0xBA41, 0xBE01, 0x7EC0, 0x7F80, 0xBF41, 0x7D00, 0xBDC1, 0xBC81, 0x7C40,
        0xB401, 0x74C0, 0x7580, 0xB541, 0x7700, 0xB7C1, 0xB681, 0x7640, 0x7200,
        0xB2C1, 0xB381, 0x7340, 0xB101, 0x71C0, 0x7080, 0xB041, 0x5000, 0x90C1,
        0x9181, 0x5140, 0x9301, 0x53C0, 0x5280, 0x9241, 0x9601, 0x56C0, 0x5780,
        0x9741, 0x5500, 0x95C1, 0x9481, 0x5440, 0x9C01, 0x5CC0, 0x5D80, 0x9D41,
        0x5F00, 0x9FC1, 0x9E81, 0x5E40, 0x5A00, 0x9AC1, 0x9B81, 0x5B40, 0x9901,
        0x59C0, 0x5880, 0x9841, 0x8801, 0x48C0, 0x4980, 0x8941, 0x4B00, 0x8BC1,
        0x8A81, 0x4A40, 0x4E00, 0x8EC1, 0x8F81, 0x4F40, 0x8D01, 0x4DC0, 0x4C80,
        0x8C41, 0x4400, 0x84C1, 0x8581, 0x4540, 0x8701, 0x47C0, 0x4680, 0x8641,
        0x8201, 0x42C0, 0x4380, 0x8341, 0x4100, 0x81C1, 0x8081, 0x4040 };


BYTE bBuf[8];

uint8_t pFrame[64];
int bRes = 0;
BYTE bReturn = 0;

BYTE* currCRC;
int crc_i = 0;
uint16_t wCRC2 = 0xFFFF;
int crc16_i = 0;

uint8_t uartRxLen;
static uint8_t idx;
volatile uint8_t rxComplete;
BYTE  RXData[(1+6)*TOTALBOARDS] = {0};

BYTE response_frame[(8)*TOTALBOARDS]; //store 128 bytes + 6 header bytes for each board

// Configure BQ UART @1000000 baud
// software-dl.ti.com/.../index.html
void UART_Init(void){

    GPIO_setAsPeripheralModuleFunctionInputPin(
          BQUART_TX_PORT,
          BQUART_TX_PIN + BQUART_RX_PIN,
          BQUART_SELECT_FUNCTION
    );

    BQUART_initParam param = {0};

    param.clockPrescalar = 4,
    param.firstModReg = 0,
    param.secondModReg = 0,
    param.selectClockSource = BQUART_CLOCKSOURCE;
    param.parity =            BQUART_PARITY;
    param.msborLsbFirst =     BQUART_BITORDER;
    param.numberofStopBits =  BQUART_STOPBIT;
    param.uartMode =          BQUART_MODE;
    param.overSampling =      BQUART_OVERSAMPLING;

    if(STATUS_FAIL == BQUART_INIT(BQUART, &param))
    {
       return;
    }

    BQUART_enable(BQUART);
    BQUART_clearInterrupt(BQUART, BQUART_RX_INT);
    BQUART_enableInterrupt(BQUART, BQUART_RX_INT);

}

//FORMAT WRITE DATA, SEND TO
//BE COMBINED WITH REST OF FRAME

int WriteReg(BYTE bID, uint16_t wAddr, uint64_t dwData, BYTE bLen, BYTE bWriteType){
    // device address, register start address, data bytes, data length, write type (single, broadcast, stack)
    bRes = 0;
    memset(bBuf,0,sizeof(bBuf));
    switch (bLen) {
    case 1:
        bBuf[0] = dwData & 0x00000000000000FF;
        bRes = WriteFrame(bID, wAddr, bBuf, 1, bWriteType);
        break;
    case 2:
        bBuf[0] = (dwData & 0x000000000000FF00) >> 8;
        bBuf[1] = dwData & 0x00000000000000FF;
        bRes = WriteFrame(bID, wAddr, bBuf, 2, bWriteType);
        break;
    case 3:
        bBuf[0] = (dwData & 0x0000000000FF0000) >> 16;
        bBuf[1] = (dwData & 0x000000000000FF00) >> 8;
        bBuf[2] = dwData & 0x00000000000000FF;
        bRes = WriteFrame(bID, wAddr, bBuf, 3, bWriteType);
        break;
    case 4:
        bBuf[0] = (dwData & 0x00000000FF000000) >> 24;
        bBuf[1] = (dwData & 0x0000000000FF0000) >> 16;
        bBuf[2] = (dwData & 0x000000000000FF00) >> 8;
        bBuf[3] = dwData & 0x00000000000000FF;
        bRes = WriteFrame(bID, wAddr, bBuf, 4, bWriteType);
        break;
    case 5:
        bBuf[0] = (dwData & 0x000000FF00000000) >> 32;
        bBuf[1] = (dwData & 0x00000000FF000000) >> 24;
        bBuf[2] = (dwData & 0x0000000000FF0000) >> 16;
        bBuf[3] = (dwData & 0x000000000000FF00) >> 8;
        bBuf[4] = dwData & 0x00000000000000FF;
        bRes = WriteFrame(bID, wAddr, bBuf, 5, bWriteType);
        break;
    case 6:
        bBuf[0] = (dwData & 0x0000FF0000000000) >> 40;
        bBuf[1] = (dwData & 0x000000FF00000000) >> 32;
        bBuf[2] = (dwData & 0x00000000FF000000) >> 24;
        bBuf[3] = (dwData & 0x0000000000FF0000) >> 16;
        bBuf[4] = (dwData & 0x000000000000FF00) >> 8;
        bBuf[5] = dwData & 0x00000000000000FF;
        bRes = WriteFrame(bID, wAddr, bBuf, 6, bWriteType);
        break;
    case 7:
        bBuf[0] = (dwData & 0x00FF000000000000) >> 48;
        bBuf[1] = (dwData & 0x0000FF0000000000) >> 40;
        bBuf[2] = (dwData & 0x000000FF00000000) >> 32;
        bBuf[3] = (dwData & 0x00000000FF000000) >> 24;
        bBuf[4] = (dwData & 0x0000000000FF0000) >> 16;
        bBuf[5] = (dwData & 0x000000000000FF00) >> 8;
        bBuf[6] = dwData & 0x00000000000000FF;
        bRes = WriteFrame(bID, wAddr, bBuf, 7, bWriteType);
        break;
    case 8:
        bBuf[0] = (dwData & 0xFF00000000000000) >> 56;
        bBuf[1] = (dwData & 0x00FF000000000000) >> 48;
        bBuf[2] = (dwData & 0x0000FF0000000000) >> 40;
        bBuf[3] = (dwData & 0x000000FF00000000) >> 32;
        bBuf[4] = (dwData & 0x00000000FF000000) >> 24;
        bBuf[5] = (dwData & 0x0000000000FF0000) >> 16;
        bBuf[6] = (dwData & 0x000000000000FF00) >> 8;
        bBuf[7] = dwData & 0x00000000000000FF;
        bRes = WriteFrame(bID, wAddr, bBuf, 8, bWriteType);
        break;
    default:
        break;
    }
    return bRes;
}

//GENERATE COMMAND FRAME
int WriteFrame(BYTE bID, uint16_t wAddr, BYTE * pData, BYTE bLen, BYTE bWriteType) {
    int bPktLen = 0;
    uint8_t * pBuf = pFrame;
    uint16_t wCRC;
    memset(pFrame, 0x7F, sizeof(pFrame));
    *pBuf++ = 0x80 | (bWriteType) | ((bWriteType & 0x10) ? bLen - 0x01 : 0x00); //Only include blen if it is a write; Writes are 0x90, 0xB0, 0xD0
    if (bWriteType == FRMWRT_SGL_R || bWriteType == FRMWRT_SGL_W)
    {
        *pBuf++ = (bID & 0x00FF);
    }
    *pBuf++ = (wAddr & 0xFF00) >> 8;
    *pBuf++ = wAddr & 0x00FF;

    while (bLen--)
        *pBuf++ = *pData++;

    bPktLen = pBuf - pFrame;

    wCRC = CRC16(pFrame, bPktLen);
    *pBuf++ = wCRC & 0x00FF;
    *pBuf++ = (wCRC & 0xFF00) >> 8;
    bPktLen += 2;
    //THIS SEEMS to occasionally drop bytes from the frame. Sometimes is not sending the last frame of the CRC.
    //(Seems to be caused by stack overflow, so take precautions to reduce stack usage in function calls)
    uartSend(bPktLen, pFrame);

    return bPktLen;
}


//GENERATE READ COMMAND FRAME AND THEN WAIT FOR RESPONSE DATA (INTERRUPT MODE FOR SCIRX)
int ReadReg(BYTE bID, uint16_t wAddr, BYTE * pData, BYTE bLen, uint32_t dwTimeOut, BYTE bWriteType) {
    // device address, register start address, byte frame pointer to store data, data length, read type (single, broadcast, stack)
    int crcChk;
    bRes = 0;

    if (bWriteType == FRMWRT_SGL_R) {
        ReadFrameReq(bID, wAddr, bLen, bWriteType, bLen+6);
        memset(pData, 0, sizeof(pData));


    } else if (bWriteType == FRMWRT_STK_R) {
        bRes = ReadFrameReq(bID, wAddr, bLen, bWriteType, (bLen + 6) * (TOTALBOARDS - 1));
        memset(pData, 0, sizeof(pData));

    } else if (bWriteType == FRMWRT_ALL_R) {
        bRes = ReadFrameReq(bID, wAddr, bLen, bWriteType, (bLen + 6) * TOTALBOARDS);
        memset(pData, 0, sizeof(pData));

    } else {
        bRes = 0;
    }

//    //CHECK IF CRC IS CORRECT
    for(crc_i=0; crc_i<bRes; crc_i+=(bLen+6))
    {
        if(CRC16(&pData[crc_i], bLen+6)!=0)
        {
//            printConsole("\n\rBAD CRC=%04X,i=%d,bLen=%d\n\r",(pData[crc_i+bLen+4]<<8|pData[crc_i+bLen+5]),crc_i,bLen);
//            PrintFrame(pData, bLen);
            crcChk = 1;
        }
        else crcChk = 0;
    }
    /*
    crc_i = 0;
    currCRC = pData;
    for(crc_i=0; crc_i<bRes; crc_i+=(bLen+6))
    {
        printConsole("%x",&currCRC);
        if(CRC16(currCRC, bLen+6)!=0)
        {
            printConsole("BAD CRC=%04X,byte=%d\n\r",(currCRC[bLen+4]<<8|currCRC[bLen+5]),crc_i);
            PrintFrame(pData, bLen);
        }
       *currCRC+=(bLen+6);
    }
*/
    return crcChk;
}


int ReadFrameReq(BYTE bID, uint16_t wAddr, BYTE bByteToReturn, BYTE bWriteType, BYTE rxLen) {
    bReturn = bByteToReturn - 1;
    uartRxLen = rxLen;
    idx = 0;
    rxComplete = 0;

    if (bReturn > 127)
        return 0;

    return WriteFrame(bID, wAddr, &bReturn, 1, bWriteType);
}
uint16_t CRC16(BYTE *pBuf, int nLen) {
    wCRC2 = 0xFFFF;
    //printConsole("CRCOUT = \t");
    for (crc16_i = 0; crc16_i < nLen; crc16_i++) {
        //printConsole("%02x ",*pBuf);
        wCRC2 ^= (*pBuf++) & 0x00FF;
        wCRC2 = crc16_table[wCRC2 & 0x00FF] ^ (wCRC2 >> 8);
    }
    //printConsole("\n\r");

    return wCRC2;
}

void uartSend(int length, uint8_t * data){
    uint8_t i;
    for (i = 0; i < length; i++){
        while (!(UCA1IFG & UCTXIFG));
        BQUART_TXBUF = data[i];
    }

}

void uartReceive(BYTE * data, BYTE length){

}

//******************************************************************************
// SPI_B1 Interrupt ************************************************************
//******************************************************************************
#pragma vector=BQUART_VECTOR
/*******************************************************************************
  USCI_A1_ISR ******************************************************************
 *******************************************************************************
* Function: A1 Interrupt Routine
********************************************************************************/
__interrupt void BQUART_ISR(void)
{
    switch(__even_in_range(BQUART_IV, USCI_UART_UCTXCPTIFG))
    {
        case USCI_NONE: break;
        case USCI_UART_UCRXIFG:
            BQUART_IFG &= ~UCRXIFG;
            RXData[idx] = EUSCI_A_UART_receiveData(BQUART);
            idx++;
            if (idx == uartRxLen){
               rxComplete = 1;
            }


        break;
        case USCI_UART_UCTXIFG:  break;
        case USCI_UART_UCSTTIFG: break;
        case USCI_UART_UCTXCPTIFG: break;
        default: break;
    }
}
#endif

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

    您好、Priya、

    您是否可以将提供的代码数量减少到最低限度、从而仍能证明问题?\

    您是否还可以显示设置断点的位置周围的主代码?

    谢谢你

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

    示波器迹线是什么样的? 0x55是否为实数?

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

    我上载了一个仅具有 BQ 初始化序列(唤醒、自动寻址)的缩小项目对于该项目、根本不会触发 UART Rx ISR。 我确实看到示波器上有一个 BQ 响应。  与所有 UART 命令相关的代码(使用 BQ 包装程序)也在这个帖子中。 可能较大的项目具有不同的 UART  接收触发器、我不知道是什么。   我可以看到、OE 错误标志是根据寄存器内容设置的。 UART Rx 和 Tx 缓冲区中有一些字节。

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

    断点在我今天上传的文件(BQInitUartJun142022.zip)中的 BQUartInitFuncs.c 的第122行设置。 如果您有所有需要的信息、请告诉我。

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

    您好、Priya、

    我目前正在阅读您的代码以查找问题。 在我读取时、我想指出、我看不到您在哪里启用 UART RX 中断。 我看到您启用了全局中断、但我找不到您启用 UART RX 中断。 请验证您是否执行了此步骤、因为进入您为接收编写的 ISR 至关重要。

    我在您最近的回复中看到、当您达到设置的断点时 、UCA1MCTLW 寄存器的 UCOE 标志会被置位、同时 UCRXERR 标志也会被置位。 只要在前一个字符被读取之前有一个字符被载入 UCA1RXBUF、这两个标志就会被置1。 有关这些标志的更多信息、请参阅《MSP430FR58xx、MSP430FR59xx 和 MSP430FR6xx 系列用户指南》(链接如下)的第30节、有关这些标志的具体信息、请参阅表30-1。

    MSP430FR58xx、MSP430FR59xx 和 MSP430FR6xx 系列用户指南(修订版 p)(TI.com)

    请尽快验证上述信息、因为我会继续查找您项目中的潜在错误。

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

    void UART_Init(void){
    
        GPIO_setAsPeripheralModuleFunctionInputPin(
              BQUART_TX_PORT,
              BQUART_TX_PIN + BQUART_RX_PIN,
              BQUART_SELECT_FUNCTION
        );
    
        BQUART_initParam param = {0};
    
        param.clockPrescalar = 4,
        param.firstModReg = 0,
        param.secondModReg = 0,
        param.selectClockSource = BQUART_CLOCKSOURCE;
        param.parity =            BQUART_PARITY;
        param.msborLsbFirst =     BQUART_BITORDER;
        param.numberofStopBits =  BQUART_STOPBIT;
        param.uartMode =          BQUART_MODE;
        param.overSampling =      BQUART_OVERSAMPLING;
    
        if(STATUS_FAIL == BQUART_INIT(BQUART, &param))
        {
           return;
        }
    
        BQUART_enable(BQUART);
        BQUART_clearInterrupt(BQUART, BQUART_RX_INT);
        BQUART_enableInterrupt(BQUART, BQUART_RX_INT);
    
    }
    

    我在 UART_Init 函数中启用 UART Rx 中断。 我在自动地址之前调用 UART_Init。 我是否需要在更多地方执行此操作?

    我清理了工作区并导入了 CCS 项目。 BQInit 对象具有与较大 BQ 项目相同的行为。 一旦接收到不正确的字节、UART ISR 就会触发、然后不再触发。

    供参考--我上传了 BQInit 项目,最近进行了细微编辑。 我保留了相同的项目名称。 查看此项目时、请获取最新下载、谢谢。

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

    查看您的代码、您似乎在准备就绪之前不需要任何数据。 但似乎没有发生这种情况。

    我看到的是:1)初始化 UART 并启用接收中断。

    2) 2)设置 idx = 0;

    3) 3)发送命令。

    4)预期数据。

    问题是您的代码将在发送命令之前处理接收到的数据。 它甚至不会检查以确保索引不会在数组末尾运行。 当然、它会设置一个标志、但不会禁用 RXIE、并且会继续存储数据和递增 idx。 写下超出范围的任何内容。

    即使没有预期的数据、您也必须防御性地编写代码。

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

    我对 UART 发送和 ISR 进行了以下更改。 接收数据没有变化。

    void uartSend(int length, uint8_t * data){
        uint8_t i;
    
        idx = 0;
        rxComplete = 0;
        BQUART_IE |= UCRXIE;
    
        for (i = 0; i < length; i++){
            while (!(UCA1IFG & UCTXIFG));
            BQUART_TXBUF = data[i];
        }
    }
    
    
    #pragma vector=BQUART_VECTOR
    /*******************************************************************************
      USCI_A1_ISR ******************************************************************
     *******************************************************************************
    * Function: A1 Interrupt Routine
    ********************************************************************************/
    __interrupt void BQUART_ISR(void)
    {
        switch(__even_in_range(BQUART_IV, USCI_UART_UCTXCPTIFG))
        {
            case USCI_NONE: break;
            case USCI_UART_UCRXIFG:
                BQUART_IFG &= ~UCRXIFG;
                RXData[idx] = BQUART_RXBUF;
                if (idx < uartRxLen)
                   idx++;
                if (idx == uartRxLen){
                   rxComplete = 1;
                   BQUART_IE &= ~UCRXIE;
                }
    
    
            break;
            case USCI_UART_UCTXIFG:  break;
            case USCI_UART_UCSTTIFG: break;
            case USCI_UART_UCTXCPTIFG: break;
            default: break;
        }
    }

    如果我在 uartSend 的末尾放置一个断点、我可以在示波器上看到 BQ 接收活动、尽管我不知道具体包含哪些字节。 ISR 的时序不捕获此接收数据。 我需要更多有关在这里执行什么操作的指针。

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

    您提到了断点。 您的"正常"测试案例是什么? 您是否让它在没有断点的情况下运行?

    我问、如果您在 uartSend 末尾设置了断点、您将(对于该测试运行)丢失所有(BQ-side) Tx 数据、因为您在断点时 MSP 侧 UART (SMCLK)会停止。

    (也许这很明显、但有人必须问。)

    未经请求:不要在 ISR 中明确清除 RXIFG --它已经通过读取 IV 被清除,并且它将通过读取 RXBUF 被清除(再次)。 症状是每对字节中丢失一个字节、这不是您的症状(尚未)。

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

    我从 UART ISR 中删除了清除 RXIFG。 测试运行中的唯一断点为  

    //可选:读取寄存器地址0x2001并验证值是否为0x14
    ReadReg (0、0x2001、autodr_Response_FRAME、1、0、 FRMWRT_SGL_R);

    这有助于更好地捕获 BQ 接收。 看到一个 BQ 接收活动、之后无。

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

    您好、Priya、

    对于 BQ79600、您能否捕获 Salae /逻辑分析仪日志并提供?  这将有助于我们从 BQ79600 Rx 侧进行调试。   

    我们对以下方面感兴趣....

    1. 首先、我们需要验证 BQ79600是否已唤醒(WAKE ping 正在工作)并且 BQ79600已通电。
    2. 用于查看有效读取请求的示波器快照从 MCU 发送到 BQ79600 (TX 线)。
    3. 验证中断(BQUART_ISR)是否 已正确配置为接收 UART 数据。(MSP 小组应能够验证配置)。
    4. 清除 RX 线上接收的数据的范围截屏。

    谢谢、

    Tom

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

    当我读取此示波器跟踪时、MCU 会重复发送(黄线)、但仅获得对第一个请求的响应(紫线)。

    3) 3)配置看起来正常。 (Priya、我假设您在另一个线程中使用相同的#-defines (?)。)

    [编辑:3+)我不知道时钟是如何设置的、但示波器跟踪(人眼准确度)指示1usec 位时间-> 1Mbps。]

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

    Priya、

    在进一步回顾之后、我为您准备了两个注释:

    1) 1)这可能很明显、但要确保、 在 UART_Init 函数中、当 BQUART_Init 函数执行时、如果失败、该函数返回、并且主代码执行方式与 BQUART_Init 函数传递时相同。 您已经说过 RX ISR 执行一次、因此该函数似乎正在传递、执行中断使能、但最好添加断言或其他检查以确保不会发生故障、然后您的器件会尝试通过 UART 进行通信。 除此之外、我在您的 UART_Init 函数中没有发现任何不正确的内容。

    2) 2)在 CONFIG_PINS_BQUART 函数中、我看到您将引脚2.5和2.6都置于输出模式。 这可能是一个问题、因为将 GPIO 引脚用于其 UART 功能的方法通常不涉及更改与这些引脚关联的 PxOUT 位。 引脚2.5和2.6在使用它们的次级模块功能时分别为 UCA1TXD 和 UCA1RXD。 要将这些引脚置于这些辅助模块功能中、必须设置 P6SEL1的位5和6、并清除 P6SEL0的位5和位6。 如需参考、您可能需要访问 TI 的 Resource Explorer、并按照路径 MSP430Ware -> Devices -> MSP430FR5xx_6xx -> MSP430FR5994 -> Peripheral Examples -> Register Level、然后选择 MSP430FR599x_euscia0_UART_01.c 或  MSP430FR599x_eusa02_uart

    在对 P2.5和 P2.5设置进行这些调整时、请告知我们是否有任何改进。  

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

    我犹豫不同意迪伦、但:

    1) EUSCI_A_UART_INIT (截至3.80.07.00)从未失败。 我想如果发生碰撞或其他事情仍然是一个好主意、但它与此线程无关。

    2) 2)要获得第二功能、您需要设置 P2SEL1位并清除 P2SEL0位。 [参考数据表(SLASE54C)表6-25]。  GPIO_setPeripheralModuleFunctionInputPin 可正确执行此操作。 如表6-25注释(2)所示、GPIO 方向设置与 EUSCI 无关。

    简而言之:您无需更改此处的任何内容。

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

    e2e.ti.com/.../BQWake.pdf

    连接的是 BQ 唤醒脉冲和绿灯; 读取寄存器(0、0x2001、autodr_Response_FRAME、1、0、 FRMWRT_SGL_R);

    我已整合了这里所有关于 UART ISR 的响应的反馈。 我假设它已正确设置。 我添加了 BQ 传输事务范围图。

    接下来、我将收集逻辑分析仪数据。

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

    e2e.ti.com/.../BQWake.pdf

    连接的是 BQ 唤醒脉冲和绿灯; 读取寄存器(0、0x2001、autodr_Response_FRAME、1、0、 FRMWRT_SGL_R);

    我已整合了这里所有关于 UART ISR 的响应的反馈。 我假设它已正确设置。 我添加了 BQ 传输事务范围图。

    接下来、我将收集逻辑分析仪数据。

    e2e.ti.com/.../BQRX-decoder_2D002D00_220615_2D00_132458.txt

    我能够收集 BQ TX 数据、并且所有 UART 发送消息都是正确的。 但是、BQ TX 不再在示波器上持续显示、我无法使用逻辑分析仪进行捕获。  

    我现在已正确设置触发器。 BQ Tx 实际上是正确的响应。 由于某种原因、它未到达 MSP430 UART。 我只能将 UART TX 保存到文本文件中。 我截取了 UART Rx 的屏幕截图。  

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

    e2e.ti.com/.../BQWake.pdf

    连接的是 BQ 唤醒脉冲和绿灯; 读取寄存器(0、0x2001、autodr_Response_FRAME、1、0、 FRMWRT_SGL_R);

    我已整合了这里所有关于 UART ISR 的响应的反馈。 我假设它已正确设置。 我添加了 BQ 传输事务范围图。

    接下来、我将收集逻辑分析仪数据。

    e2e.ti.com/.../BQRX-decoder_2D002D00_220615_2D00_132458.txt

    我能够收集 BQ TX 数据、并且所有 UART 发送消息都是正确的。 但是、BQ TX 不再在示波器上持续显示、我无法使用逻辑分析仪进行捕获。  

    我现在已正确设置触发器。 BQ Tx 实际上是正确的响应。 由于某种原因、它未到达 MSP430 UART。 我只能将 UART TX 保存到文本文件中。 我截取了 UART Rx 的屏幕截图。 我注意到、为了不断获得 BQ 响应字节、我需要这样做  

    当我停止在 UART ISR 中放置一个断点来跟踪每个传入字节时、RXData 的内容与逻辑分析仪上看到的 BQ 响应相匹配。 当我使用 TX_HOLDOFF BQ 寄存器的默认值时、我发现我会得到一致的接收触发器。 问题似乎已解决。 如果我在开发过程中遇到困难、我将开始新的线程。 非常感谢。