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.

[参考译文] LP-MSP430FR2476:SPI 从器件 MAX17841

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/1049043/lp-msp430fr2476-spi-slave-max17841

器件型号:LP-MSP430FR2476

使用 MSP430 SPI 和连接到一个 MAX17853的 MAX17841 (表10)、我能够获得对菊花链初始化序列的正确响应。 唤醒和 hello 所有事务在 MISO 线路上接收正确的响应,我得到返回为0x001的器件地址。 这与 Maxim 评估 GUI 相同。 这些 MSP430 SPI 响应已在示波器上捕获。

现在、我需要使 MAX17841的表11正常工作。 我发送了事务1、2和3 (WriteAll_transactions[0]= 0xc0;  WriteAll_transactions[1]。Data[0]= 0xb0;WriteAll_transactions[2]。Data[0]= 0x01;)、但我没有得到0x12的接收。 相反、我得到0x11 (有时为0x21)、这意味着存在 RX_Overflow_Status 或存在未读数据。 我不明白这是为什么。 在表10中的事务中、命令0xC0和0xB0工作正常。 使用评估 GUI、表11工作正常。 因此、MSP430握手会丢失一些东西。 我感谢任何指示。 我已将当前文件附加到此帖子。

我尝试从  WriteAll_transactions [0]中包含和删除 PEC 字节、但从器件响应没有任何差异。

#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <string.h>

#include <driverlib.h>
#include <intrinsics.h>
#include <msp430.h> 
#include "clock~.h"                 // Clock configurations

#define UART_TRANSMIT_BUFFER_LENGTH  76
#define UART_TXD_PORT        GPIO_PORT_P1
#define UART_TXD_PIN         GPIO_PIN4
#define UART_RXD_PORT        GPIO_PORT_P1
#define UART_RXD_PIN         GPIO_PIN5
#define UART_SELECT_FUNCTION GPIO_PRIMARY_MODULE_FUNCTION

#define SPI_MOSI_PORT       GPIO_PORT_P2
#define SPI_MOSI_PIN        GPIO_PIN6
#define SPI_MISO_PORT       GPIO_PORT_P2
#define SPI_MISO_PIN        GPIO_PIN5
#define SPI_CLK_PORT        GPIO_PORT_P2
#define SPI_CLK_PIN         GPIO_PIN4
#define SPI_SELECT_FUNCTION GPIO_PRIMARY_MODULE_FUNCTION



typedef struct {
    uint8_t    Len;
    uint8_t    Data[10];
} spi_MaximTrans_t;

static uint8_t RXData[8] = {0};           //SPI receive byte
/**
 *  Initialize system clocks
 */
static void init_clock(void) {
    // Configure one FRAM waitstate as required by the device datasheet for MCLK
    // operation beyond 8MHz _before_ configuring the clock system.
    FRAMCtl_configureWaitStateControl(FRAMCTL_ACCESS_TIME_CYCLES_1);

    //Set DCO FLL reference = REFO
    CS_initClockSignal(CS_FLLREF, CS_REFOCLK_SELECT,   CS_CLOCK_DIVIDER_1);
    //Set ACLK = REFO
    CS_initClockSignal(CS_ACLK,   CS_REFOCLK_SELECT,   CS_CLOCK_DIVIDER_1);

    CS_initFLLParam param = {0};
    //Set Ratio/Desired MCLK Frequency, initialize DCO, save trim values
    CS_initFLLCalculateTrim(CS_MCLK_DESIRED_FREQUENCY_IN_KHZ, CS_MCLK_FLLREF_RATIO, &param);

    //Set MCLK = REFO
    CS_initClockSignal(CS_MCLK,   CS_REFOCLK_SELECT,   CS_CLOCK_DIVIDER_1);
    //Set SMCLK = DCO
    CS_initClockSignal(CS_SMCLK,  CS_DCOCLKDIV_SELECT, CS_CLOCK_DIVIDER_1);

    //Clear all OSC fault flag
    CS_clearAllOscFlagsWithTimeout(1000);
}

/**
 *  Initialize all of the IO pins per their configuration
 */
