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.

[参考译文] MSP430FR2422:对0x1A00至0x1A23的器件描述符的访问将提供0x3FFF

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/979284/msp430fr2422-access-to-device-descriptors-from-0x1a00-to-0x1a23-gives-0x3fff

器件型号:MSP430FR2422
主题中讨论的其他器件:MSP430FR5959

你好!

我正在尝试移植 slau320ae.pdf 支持的示例代码:“User’s Guide MSP430 Programming With the JTAG Interface”。

目前、我仅移植了相关函数、以便通过2线制 SBW (Spy-Bi Wire)接口首次访问器件。

我正在调用 GetDevice_430Xv2()。 在函数 GetDevice_430Xv2中,对 GetCoreID()的第一次调用起作用,然后 IsLockKeyProgrammed()也起作用,然后 GetCoreipIdXv2()起作用,但最后一次调用 ReadMemQuick_430Xv2()来读取 DeviceID 不会给出正确的响应。 它应该返回值0x8311 (根据数据表第56页)。 相反、它返回0x3FFF、这看起来像一个错误、因为对空存储器的访问也被描述为返回这个值。

因此、我尝试了对各种存储器位置的一些访问。
我可以从0x2000开始读取和写入 RAM。
描述符类型:
00FF0:7F80
00FF2:3524
描述符结构的起始地址:
00FF4:1A00
00FF6:0000
-->指向地址0x1A00。 看起来是正确的。
但是、从这些地址读取会得到以下结果:
01A00:3FFF
01A02:3FFF
01A04:3FFF
01A06:3FFF

我还注意到 MSP4302422和用户指南之间的差异。 在第306页、FRCTL0寄存器的复位值为0x9600。 但当我读取它时、它返回0x9608。 位3被置位。 但在用户指南中、位3为零并标记为"保留"。

我卡住了。 在文档中、该区域没有被锁定的任何内容。 为什么会出现这种行为?

