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.

[参考译文] MSP430FR2155

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/1114680/msp430fr2155

主题中讨论的其他器件:TIDA-010030

你(们)好  

我们将 MSP430Fr2115用于目标板。

参考板是 TIDA-010030。

我们尝试将时钟速度从12M 更改为24M。

(我们使用示波器来验证时钟速度值是否正确)

我们看到24M 时钟速度出现了两个问题

1:加载错误

  将图像加载到目标板时、通常会发生错误。 (不是每次)

2:malloc 错误

  甚至无法即时分配5个字节的内存。  

  每次程序开始初始化时都会发生这种情况。

我附加了时钟初始化代码和错误的两个映像

我的问题是24M 是该规格上的时钟速度,但我无法达到该速度。

有什么建议吗?

谢谢

void ClockInit()
{
    //P3DIR bit 0 for MCLK
    //P3SEL=01 for clock signal

    //P3SEL0 |=  BIT0;
    //P3SEL1 = 0;
    //P3DIR |=  BIT0;


    __bis_SR_register(SCG0);                // Disable FLL
    CSCTL3 = SELREF__REFOCLK;               // Set REFO as FLL reference source
    CSCTL1 = DCOFTRIMEN_1 | DCOFTRIM0 | DCOFTRIM1 | DCORSEL_7;// DCOFTRIM=3, DCO Range = 24MHz
    //CSCTL2 = FLLD_0 + 30;                   // DCODIV = 1MHz
    CSCTL2 = 731;   //FLLD = 0  FLLN = 731    //24M
    __delay_cycles(100);
    __bic_SR_register(SCG0);                // Enable FLL
    Software_Trim();                        // Software Trim to get the best DCOFTRIM value
    CSCTL4 = SELMS__DCOCLKDIV | SELA__REFOCLK; // set default REFO(~32768Hz) as ACLK source, ACLK = 32768Hz

    PM5CTL0 &= ~LOCKLPM5;

}