static void init_gpio(void) {
    // Set all GPIO pins to output low to prevent floating input and reduce power consumption
    GPIO_setOutputLowOnPin(GPIO_PORT_P1, GPIO_PIN_ALL8);
    GPIO_setOutputLowOnPin(GPIO_PORT_P2, GPIO_PIN_ALL8);
    GPIO_setOutputLowOnPin(GPIO_PORT_P3, GPIO_PIN_ALL8);
    GPIO_setOutputLowOnPin(GPIO_PORT_P4, GPIO_PIN_ALL8);
    GPIO_setOutputLowOnPin(GPIO_PORT_P5, GPIO_PIN_ALL8);
    GPIO_setOutputLowOnPin(GPIO_PORT_P6, GPIO_PIN0 | GPIO_PIN1 | GPIO_PIN2);

    GPIO_setAsOutputPin(   GPIO_PORT_P1, GPIO_PIN_ALL8);
    GPIO_setAsOutputPin(   GPIO_PORT_P2, GPIO_PIN_ALL8);
    GPIO_setAsOutputPin(   GPIO_PORT_P3, GPIO_PIN_ALL8);
    GPIO_setAsOutputPin(   GPIO_PORT_P4, GPIO_PIN_ALL8);
    GPIO_setAsOutputPin(   GPIO_PORT_P5, GPIO_PIN_ALL8);
    GPIO_setAsOutputPin(   GPIO_PORT_P6, GPIO_PIN0 | GPIO_PIN1 | GPIO_PIN2);

}

/*
 * Initialize the SPI peripheral on EUSCI A1
 */
void init_spi_peripheral()
{

        GPIO_setAsPeripheralModuleFunctionOutputPin(SPI_MOSI_PORT, SPI_MOSI_PIN, SPI_SELECT_FUNCTION);
        GPIO_setAsPeripheralModuleFunctionInputPin(SPI_MISO_PORT, SPI_MISO_PIN, SPI_SELECT_FUNCTION);
        GPIO_setAsPeripheralModuleFunctionOutputPin(SPI_CLK_PORT, SPI_CLK_PIN, SPI_SELECT_FUNCTION);


    //Initialize Master
        EUSCI_A_SPI_initMasterParam param = {0};
        param.selectClockSource = EUSCI_A_SPI_CLOCKSOURCE_SMCLK;
        param.clockSourceFrequency = CS_getSMCLK();
        param.desiredSpiClock = 1000000;
        param.msbFirst = UCMSB;
        param.clockPhase = EUSCI_A_SPI_PHASE_DATA_CAPTURED_ONFIRST_CHANGED_ON_NEXT;
        param.clockPolarity = EUSCI_A_SPI_CLOCKPOLARITY_INACTIVITY_LOW;
        param.spiMode = EUSCI_A_SPI_3PIN;
        EUSCI_A_SPI_initMaster(EUSCI_A1_BASE, &param);

        EUSCI_A_SPI_enable(EUSCI_A1_BASE);

}

void init_wd_bms_uart(void)
{
    // Configure UART @38400 baud (EUSCI/16MHz)
    // software-dl.ti.com/.../index.html

    // Configure UCA0TXD and UCA0RXD
     GPIO_setAsPeripheralModuleFunctionOutputPin(UART_TXD_PORT, UART_TXD_PIN, UART_SELECT_FUNCTION);
     GPIO_setAsPeripheralModuleFunctionInputPin(UART_RXD_PORT, UART_RXD_PIN, UART_SELECT_FUNCTION);

     EUSCI_A_UART_initParam param = {
        .clockPrescalar = 26, .firstModReg = 0, .secondModReg = 214,
        .selectClockSource = EUSCI_A_UART_CLOCKSOURCE_SMCLK,
        .parity =            EUSCI_A_UART_NO_PARITY,
        .msborLsbFirst =     EUSCI_A_UART_LSB_FIRST,
        .numberofStopBits =  EUSCI_A_UART_ONE_STOP_BIT,
        .uartMode =          EUSCI_A_UART_MODE,
        .overSampling =      EUSCI_A_UART_OVERSAMPLING_BAUDRATE_GENERATION
    };


    if(STATUS_FAIL == EUSCI_A_UART_init(EUSCI_A0_BASE, &param))
    {
        return;
    }

    EUSCI_A_UART_enable(EUSCI_A0_BASE);
}

/**
 * UART_Transmit_String()
 *  Prints a null terminated string on the UART
 * @param str null terminated string
  */
