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.

[参考译文] MSP430FR2433:使用基于SLAU320的代码写入FRAM问题

Guru**** 2539500 points
Other Parts Discussed in Thread: MSP430FR2433

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/1100657/msp430fr2433-write-fram-problem-using-slau320-based-code

部件号:MSP430FR2433

大家好,我正在为Jiga测试设备开发一个代码,该设备将刻录MSP430FR2433微控制器。

我在CC2652上实施了代码以刻录代码,正确读取设备ID和读取寄存器,但是...

我不能在FRAM上写入数据(详细信息,我可以在寄存器上写入,如WDT控制器,SBW功能正常工作。  

我正在 读取SYSCFG0并获得0x9603信息,指示FRAM受保护,但我不能使用 0xA500清除PFWP位,但当我再次读取时,该位仍被设置。

我是在GetDeviceID之后, 按顺序调用:GetCoreIDIsLockKeyProrammedGetCoreIpIdXv2SyncJtag_AssertPorReadMemQuick_430Xv2 (读取TLV) 和DisableWDT

奇怪的是,我可以在另一个寄存器上写入,但SYSCFG0不能,我被卡住了,我不能在FRAM上写入数据

如果有人能帮助我,我会非常感激。

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

    您好,Pablo:

    您是否在一次写入操作中将0xA500 PW和清除PFWP位写入SYSCFG0?

    类似于此-> #define disable_PF_write_protect       SYSCFG0 = FRWPPW | DFWP

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

    这是我在汇编程序中的工作示例。 它在COREIP_ID移出并同步后完成。 寄存器为32位,写入内存输入R0采用ADR <16| val格式

          //禁用监视器

          日志' WDC '

          LDR R0,=((WDTCTL98 << 16)|(WDTPW + WDTHOLD))
          BL BWriteMem.(BL BWriteMem

          //删除FRAM写保护
          // mov.w #0,&SYSCFG0

          日志' SYS '

          LDR R0,=((0160h << 16)| 0)
          BL BWriteMem.(BL BWriteMem

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

    是的,我在一个操作中完成所有操作,但没有成功:(  

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

    首先调用 GetDevice_430Xv2,代码如下:

    word GetDevice_430Xv2(sbw_t *obj){
        uint32_t pDeviceID;
    
        obj->info.Cpu = CPU_UNKNOWN_STATE;
        if (GetCoreID(obj) != STATUS_OK){
            return STATUS_ERROR;
        }
        if (IsLockKeyProgrammed(obj->link)){
            // my fuse is blown :(
            obj->info.Efuse = MSP430_FUSE_BLOWN;
            return STATUS_FUSEBLOWN;
        }
        obj->info.Cpu = CPU_RELEASED;
        obj->info.Efuse = MSP430_FUSE_OK;
        pDeviceID = GetCoreipIdXv2(obj);
        if (pDeviceID == STATUS_ERROR){
            return STATUS_ERROR;
        }
    
        if (SyncJtag_AssertPor(obj) != STATUS_OK){
            return STATUS_ERROR;
        }
    
        ReadMemQuick_430Xv2(obj, pDeviceID, sizeof(tlv_t)/sizeof(uint16_t), obj->TLV._raw);
        obj->info.Device = (msp430_ids_e)obj->TLV.information.deviceID;
    
        DisableWDT_MSP430Xv2(obj);
    
        return STATUS_OK;
    }

    并且,以下函数被调用为 DisableMpu_430Xv2,  

    word DisableMpu_430Xv2(sbw_t* sbw)
    {
        word FR2433_SYSCFG0 = 0x160;
        word val;
        unsigned short newRegisterVal;
    
        if(IR_Shift(sbw->link, IR_CNTRL_SIG_CAPTURE) == JTAG_ID98)
        {
            newRegisterVal = ReadMem_430Xv2(sbw, F_WORD, FR2433_SYSCFG0);
            newRegisterVal = 0x2; // disable PFWP
            newRegisterVal |= 0xA500; // write the password
            // unlock MPU for FR4xx/FR2xx
            WriteMem_430Xv2(sbw, F_WORD, FR2433_SYSCFG0, newRegisterVal);
            val = ReadMem_430Xv2(sbw, F_WORD, FR2433_SYSCFG0);
            if((val & 0x3) == 0x0)
            {
                return STATUS_OK;
            }
            return STATUS_ERROR;
        }
    }

    使用调试会话时,调试器上有以下值:

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

    我现在不喜欢这个,但是对于FR4133这个与您的设备相似的设备,我写0 (不是A502h)@ 160H来解锁FRAM进行写入,它工作正常。 使用SBW接口。

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

    我单击了"解决错误",抱歉。

    我也尝试了0x0000,但也是同样的行为。 我找不到任何原因。 SBW逻辑很好,我可以写和读其他的寄存器,但这一个,让我疯了

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

    我也用PMMCTL0进行了测试,它也有密码,并且在这个寄存器上的写操作非常完美,在SYSCFG0上就是这样做的。

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

    是否可以写入RAM (不是FRAM)?

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

    此外,当我尝试在RAM上写入时,当我读取时,所有值都变为0。  

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

    也许问题出在其他地方,因为如果我记得正确的RAM就不会受到保护。 我希望您的设备/设置在高于2.0V的电压下工作,因为使用FRAM的较低SBW/JTAG无法工作。

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

    我会做一些检查,但我认为电压是正确设置的,由主机微控制器的3.3V线路供电。

    但仍然很奇怪。

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

    已检查所有内容,GetDevice的功能,对ExecutePOR的细微更改,但没有效果,我无法在RAM和注册器(如P1OUT,P1DIR)上写入。 尝试写入时,JTAG状态返回值0xC301

    已双击getdevice和erase/write的流。 流量相同。

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

    您应该首先解决简单的问题,例如写入目标设备RAM或 在WFP 1.0 中闪烁LED。 在WFP 1.0 闪烁之前,你应该先做这个...

          //禁用GPIO开机默认高阻抗模式
          // BIC.w #LOCKLPM2,&PM5CTL0

          日志'PIO'

          MOV.w #PM5CTL0,&MemAdr
          MOV.w #0,&MemData
          调用#BWriteMem1

    然后,您可以继续执行FRAM操作。 可能时钟或换档功能有问题。

    您可以通过任何FET将简单程序下载到目标设备,以将RAM填充至1,2,3...值,然后您可以从读取内存开始,直到结果正确。 还可读取FRAM,并将其与使用FET下载的内存值进行比较。

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

    即使是我无法写入的GPIO,我认为目标微控制器处于阻止此寄存器的状态,因为其值不会更改。 在其它寄存器(如监视器,RTC)中,我写入一个值,当读取时,我定义的值就会出现。

    SYSCFG0P1OUTP1DIR是我无法工作的寄存器:(  

    我在读取前尝试调用SyncJtag,HaltCPU,ReleaseCPU,但没有结果。 我已经检查了写操作,遵循了  所有MSP430编程和JTAG接口文档,但仍然是相同的行为。