void Software_Trim()
{

#define MCLK_FREQ_MHZ 24                     // MCLK = 24MHz

    unsigned int oldDcoTap = 0xffff;
    unsigned int newDcoTap = 0xffff;
    unsigned int newDcoDelta = 0xffff;
    unsigned int bestDcoDelta = 0xffff;
    unsigned int csCtl0Copy = 0;
    unsigned int csCtl1Copy = 0;
    unsigned int csCtl0Read = 0;
    unsigned int csCtl1Read = 0;
    unsigned int dcoFreqTrim = 3;
    unsigned char endLoop = 0;


    do
    {
        CSCTL0 = 0x100;                         // DCO Tap = 256
        do
        {
            CSCTL7 &= ~DCOFFG;                  // Clear DCO fault flag
        }while (CSCTL7 & DCOFFG);               // Test DCO fault flag

        __delay_cycles((unsigned int)30000 * MCLK_FREQ_MHZ);// Wait FLL lock status (FLLUNLOCK) to be stable
                                                           // Suggest to wait 24 cycles of divided FLL reference clock

        __no_operation();

        while((CSCTL7 & (FLLUNLOCK0 | FLLUNLOCK1)) && ((CSCTL7 & DCOFFG) == 0));

        csCtl0Read = CSCTL0;                   // Read CSCTL0
        csCtl1Read = CSCTL1;                   // Read CSCTL1

        oldDcoTap = newDcoTap;                 // Record DCOTAP value of last time
        newDcoTap = csCtl0Read & 0x01ff;       // Get DCOTAP value of this time
        dcoFreqTrim = (csCtl1Read & 0x0070)>>4;// Get DCOFTRIM value

        if(newDcoTap < 256)                    // DCOTAP < 256
        {
            newDcoDelta = 256 - newDcoTap;     // Delta value between DCPTAP and 256
            if((oldDcoTap != 0xffff) && (oldDcoTap >= 256)) // DCOTAP cross 256
                endLoop = 1;                   // Stop while loop
            else
            {
                dcoFreqTrim--;
                CSCTL1 = (csCtl1Read & (~DCOFTRIM)) | (dcoFreqTrim<<4);
            }
        }
        else                                   // DCOTAP >= 256
        {
            newDcoDelta = newDcoTap - 256;     // Delta value between DCPTAP and 256
            if(oldDcoTap < 256)                // DCOTAP cross 256
                endLoop = 1;                   // Stop while loop
            else
            {
                dcoFreqTrim++;
                CSCTL1 = (csCtl1Read & (~DCOFTRIM)) | (dcoFreqTrim<<4);
            }
        }

        if(newDcoDelta < bestDcoDelta)         // Record DCOTAP closest to 256
        {
            csCtl0Copy = csCtl0Read;
            csCtl1Copy = csCtl1Read;
            bestDcoDelta = newDcoDelta;
        }

    }while(endLoop == 0);                      // Poll until endLoop == 1

    CSCTL0 = csCtl0Copy;                       // Reload locked DCOTAP
    CSCTL1 = csCtl1Copy;                       // Reload locked DCOFTRIM
    while(CSCTL7 & (FLLUNLOCK0 | FLLUNLOCK1)); // Poll until FLL is locked
}

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

    你(们)好

    这些问题在12MHz 时永远不会发生? 它不应与频率相关。 是否在.map 文件中检查地址0x8400处的数据?  什么意味着您无法分配5字节的存储器? 请给我提供更多详细信息吗?  

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

    您好、Allen、

    1:否,在12MHz 时没有发生

    2:我在这里附加存储器映射。它是 FMEM、

    /****************************************************************************/
    /* SPECIFY THE SYSTEM MEMORY MAP                                            */
    /****************************************************************************/
    
    MEMORY
    {
        TINYRAM                 : origin = 0x6, length = 0x1A
        BSL0                    : origin = 0x1000, length = 0x800
        INFO                    : origin = 0x1800, length = 0x200
        TLVMEM                  : origin = 0x1A00, length = 0x200
        BOOTCODE                : origin = 0x1C00, length = 0x400
        RAM                     : origin = 0x2000, length = 0x1000
        FRAM                    : origin = 0x8000, length = 0x7F80
        ROMLIB                  : origin = 0xFAC00, length = 0x5000
        BSL1                    : origin = 0xFFC00, length = 0x400
        JTAGSIGNATURE           : origin = 0xFF80, length = 0x0004, fill = 0xFFFF
        BSLSIGNATURE            : origin = 0xFF84, length = 0x0004, fill = 0xFFFF
        BSLCONFIGURATIONSIGNATURE: origin = 0xFF88, length = 0x0002, fill = 0xFFFF
        BSLCONFIGURATION        : origin = 0xFF8A, length = 0x0002, fill = 0xFFFF
        BSLI2CADDRESS           : origin = 0xFFA0, length = 0x0002, fill = 0xFFFF
        INT00                   : origin = 0xFFA2, length = 0x0002
        INT01                   : origin = 0xFFA4, length = 0x0002
        INT02                   : origin = 0xFFA6, length = 0x0002
        INT03                   : origin = 0xFFA8, length = 0x0002
        INT04                   : origin = 0xFFAA, length = 0x0002
        INT05                   : origin = 0xFFAC, length = 0x0002
        INT06                   : origin = 0xFFAE, length = 0x0002
        INT07                   : origin = 0xFFB0, length = 0x0002
        INT08                   : origin = 0xFFB2, length = 0x0002
        INT09                   : origin = 0xFFB4, length = 0x0002
        INT10                   : origin = 0xFFB6, length = 0x0002
        INT11                   : origin = 0xFFB8, length = 0x0002
        INT12                   : origin = 0xFFBA, length = 0x0002
        INT13                   : origin = 0xFFBC, length = 0x0002
        INT14                   : origin = 0xFFBE, length = 0x0002
        INT15                   : origin = 0xFFC0, length = 0x0002
        INT16                   : origin = 0xFFC2, length = 0x0002
        INT17                   : origin = 0xFFC4, length = 0x0002
        INT18                   : origin = 0xFFC6, length = 0x0002
        INT19                   : origin = 0xFFC8, length = 0x0002
        INT20                   : origin = 0xFFCA, length = 0x0002
        INT21                   : origin = 0xFFCC, length = 0x0002
        INT22                   : origin = 0xFFCE, length = 0x0002
        INT23                   : origin = 0xFFD0, length = 0x0002
        INT24                   : origin = 0xFFD2, length = 0x0002
        INT25                   : origin = 0xFFD4, length = 0x0002
        INT26                   : origin = 0xFFD6, length = 0x0002
        INT27                   : origin = 0xFFD8, length = 0x0002
        INT28                   : origin = 0xFFDA, length = 0x0002
        INT29                   : origin = 0xFFDC, length = 0x0002
        INT30                   : origin = 0xFFDE, length = 0x0002
        INT31                   : origin = 0xFFE0, length = 0x0002
        INT32                   : origin = 0xFFE2, length = 0x0002
        INT33                   : origin = 0xFFE4, length = 0x0002
        INT34                   : origin = 0xFFE6, length = 0x0002
        INT35                   : origin = 0xFFE8, length = 0x0002
        INT36                   : origin = 0xFFEA, length = 0x0002
        INT37                   : origin = 0xFFEC, length = 0x0002
        INT38                   : origin = 0xFFEE, length = 0x0002
        INT39                   : origin = 0xFFF0, length = 0x0002
        INT40                   : origin = 0xFFF2, length = 0x0002
        INT41                   : origin = 0xFFF4, length = 0x0002
        INT42                   : origin = 0xFFF6, length = 0x0002
        INT43                   : origin = 0xFFF8, length = 0x0002
        INT44                   : origin = 0xFFFA, length = 0x0002
        INT45                   : origin = 0xFFFC, length = 0x0002
        RESET                   : origin = 0xFFFE, length = 0x0002
    }
    

    3:这也是执行块读取时从 TI 获取的用于 I2C 的代码。

      

    int I2CReadBlockWithCRC(uint16_t baseAddress, unsigned char I2CSlaveAddress, unsigned char Register, unsigned char *Buffer, unsigned char Length)
    {
        unsigned char TargetRegister = Register;
        unsigned char *ReadData = NULL, *StartData = NULL;
        unsigned char CRCInput[2];
        unsigned char CRC = 0;
        int i;
        uint8_t ReceiveCount;
        I2C_Mode mode;
        unsigned long int DelayCounter = 0;
    
        StartData = (unsigned char *)malloc(2 * Length);
    
        if (NULL == StartData)
        {
            MemoryErrorCount++;
            return -1;
        }
    
        ReadData = StartData;
        ReceiveCount = 2*Length;
        mode = I2C_Master_ReadReg(I2CSlaveAddress, TargetRegister,  ReceiveCount);
        while (I2cTransactionInProgress)
        {
            DelayCounter++;
            if (DelayCounter >= DELAY_LIMIT)
            {
    
                free(StartData);
                StartData = NULL;
                I2c76940ErrorCount++;
                return -1;
            }
        }
    
        if (ReceiveIndex != ReceiveCount)
        {
            free(StartData);
            StartData = NULL;
            I2c76940ErrorCount++;
            return -1;
        }
    
        CopyArray(ReceiveBuffer, ReadData,  ReceiveCount);
        CRCInput[0] = (I2CSlaveAddress << 1) + 1;
        CRCInput[1] = *ReadData;
        CRC = CRC8(CRCInput, 2, CRC_KEY);
        ReadData++;
        if (CRC != *ReadData)
        {
            free(StartData);
            StartData = NULL;
            I2c76940ErrorCount++;
            I2CCrcError++;
            return -1;
        }
        else
            *Buffer = *(ReadData - 1);
    
        for(i = 1; i < Length; i++)
        {
            ReadData++;
            CRC = CRC8(ReadData, 1, CRC_KEY);
            ReadData++;
            Buffer++;
    
            if (CRC != *ReadData)
            {
                free(StartData);
                StartData = NULL;
                I2c76940ErrorCount++;
                I2CCrcError++;
                return -1;
            }
            else
                *Buffer = *(ReadData - 1);
        }
    
        free(StartData);
        StartData = NULL;
    
        return 0;
    }

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

    以24MHz 运行需要2个 FRAM 等待状态[参考数据表(SLASEC4D)第5.3节]。 尝试在 ClockInit()的开头添加此项:

    >   FRCTL0 = FRCTLPW | NWAITS_2;  

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

    您好、Bruce、

    这 解决了我的问题!

    谢谢