void UART_Transmit_String(const char *str)
{
    int i = 0;

    for(i = 0; i < UART_TRANSMIT_BUFFER_LENGTH; i++)
    {
        if (str[i] != '\0')
        {
            while (EUSCI_A_UART_queryStatusFlags(EUSCI_A0_BASE, EUSCI_A_UART_BUSY));
            EUSCI_A_UART_transmitData(EUSCI_A0_BASE, str[i]);
        }
         else
         {
             break;
         }
    }
}

void SetUpDCInitTransactions(spi_MaximTrans_t DCInit_transactions[]){
    //Enable keep alive mode
    DCInit_transactions[0].Len = 2;
    DCInit_transactions[0].Data[0] = 0x10;
    DCInit_transactions[0].Data[1] = 0x5;

    //Read Back Transaction byte
    DCInit_transactions[1].Len = 2;
    DCInit_transactions[1].Data[0] = 0x11;
    DCInit_transactions[1].Data[1] = 0x0;

    //Enable Rx Interrupt flags
    DCInit_transactions[2].Len = 2;
    DCInit_transactions[2].Data[0] = 0x4;
    DCInit_transactions[2].Data[1] = 0x89;
    //No Receive

    //Read Back Transaction byte
    DCInit_transactions[3].Len = 2;
    DCInit_transactions[3].Data[0] = 0x5;
    DCInit_transactions[3].Data[1] = 0x0;

    //Clear receive buffer
    DCInit_transactions[4].Len = 1;
    DCInit_transactions[4].Data[0] = 0xe0;
    //No Receive

    //Wakeup UART slave devices
    DCInit_transactions[5].Len = 2;
    DCInit_transactions[5].Data[0] = 0x0e;
    DCInit_transactions[5].Data[1] = 0x30;
    //No Receive

    //Read Back Transaction byte
    DCInit_transactions[6].Len = 2;
    DCInit_transactions[6].Data[0] = 0x0f;
    DCInit_transactions[6].Data[1] = 0x0;
    //No Receive
    //2ms delay for each slave to wake up

    //Wait for all UART slave devices to wake up
    DCInit_transactions[7].Len = 2;
    DCInit_transactions[7].Data[0] = 0x01;
    DCInit_transactions[7].Data[1] = 0x0;
    //Receive of 0x21 expected

    //End of UART slave device wake-up period
    DCInit_transactions[8].Len = 2;
    DCInit_transactions[8].Data[0] = 0x0e;
    DCInit_transactions[8].Data[1] = 0x10;

    //Read Back Transaction byte
    DCInit_transactions[9].Len = 2;
    DCInit_transactions[9].Data[0] = 0x0f;
    DCInit_transactions[9].Data[1] = 0x0;
    //No Receive
    //2ms delay for each slave to report null message

    //Wait for null message to be received
    DCInit_transactions[10].Len = 2;
    DCInit_transactions[10].Data[0] = 0x01;
    DCInit_transactions[10].Data[1] = 0x0;
    //Receive 0x10 or 0x12

    //Clear transmit buffer
    DCInit_transactions[11].Len = 1;
    DCInit_transactions[11].Data[0] = 0x20;
    //No Receive

    //Clear receive buffer
    DCInit_transactions[12].Len = 1;
    DCInit_transactions[12].Data[0] = 0xe0;
    //No Receive

    //Load the HELLOALL command sequence into the load queue
    DCInit_transactions[13].Len = 5;
    DCInit_transactions[13].Data[0] = 0xc0;
    DCInit_transactions[13].Data[1] = 0x03;    //message length
    DCInit_transactions[13].Data[2] = 0x57;    //HELLOALL command byte
    DCInit_transactions[13].Data[3] = 0x0;     //Register address (0x00)
    DCInit_transactions[13].Data[4] = 0x0;     //Initialization address of HELLOALL

    //Verify contents of the load queue
    DCInit_transactions[14].Len = 5;
    DCInit_transactions[14].Data[0] = 0xc1;
    DCInit_transactions[14].Data[1] = 0x0;
    DCInit_transactions[14].Data[2] = 0x0;
    DCInit_transactions[14].Data[3] = 0x0;
    DCInit_transactions[14].Data[4] = 0x0;

    //Transmit HELLOALL sequence
    DCInit_transactions[15].Len = 1;
    DCInit_transactions[15].Data[0] = 0xb0;
    //No Receive
    //2ms delay for each slave to respond

    //Poll RX_Stop_Status Bit
    DCInit_transactions[16].Len = 2;
    DCInit_transactions[16].Data[0] = 0x01;
    DCInit_transactions[16].Data[1] = 0x0;
    //Receive 0x12

    //Service receive buffer. Read the HELLOALL message that propagated through the daisy chain
    //and was returned back to the ASCI.The host should verify the device count
    DCInit_transactions[17].Len = 4;
    DCInit_transactions[17].Data[0] = 0x93;
    DCInit_transactions[17].Data[1] = 0x0;
    DCInit_transactions[17].Data[2] = 0x0;
    DCInit_transactions[17].Data[3] = 0x0;

    //Check for receive buffer errors
    DCInit_transactions[18].Len = 0x09;
    DCInit_transactions[18].Data[0] = 0x0;
}