有人知道这里发生了什么吗?

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

    您好!

    在调用 ReadMemQuick_430Xv2 (DeviceIdPointer + 4、1、(word_)&DeviceID)时,是否确认 DeviceIdPointer 具有正确的地址- 0x1A00?

    是否可能存在访问问题、如 用户指南(www.ti.com/.../slau445)的1.11器件安全中所述

    Srinivas

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

    您如何读取(F) RAM/TLV? 标准读取还是快速读取? AFAIK、TLV 区域只能通过快速读取。 同样、AFAIK、TLV 始终从1A00开始、并且它不受读保护。 我想您的目标器件中的 PC 指向其他位置、并且快速读取返回3FFF。

    使用基于 slau320的 SBW 主器件从 FRAM 读取 TLV 时没有任何问题。

    D:\MSP430>FLASH -f test_msp430fr5959.txt -w -v

    文件:"test_msp430fr599.txt"
    @4400 64512字节
    总大小:64512字节

    在 COM10找到主器件

    获取器件
    # JTID 熔丝芯硬软 LotWafer DieX Diey
    0 99  正常  6181 1106 30   C1F22407 2B00 2200

    写入
    时间:474ms 速度:132、7kB/s

    验证
    时间:510ms 速度:123、3 kB/s

    释放设备

    总时间:1063ms

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

    >如何读取(F) RAM/TLV? 标准读取还是快速读取?

    在函数 GetDevice_430Xv2()中的示例代码中,使用 ReadMemQuick 完成。 但是、当我对这个问题进行仔细研究时、我也使用了 ReadMem 进行了检查。 两个都返回0x3FFF。

    >再说一次、AFAIK、TLV 总是在1A00开始、并且它不受读保护。

    是的,这就是数据表说明的内容,也是示例代码实现的内容。 我还读出存储器区域0xf00:

    00FF0:80 7F 24 35 00 1A 00

    正如您看到的、这些标志是正确的、指针指向地址0x00001A00。 但是、当从0x1A00读取数据、特别是从0x1A04 (DeviceID)读取数据时、它会在整个区域内提供0x3FFF。

    GetDevice_430Xv2()中令我感到困扰的是对 GetCoreipIdXv2_430Xv2()的调用。 它将地址返回到设备描述所在的存储器位置。 它应该返回0x1A00、但给出0x01A0。 在 GetCoreipIdXv2_430Xv2()中,它说:
       IR_Shift ( SBW 指令:IR_DEVICE_ID );
       // ID 指针是一个未扰频的20位值
       *DeviceIdPointer = DR_Shift20 (0);
    我希望示例代码能够纠正这一问题。 在 DR_Shift20 ()中,位周围的移动完成。 但评论说、这是一个未扰频的20位值。 为什么这样做呢? 这是错误还是要错误?

    不管它是怎样的、我在函数中对它进行了覆盖、并将地址手册设置为0x1A04、但这并没有改变任何东西。  在任一种情况下、返回0x3FFF、这就是我在该论坛中发布的原因。

    >我想您的目标器件中的 PC 指向其他位置、然后快速读取返回3FFF。

    我有相同的想法。 在另一篇文章中、我询问了 PSA 引擎。 为了进行测试、我使用了 VerifyPSA_430Xv2 ()、其地址位于 FRAM 中且 length=1字。 有趣的是、返回的值与值相同、就像 PSA 引擎从给定位置读取0x3FFF 一样。 但是、读取 FRAM 并向其写入数据确实有效。

    从正确的地址读取数据时也会出现问题。 但这次它是 PSA 引擎。 或者可能是 CPU 移动数据、不允许访问。 但这似乎不太可能、因为我的 DUT 是 MSP430FR2422、而该器件没有其他器件上的复杂保护标志。

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

    我检查了地址。 这些存储器位置中有指向0x1A00的指针。 我还使用固定地址和 ReadMem 或 ReadMemQuick 手动进行访问。 仍然是同样的问题。 对地址范围0x1A00...的任何访问 返回0x3FFF。

    我检查了访问问题(mabe 保护标志)。 由于 EraseFRAMViaBootCode()的工作方式,此函数将批量擦除 FRAM,这不是问题。 我可以对区域0xFF80...0xFF83进行编程、SBW 接口将按照用户指南中的说明锁定。 启动时、保险丝被正确报告为已设置。 然后我可以调用 EraseFRAMViaBootCode(),批量擦除将重置所有内容。 它不是永久的锁。

    我还怀疑 ReadMemQuick 函数是问题的原因、因此我将其与用户指南中2.3.3.3.1中描述的流程进行了比较。 但一切都很好。

    有什么想法我还能检查什么?

    除了 Replicator430FR 或 SimpleLink 主机代码中的示例之外、是否还有其他(更基本)示例代码用于测试 CPU 或寄存器?

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

    你好! 同时、我已经使它正常工作了。

    第一个问题是时钟计时问题。 我的代码基于 slau320ai 中的 Replicator430FR 源代码。 设置/清除信号的定义不一致。
    例如:
    1)    #define ClrTCLK()  ClrTCLK_sbw()
          使用此定义时、函数中没有延迟。
    2)   #define ClrTST()   (JTAGOUT &= ~SBWCLK)
          在定义中、也没有延迟。
    3)    #define TMSLDH {JTAGOUT &= ~SBWDATO; nNOPS JTAGOUT &= ~SBWCLK; nNOPS JTAGOUT |= SBWDATO; JTAGOUT |= SBWCLK;}
          如您所见、在该定义中、插入了带有 nNOPS 的延迟。
    SBWDIO 信号也是如此。 有些定义有延迟、有些则没有。

    我对复制器代码进行了重大修改、最后、每个信号更改都使用以下四个定义进行。 现在始终施加延迟、以避免信号切换过快。

    void DELAYsbw ( void ) { waitFor_ns(300); }   // 5 NOP cycles (@18 MHz) --> 5*(1/18MHz) = 278ns
    inline void ClrSBWTCK ( void ) { my_sbwClock->SetLow(); DELAYsbw(); }
    inline void SetSBWTCK ( void ) { my_sbwClock->SetHigh(); DELAYsbw(); }
    inline void ClrSBWTDIO ( void ) { my_sbwData->SetLow(); DELAYsbw(); }
    inline void SetSBWTDIO ( void ) { my_sbwData->SetHigh(); DELAYsbw(); }

    第二个问题是 Replicator430FR 源中存在错误。 在"SimpleLink Host for MSP430 SBW"源的 SBW430FR.c 中可以找到相同的错误:

    word GetCoreipIdXv2()
    {
        IR_Shift(IR_COREIP_ID);
        CoreId = DR_Shift16(0);
        if(CoreId == 0)
        {
            return(STATUS_ERROR);
        }
        IR_Shift(IR_DEVICE_ID);
        DeviceIdPointer = DR_Shift20(0);
        // The ID pointer is an un-scrambled 20bit value
        return(STATUS_OK);
    }

    有一个 GitHub 项目可实现 MSP430的 DLL。 请参阅 https://github.com/BuLogics/libMSP430

    深入了解代码中的 HAL_FUNCTION (_hal_GetJtagId)可在 https://github.com/BuLogics/libMSP430/blob/master/Bios/src/hal/macros/GetJtagId.c 中找到

        // Get Core identification info
        core_ip_pointer     
        SetReg_16Bits(0);
        CoreIpId = lOut;
        // Get device identification pointer
        device_ip_pointer
        SetReg_20Bits(0);     
        DeviceIpPointer = lOut_long;
        // The ID pointer is an un-scrambled 20bit value
        DeviceIpPointer = ((DeviceIpPointer & 0xFFFF) << 4 )  + (DeviceIpPointer >> 16 );

    最重要的区别是最后一行。 您可以看到注释是相同的、但 Replicator 代码不会更正扰频指针。 我将此更正添加到了我的代码中、它解决了问题。

    感谢 TI 提供错误代码。 您尚未对其进行测试。 否则你应该注意到这个错误!
    我被允许在几天内搜索您的错误真是太棒了!!!