SPI_Send(spi_MaximTrans_t Transmit[], uint8_t index){
    uint8_t SPI_TX_index = 0;            //byte count in transaction

    GPIO_setOutputLowOnPin(GPIO_PORT_P3, GPIO_PIN1);        //Maxim chip select low
    __delay_cycles(1000);                     //idle time between CS change
    for(SPI_TX_index = 0; SPI_TX_index < Transmit[index].Len; SPI_TX_index++){
       while(!(UCA1IFG & UCTXIFG));
       UCA1TXBUF = Transmit[index].Data[SPI_TX_index];
       while (!(UCA1IFG & UCRXIFG));
       RXData[SPI_TX_index] = UCA1RXBUF;
    }
    return;
}

/**
 * main.c
 */
int main(void)
{
    static uint8_t TXData = 0;           //transaction count

    static spi_MaximTrans_t DCInit_transactions[19];
    static spi_MaximTrans_t WriteAll_transactions[3];
    static spi_MaximTrans_t ReadAll_transactions[3];



    static uint8_t noReceive = 0;
    static uint8_t noInc = 0;

    char buf[76];

    WDTCTL = WDTPW | WDTHOLD;   // stop watchdog timer


    init_clock();
    init_gpio();                                    // Set up IO pins

    GPIO_setOutputHighOnPin(GPIO_PORT_P3, GPIO_PIN1);       //SPI slave chip select


    // Set P1.0 to output direction
    GPIO_setAsOutputPin (GPIO_PORT_P1, GPIO_PIN0);
    GPIO_setAsInputPinWithPullUpResistor (GPIO_PORT_P4, GPIO_PIN2);
    GPIO_enableInterrupt (GPIO_PORT_P4, GPIO_PIN2);
    GPIO_selectInterruptEdge (GPIO_PORT_P4, GPIO_PIN2, GPIO_HIGH_TO_LOW_TRANSITION);
    GPIO_clearInterrupt (GPIO_PORT_P4, GPIO_PIN2);

    GPIO_setAsOutputPin (GPIO_PORT_P6, GPIO_PIN2);

    PMM_unlockLPM5();
    __enable_interrupt();

    SetUpDCInitTransactions(DCInit_transactions);
    TXData = 0x0;                             // Holds transaction number


    // Setup peripheral(s) now that gpio and clocks are setup
    init_spi_peripheral();                      // Init Maxim spi peripheral
    init_wd_bms_uart();

    GPIO_setOutputHighOnPin (GPIO_PORT_P6, GPIO_PIN2);              //SHDNL held high for 4ms to ensure all slaves are powered on
    __delay_cycles(32000);


    while (TXData < 19){
        noInc = 0;


        SPI_Send(DCInit_transactions, TXData);

        if ((TXData == 6) || (TXData == 9) || (TXData == 15))
            __delay_cycles(32000);    //wait for slaves to wake up

        if (TXData == 7){
            if (RXData[DCInit_transactions[7].Len-1] == 0x21){
               TXData++;
               noReceive = 0;
               noInc = 1;
               sprintf(buf, "Wake Up status 0x21 received\n\r");
               UART_Transmit_String(buf);
            }
            if (RXData[DCInit_transactions[7].Len-1] != 0x21){
               TXData = 7;
               noReceive++;
               if (noReceive == 3){
                   sprintf(buf, "Wakeup Error\n\r");      //Need to set a Fault
                   UART_Transmit_String(buf);
               }
            }
         }
         if (TXData == 10){
            if ((RXData[DCInit_transactions[10].Len-1] == 0x10) || (RXData[DCInit_transactions[10].Len-1] == 0x12)){
               TXData++;
               noReceive = 0;
               noInc = 1;
               sprintf(buf, "Wakeup Successful\n\r");
               UART_Transmit_String(buf);
            }
            else{
               TXData = 10;
               noReceive++;
               if (noReceive == 3){
                  sprintf(buf, "Wakeup Error: Preamble not received\n\r");      //Need to set a Fault
                  UART_Transmit_String(buf);
               }
            }
         }
         if (TXData == 16){
            if ((RXData[DCInit_transactions[16].Len-1] == 0x12)){
               TXData++;
               noReceive = 0;
               noInc = 1;
               sprintf(buf, "HELLOALL successful\n\r");
               UART_Transmit_String(buf);

            }
            else{
               TXData = 16;
               noReceive++;
               if (noReceive == 3){
                  sprintf(buf, "Wakeup Error: Preamble not received\n\r");      //Need to set a Fault
                  UART_Transmit_String(buf);
               }
            }
         }
         if ((noReceive == 0) && !noInc){
             TXData++;
         }

         if (TXData < 19){
             GPIO_setOutputHighOnPin(GPIO_PORT_P3, GPIO_PIN1);        //Maxim chip select high
             __delay_cycles(1000);                                 //idle time between CS change
         }

     }

    GPIO_setOutputHighOnPin(GPIO_PORT_P3, GPIO_PIN1);        //Maxim chip select high
         __delay_cycles(1000);                                 //idle time between CS change


    //Load WRITEALL sequence into the load queue
     WriteAll_transactions[0].Len = 7;
     WriteAll_transactions[0].Data[0] = 0xc0;      //WR_LD_Q_SPI command byte
     WriteAll_transactions[0].Data[1] = 5;
     WriteAll_transactions[0].Data[2] = 0x02;      //WRITEALL
     WriteAll_transactions[0].Data[3] = 0x12;      //ADDRESS
     WriteAll_transactions[0].Data[4] = 0xb1;
     WriteAll_transactions[0].Data[5] = 0xb2;
     WriteAll_transactions[0].Data[6] = 0Xc4;      //PEC byte
 //    WriteAll_transactions[0].Data[7] = 0x0;       //alive counter byte
     SPI_Send(WriteAll_transactions, 0);
     GPIO_setOutputHighOnPin(GPIO_PORT_P3, GPIO_PIN1);        //Maxim chip select high
     __delay_cycles(1000);                                 //idle time between CS change


     //Start transmitting the WRITEALL sequence from the transmit queue
     WriteAll_transactions[1].Len = 1;
     WriteAll_transactions[1].Data[0] = 0xb0;   //WR_NXT_LD_Q_SPI command byte
     SPI_Send(WriteAll_transactions, 1);
     __delay_cycles(32000);

     GPIO_setOutputHighOnPin(GPIO_PORT_P3, GPIO_PIN1);        //Maxim chip select high
     __delay_cycles(1000);                                 //idle time between CS change


     WriteAll_transactions[2].Len = 2;
     WriteAll_transactions[2].Data[0] = 0x01;   //Read RX_Status register
     WriteAll_transactions[2].Data[1] = 0x0;

     noReceive = 1;
     while ((noReceive > 0) && (noReceive < 3)){
        SPI_Send(WriteAll_transactions, 2);
        if (RXData[WriteAll_transactions[2].Len-1] == 0x12){
           sprintf(buf, "WRITEALL acknowledged\n\r");
           UART_Transmit_String(buf);
           noReceive = 0;
        }
        else{
           noReceive++;
           GPIO_setOutputHighOnPin(GPIO_PORT_P3, GPIO_PIN1);     //Maxim chip select high
                __delay_cycles(1000);                                 //idle time between CS change
           if (noReceive == 3){
              sprintf(buf, "Writeall Error: not acknowledged\n\r");      //Need to set a Fault
              UART_Transmit_String(buf);
           }
        }
     }
     GPIO_setOutputHighOnPin(GPIO_PORT_P3, GPIO_PIN1);     //Maxim chip select high
     __delay_cycles(1000);                                 //idle time between CS change

     ReadAll_transactions[0].Len = 7;
     ReadAll_transactions[0].Data[0] = 0x93;
     ReadAll_transactions[0].Data[1] = 0x0;
     ReadAll_transactions[0].Data[2] = 0x0;
     ReadAll_transactions[0].Data[3] = 0x0;
     ReadAll_transactions[0].Data[4] = 0x0;
     ReadAll_transactions[0].Data[5] = 0x0;
     ReadAll_transactions[0].Data[6] = 0x0;
     SPI_Send(ReadAll_transactions, 0);
     GPIO_setOutputHighOnPin(GPIO_PORT_P3, GPIO_PIN1);     //Maxim chip select high
     __delay_cycles(1000);                                 //idle time between CS change


     ReadAll_transactions[1].Len = 2;
     ReadAll_transactions[1].Data[0] = 0x09;
     ReadAll_transactions[1].Data[1] = 0x0;
     SPI_Send(ReadAll_transactions, 0);
     GPIO_setOutputHighOnPin(GPIO_PORT_P3, GPIO_PIN1);     //Maxim chip select high
     __delay_cycles(1000);                                 //idle time between CS change

}


//******************************************************************************
//
//This is the PORT2_VECTOR interrupt vector service routine
//
//******************************************************************************
#if defined(__TI_COMPILER_VERSION__) || defined(__IAR_SYSTEMS_ICC__)
#pragma vector=PORT4_VECTOR
__interrupt
#elif defined(__GNUC__)
__attribute__((interrupt(PORT2_VECTOR)))
#endif
void P4_ISR (void)
{

    GPIO_clearInterrupt (GPIO_PORT_P4, GPIO_PIN2);
    // Toggle P1.0 output
    GPIO_toggleOutputOnPin (GPIO_PORT_P1, GPIO_PIN0);
    GPIO_setOutputHighOnPin(GPIO_PORT_P3, GPIO_PIN1);

}

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

    正如我在阅读数据表(修订版3)第26页、Rx 状态寄存器中的0x11为{IDLE+EMPTY}、0x21为{BUSY+EMPTY}、因此听起来好像它在做一些事情。

    看起来您只尝试读取 Rx 状态寄存器两次。 “两次”是从某个地方来的吗?

    我问、因为我看到 UART (连接到 MAX17841从设备)以38.4kbps 或约3840字节/秒的速率运行 发送4个字节需要(最小值)略大于1ms、如果它们被按顺序发送到两个从器件、则需要2+ms。 发送读取状态(2个字节两次)需要2x16us、外加延迟(125us?) 在第一个/CS 之后、或者可能是160usec 之后、相当短于2ms。 (是的、这会花费更长的时间、但仍然是一个很大的差异。)

    如果您将超时时间从3增加到100、会发生什么情况?

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

    表11介绍了 UART 接口、而不是 SPI。 表9是有关 SPI 事务的信息。

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

    MSP430 SPI 至 max17841 SPI。  

    将 Max17841 UART 更改为 max17853 UART 菊花链、目前我只有一个 max17853。  

    最大17853的所有命令都来自 MSP430。

    我将很快尝试添加的传输。

    谢谢  

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

    MAX17841 UART 的默认波特率为2Mbps。 MAX17853自动检测波特率并可处理2Mbps。 轮询状态100次没有什么不同。

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

    我在这里超出了我的能力范围、但有些想法:

    1) 1)表10的最后一步规定了读取 RX_Interrupt_Flags 寄存器(在读取数据之后)并检查错误。 这有点不寻常(通常是在之前完成的)、但 RX_Status 寄存器中的第7位相应位表明它仅在从 Rx 缓冲区中读取字节时置1。 无论如何、您正在读取该寄存器、但不会对其进行检查;我想可能存在剩余状态。

    2) 2)您可能会尝试首先清除 Tx 和 Rx 缓冲器[参考表10事务8/9]。 GUI 软件包不包含源代码、因此很难确切地确定它在做什么。

    3) 3)您正在忽略活动计数器字节;我不知道这是否重要、但我建议您现在"遵循配方"。

    4) 4)我返回到您之前的帖子、该帖子描述了布线、听起来好像您是在将 MAX17853上的 Vaa 连接到 Launchpad 3.3V、我认为这是可以的、但我不太清楚您是如何连接 DCIN (在 MAX17853上)的。 在该数据表中、似乎需要在 DCIN 上提供9V (最小值)的电压。

    5) 5)我不太清楚12B1B2序列的用途是什么、因为 MAX17853上的寄存器0x12看起来是只读的。 [参考数据表(19-100355;修订版5)第207页]

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

    感谢你的答复。 我有一个专用于 MAX17853的18V 电源适配器。 LP 的3.3V 电源为 MAX17841供电。 我在示波器上使用 SPI 解码功能、并保存 GUI 命令的历史记录。 我还没有发现任何发现。  

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

    您好、Priya、

    您是否能够排除发送到每个器件和从每个器件发送的内容?

    您提到了这些错误命令、我想知道您是否可以检查 RX 寄存器的缓冲区、看看它在未被正确清除时会填充什么。 听起来可能存在潜在的计时问题、因为您没有收到相同的代码、但它是0x11或0x21。 我想 Bruce 早些时候提到了它们的具体含义。 我不熟悉 MAX 芯片、因此我不能对其进行过多评论、但我们可以检查 MSP 以查看其是否获得了正确的命令。  

    此致、

    Luke

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

    我已附上表11事务中的3张示波器图片(UART 写入和读取)。 首先将消息写入加载队列(字节 xC0、x06、x02、x12、XB1、 XB2、xc4、x00)。 第二张图片显示了读取状态的轮询。 绿色是以0x11进行响应的 MISO。 第三张图片是验证写入空的加载队列。 为什么没有向加载队列写入任何内容? 在初始化期间(WAKEUP、Helloall、表10)、同一条消息成功。 如果需要、我可以在另一个帖子中发布已成功的初始化图片。

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

    您提到您已保存了 GUI 事务的跟踪。 这些(尤其是第一个)与它们相比如何?

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

      我已附加了写入加载队列(0xC0)和在传输 hello all 命令(0xb0后跟0x93)后读取的工作版本。 它们看起来与我为 UART 写入所做的相同。 在 UART 写入之前、我甚至添加了用于清除发送/接收缓冲区的事务(重复表10中的事务8和9)、并在0xC0之后添加了0xC1 (用于验证写入的读取命令)。 传输完0xb0后,0x93仍显示空队列。 可能有一些隐藏命令未记录在我需要查找的 Maxim 数据表中。

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

    e2e.ti.com/.../scopeHistoryInit.xlsx

    附件是使用带有 SPI 解码的 Scope History 函数从 Maxim GUI 捕获的事务序列。 我按原样实现了该序列。 结果仍然相同。 Maxim 芯片对表10中的菊花链初始化序列按预期进行响应。 但 UART 写入在同一时间点停止。 我写入加载队列并传输序列。 然后我尝试读取接收缓冲区、但它是空的、没有 writeall 消息。 GUI 能够通过 UART OK 进行写入和读取、但使用 MSP 430时不会发生这种情况。 我需要对原因有一些了解。 谢谢

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

    (我假设我应该按帧编号顺序读取它、即从下到上?)

    值得注意的是,它不存在(例如)表11事务3中建议的状态轮询(0x01)--它似乎是假设响应在它看起来的时间到达。 ( 由于帧9中的所有中断(0x04)都已禁用、因此它将无法使用/INT 线。) 我想知道 GUI 是依赖延迟还是其他东西?

    当您复制此序列时(我假设您也排除了状态轮询)、您从0x93 (帧13、16、19、22)得到了什么结果?

    --------

    在某些时候,你必须把它转到 Maxim,因为 我没有注意到任何 max17841向导在这里发言。  发送与 GUI 相同的序列但获得不同的结果似乎是一个合理的情况。

    最后我看了 ADI 没有将 Maxim 引入论坛(EngineerZone)、但 Maxim 主页上有一个技术支持链接。

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

    我仔细看一下 GUI 事务实现、对于使用 MSP430对0x93的响应、我输入了正确的事务长度。  我已成功捕获 MISO 响应的示波器跟踪! 是的、已联系 maxim 支持、这是我目前为止遇到的问题。 感谢您的帮助、谢谢

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

    让我们知道结果如何。