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.

[参考译文] TMS320F2.8054万M:2.8054万M MCU在调试时锁定

Guru**** 2524550 points
Other Parts Discussed in Thread: UNIFLASH, MOTORWARE

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/653572/tms320f28054m-28054m-mcu-locked-at-debug

部件号:TMS320F2.8054万M
主题中讨论的其他部件:UNIFLAASHMOTORWARE

我想在自己的主板上用XDS100仿真器对2.8054万M MCU进行编程。 我编译了Instaspin的lab02a,可以轻松下载并使用2.8054万F设备运行它。 但是,当我尝试在同一硬件上使用2.8054万M时,我遇到了几个问题。

在调试模式下,我们可以将代码下载为闪存至2.8054万M。 当我们运行它时,它首先工作,然后MCU被锁定。 您可以在下面看到调试窗口。 那么,我们就不能用任何程序,例如Uniflash等,来达到MCU。原因可能是什么?

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

    您好,

    您是否已使用CSM锁定零件?

    SAL

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

    您好,

    您所面临的问题不是很清楚。 您收到的错误信息是什么? 是否可以附加CCS窗口的完整快照(包括错误消息)。

    Vivek Singh

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

    您可以看到以下消息:

    当我尝试再次连接时,我看到此消息

    在Uniflash中,当我尝试读取它的闪存时,我看到了折叠消息

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

    您好,

    您能否发送您正在使用的两台设备顶部视图的屏幕截图? 我们希望查看部件上打印的内容。

    SAL

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

    以下代码写在部件上:

    TMS320

    F2.8054万MPNT

    C A-62ANVEW

          G4

    您可以在下面找到软件包的视图:

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我们还需要其他设备的屏幕截图。 在这些器件上,TI锁定Zone1和L0 RAM,因此用户无需在其应用中使用L0。 我希望您的申请能注意到这一点。

    此外,您是否在一个包含多个部件的M部分的板上尝试过此操作?

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

    您可以在下面找到2.8054万F的屏幕截图。 该MCU没有问题:

    我只是尝试下载汽车软件的原始代码。 没有其他代码。 我不明白为何会出现这种情况。 我观察到,在我的一些审判中,这一错误发生了。 也许我试了六七次,没有问题。 但下次试用时会出现此错误。

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

    我在上述消息中写下了两台设备的屏幕截图。 我还不能解决这个问题。

    在您的演示板原理图(f2806x ISO-controlCARD和F2805X_ISOcCARD)中存在差异。 在2805x原理图中,您在JTAG_TCK上还有一个2.2k的上拉。 是否会造成这样的问题呢?

    此外,我还有一个双层PCB。 我认为这不会导致这样的问题,但我在您的演示中看到,您在使用C2000系列时,建议在PCB上使用4层或更多层的设计。 您是否建议我使用4层PCB设计?

    我还在问题发生之前和之后拍摄了仿真器屏幕的屏幕截图。 首先,在问题发生之前,每个变量都有一个带有坏符号的可笑的值。  

    然后它在某些程序存储点3FF472处停止。 我认为这是ROM中的一个要点

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我要求我们的主板设计师调查您最近的查询。

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

    电机发烧友,

    TCK上有一个内部上拉电阻,不需要外部上拉电阻。

    我预计2层主板可能不是原因,2层主板更容易受到噪音的影响,因为它缺乏电源或接地平面,但这不会影响您在相对"清洁"的噪音环境中连接到设备的能力。  

    0x0BAD只是CCS与设备之间一般缺乏通信。

    我的理论是,您在对闪存进行编程或擦除时中断了设备,导致密码位置损坏。 这意味着您将被锁定在设备之外。 请检查"CSM控制寄存器",这将指示设备是否已锁定。 位的位置和说明可在TRM中找到,  

    此致,
    科迪  

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

    我在Instaspin Motorware项目中意识到了一件事。 在hal.c文件中,有一个HAL_CAL函数用于校准ADC和振荡器校准。 对于2.8069万M器件,如下所示:

    void HAL_CAL(HAL_HANDLE handle )

     HAL_Obj *OBJ =(HAL_Obj *)句柄;

     //启用ADC时钟

     clk_enableAdcClock(obj->clkHandle);

     //运行Device_cal()函数

     //此函数从TI保留的位置复制ADC和振荡器校准值

     //将OTP放入相应的微调寄存器

     //此启动ROM会自动调用此功能以校准内部

     //振荡器和ADC,具有器件特定的校准数据。

     //如果Code Composer Studio在开发过程中绕过引导ROM,

     //然后,必须通过应用程序初始化校准

     enable_protected_register_write_mode;

     (*Device_cal)();

     disable_protected_register_write_mode;

     //在用户内存中运行偏移校准

     HAL_AdcOffsetSelfCal (句柄);

     //运行振荡器补偿

     HAL_OscTempComp (句柄);

     //禁用ADC时钟

     clk_disableAdcClock(obj->clkHandle);

     返回;

    }// hal_cal()函数结束

    但对于2.8054万M设备HAL_奥斯卡TempComp(handles);  行通过//注释删除。 2.8054万M器件的ADC转换结果错误,因此我刚刚比较了2.8054万M和2.8069万M的ADC寄存器设置。 然后我意识到2.8054万M器件ADCCTL2寄存器ADCNONOVERLAP位为0,因此允许样品和转换重叠。 另一方面,对于2.8069万M器件,此位为1。

    为了设置这个位,我删除了HAL_OscTempComp(Handle)的注释,但在那种情况下MCU就像我描述的那样被锁定。 每当我注释HAL_OscTempComp(Handle)时, 函数MCU工作时没有任何锁定,但ADC转换结果是错误的。

    您可以在 下面找到HAL_OscTempComp (句柄);函数:

    void HAL_OscTempComp (HAL_handle句柄)

     HAL_Obj *OBJ =(HAL_Obj *)句柄;

     UINT16_t温度;

     //禁用ADC

     adc_disable(obj->adcHandle);

     //打开挡板回路的电源

     adc_enableBandGap(obj->adcHandle);

     //将ADC电压参考源设置为内部

     ADC_setVoltRefSrc(obj->adcHandle,ADC_VoltageRefSrc_Int);

     //启用ADC参考缓冲区

     ADC_enableRefBuffers(obj->adcHandle);

     //设置主时钟缩放系数(ADC模块的最大时钟频率为45MHz)

     ADC_setDivideSelect(obj->adcHandle,ADC_DivideSelect_CLKIN_BY_2);

     //打开ADC的电源

     adc_powerup (obj->adcHandle);

     //启用ADC

     adc_enable(obj->adcHandle);

     //启用非重叠模式

     ADC_enableNoOverlapMode(obj->adcHandle);

     //内部将通道A5连接到温度传感器

     ADC_setTempSensorSrc(obj->adcHandle, ADC_TempSensorSrc_Int);

     //将SOC0通道选择设置为ADCINA5

     ADC_setSockChanNumber(obj->adcHandle, ADC_SockNumber_0, ADC_SockChanNumber_A5);

     //将SOC0采集周期设置为26 ADCCLK

     ADC_setSocSampleDelay(obj->adcHandle, ADC_SocNumber_0, ADC_SocSampleDelay_64_Cycles);

     //将ADCINT1连接到EOC0

     ADC_setIntSrc(obj->adcHandle, ADC_IntNumber_1,ADC_IntSrc_EOC0);

     //清除ADCINT1标志

     ADC_clearIntFlag(obj->adcHandle, ADC_IntNumber_1);

     //启用ADCINT1

     adc_enableInt(obj->adcHandle, adc_IntNumber_1);

     //在SOC0上强制开始转换

     ADC_setSocFrc(obj->adcHandle, ADC_SocFrc_0);

     //等待转换结束

     while (ADC_getIntFlag(obj->adcHandle, ADC_IntNumber_1)==0){}

     //清除ADCINT1标志

     ADC_clearIntFlag(obj->adcHandle, ADC_IntNumber_1);

     温度= ADC_readResult(obj->adcHandle, ADC_ResultNumber_0);

     HAL_osc1Comp (手柄,温度);

     HAL_osc2Comp (手柄,温度);

     返回;

    }// HAL_OscTempComp()函数结束

    然后我有几个问题:

    1)应用中ADCNONOVERLAP的值0和1有什么区别? 该位的零值是否会导致错误的ADC转换? TRM中没有关于该位的详细解释。

    2)为什么函数HAL_OscTempComp()被注释为2.8054万器件,而它在2.8069万中处于活动状态?

    3)为什么激活HAL_OscTempComp()函数会锁定2.8054万M器件的MCU?

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

    M.E.,

    HAL软件似乎没有正确移植到F2805x。  oscNComp()使用的OTP函数位于F2806x和F2805x之间的不同位置,这样,如果地址未在软件中更新,就可以解释执行故障。  正确的实现是更新OTP函数地址并包括HAL_OICTempComp()。  仅使用Device_cal(),振荡器将被微调为30C操作。

    F2806x和F2805x都具有初始转换错误的ADC咨询,可以通过设置ADCNONOVERLAP位来减少该错误。  ADCNONOVERLAP 行为的差异很小。

    对于下图中允许ADC重叠(ADCNONOVERLAAP=0),ADC可以在SOC0转换仍在处理时开始对SOC1通道采样:

    当不允许ADC重叠时(ADCNONOVERLAAP=1),ADC将不会开始对SOC1通道采样,直到完成SOC0转换:

    另请注意,F2805x数据表包括建议的ACQPS设置,这些设置因ADCNONOVERLAP设置而异:

    汤米

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

    感谢您的回复,汽车软件附带的链接器命令文件与CCS studio安装程序附带的链接器命令文件几乎相同。 我所看到的唯一区别是,在汽车器具中,闪存的C至F部分是统一的。 您可以在下面找到映射文件,是否有任何问题:

    内存

    第0页:/*程序存储器*/
    /*内存(RAM/FLASE/OTP)块可移至Page1以进行数据分配*/
    RAML1L2:原点= 0x0.88万,长度= 0x0.08万 /*片上RAM块L1 */
    FLASHJ:原点= 0x3E8000,长度= 0x0.1万 /*片上闪存*/
    FLASHI:原点= 0x3E9000,长度= 0x0.1万 /*片上闪存*/
    FLASHH:Origin = 0x3EA000,length = 0x0.2万 /*片上闪存*/
    FLASHG:Origin = 0x3EC000,length = 0x0.2万 /*片上闪存*/
    /* FLASHF:原点= 0x3EE000,长度= 0x0.2万 /*片上闪存*/
    /* FLASHE:原点= 0x3F0000,长度= 0x0.2万 /*片上闪存*/
    /* FLASHD:原点= 0x3F2000,长度= 0x0.2万 /*片上闪存*/
    FLASHC_F:原点= 0x3EE000,长度= 0x0.8万 /*片上闪存*/
    FLASHA:原点= 0x3F7000,长度= 0x000FFE /*片上闪存*/
    BEGIN:Origin = 0x3F7FFE,length = 0x0.0002万 /*部分FLASHA。 用于“引导至闪存”引导加载程序模式。 */

    Z1_SCC_ROM:原点= 0x3F8000,长度= 0x0.04万 /*区域1安全复制码安全ROM */
    Z2_SCC_ROM:原点= 0x3F8400,长度= 0x0.04万 /*区域2安全复制代码安全ROM */
    Z1_SECRE_ROM:原点= 0x3F8808,长度= 0x0044F8 /* Z1安全ROM */

    IQTABLES:ORIGIN = 0x3FDB52,LENGTH = 0x000b50 /*引导ROM中的IQ数学表*/
    IQTABLES2:Origin = 0x3FE6A2,length = 0x0.0008万C /* IQ启动ROM */中的数学表
    IQTABLES3:原始= 0x3FE72E,长度= 0x0000AA /*引导ROM中的IQ数学表*/


    DCSM_OTP_Z2_P0:原点= 0x3D7800,长度= 0x0.0004万 /* Z1 OTP的一部分。 LinkPointer/JTAG锁定/引导模式*/
    DCSM_OTP_Z1_P0:原点= 0x3D7A00,长度= 0x0.0006万 /* Z2 OTP的一部分。 LinkPointer/JTAG锁定*/

    /* DCSM Z1区域选择内容和保留位置(!!可移动!) */
    /* Z1_DCSM_RSVD必须编程为全部0x0000,并且必须立即遵循Z1区域选择块*/
    DCSM_ZSEL_Z1_P0:原点= 0x3D7A10,长度= 0x0.001万 /* Z1 OTP的一部分。 Z1密码位置/闪存和RAM分区*/
    Z1_DCSM_RSVD:原点= 0x3D7A20,长度= 0x0001E0 /* Z1 OTP的一部分。 当Z1 DCSM正在使用时,使用所有0x0000编程。 */

    /* DCSM Z1区域选择内容和保留位置(!!可移动!) */
    /* Z2_DCSM_RSVD必须编程为全部0x0000,并且必须立即跟随Z2区域选择块*/
    DCSM_ZSEL_Z2_P0:原点= 0x3D7810,长度= 0x0.001万 /* Z2 OTP的一部分。 Z2密码位置/闪存和RAM分区*/
    Z2_DCSM_RSVD:原点= 0x3D7820,长度= 0x0001E0 /*程序在使用Z2 DCSM时全部为0x0000。 */

    ROM:Origin = 0x3FF27C,length = 0x000D44 /* Boot ROM */
    Reset : origin = 0x3FFFC0,length = 0x0.0002万 /* part of boot ROM */
    矢量:原始= 0x3FFFC2,长度= 0x0.0003万E /*启动ROM的一部分*/

    第1页:/*数据存储器*/
    /*内存(RAM/FLASE/OTP)块可以移动到PAGE0以进行程序分配*/
    /*寄存器保留在Page1上*/
    BOOT_RSVD:Origin = 0x0万,length = 0x0.005万 /* M0的一部分,boot ROM将使用此堆栈*/
    RAMM0:原始= 0x0.005万,长度= 0x0003B0 /*片上RAM块M0 */
    RAMM1:原点= 0x0.04万,长度= 0x0.04万 /*片上RAM块M1 */
    RAML3:原点= 0x0.9万,长度= 0x0.1万 /*片上RAM块L3 */
    FLASHB:原点= 0x3F6000,长度= 0x0.1万 /*片上闪存*/

    }

    /*将部分分配给内存块。
    注意:
    DSP28_CodeStartBranch.asm中的codegstart用户定义部分用于重定向代码
    引导至闪存时执行
    RAMfuncs用户定义的部分,用于存储将从闪存复制到RAM的函数
    */

    章节

    /*分配方案领域:*/
    .cinit :> FLASHC_F page =0
    .Pinit:> FLASHC_F,第= 0页
    .text:> FLASHC_F page = 0
    codegstart:> BEGIN PAGE =0

    ramfuncs:load = FLASHA,
    RUN = RAML1L2,
    load_start(_RamfuncsLoadStart),
    load_end (_RamfuncsLoadEnd),
    run_start(_RamfuncsRunStart),
    页面= 0

    DCSM_OTP_Z1:> DCSM_OTP_Z1_P0页= 0
    DCSM_OTP_Z2:> DCSM_OTP_Z2_P0 page = 0

    DCSM_Zsel_Z1:> DCSM_ZSEL_Z1_P0页= 0
    DCSM_rsvd_Z1:> Z1_DCSM_RSVD页面= 0
    DCSM_Zsel_Z2:> DCSM_ZSEL_Z2_P0 page = 0
    DCSM_rsvd_z2:> Z2_DCSM_RSVD页面= 0

    /*分配未初始化的数据段:*/
    stack:> RAMM0 page = 1
    .ebss:> RAML3页面= 1
    esysmem:> RAML3页面= 1.

    /*初始化部分进入Flash */
    /*要让SDFlash对这些进行编程,必须将它们分配到第0页*/
    econst :> FLASHC_F page =0
    .switch:> FLASHC_F page = 0

    /*分配IQ数学领域:*/
    IQMath :> FLASHC_F page =0 /* Math Code */
    IQmathTables:> IQTABLES,page =0,type = NoLoad

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

    我们已经解决了ADC问题。 我认为2.8054万器件连接到PGA的ADC输入存在问题。 即使您不使用PGA功能,该针脚处也会有增益,因此您不能将其设置为1。 当我将读数移至未连接到PGA的针脚时,ADC读数将正确。 在E2E论坛上也有类似的讨论。

    另一方面,MCU锁定问题仍然存在。 我意识到这是因为

     HAL_osc1Comp (手柄,温度);

     HAL_osc2Comp (手柄,温度);

    HAL_奥斯卡 奖计算机中的函数

    您说OTP的2806x和2805x功能地址是不同的。 2805x头文件中定义的地址是否存在问题? 因为我看到这些地址被定义为2806x和2805x完全相同。 您可以在附件中找到hal.h文件2805x。 在该文件中定义的地址是否有任何问题?

    e2e.ti.com/.../0028.hal.h

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您似乎使用的是以前的汽车器具版本,可能是v14或更早版本。 在这些早期版本中,在hal.h中定义的温度传感器寄存器不正确,因此我们在hal.c.中评论了振荡器补偿函数HAL_奥斯卡 温度传感器寄存器(handle) 如果您调用HAL_OscTempComp(),这些错误的定义将导致PC进入错误地址。

    我们已从Motorware V15修复了此问题,最新版本V18也修复了此问题,您可以在项目中使用新的hal.h或使用最新的Motorware。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    是的,您说的对,我使用的是14号汽车。 然后,我将代码移至Motorware 18。 现在没有锁定问题。

    但我还有一个问题,我只是在调试模式下使用Code Composer Studio通过XDS100仿真器下载代码。 然后我删除了仿真器,一切看起来都很好,MCU内部有代码。 但当我循环使用主板的电源时。 主板不再工作。

    我可以使用Uniflash读取内存,似乎内部有一些代码。 但它不起作用,LED指示灯闪烁时甚至没有响应。因此,这意味着MAIN_ISR不起作用。

    同样,当我尝试通过Uniflash下载代码时,它不能再次工作。 唯一有效的选项是通过Code Composer Studio进行调试操作。

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

    您可能已在闪存中编程了旧代码。 您可以使用CCS通过闪存链接器命令文件对您的汽车器代码进行闪存编程。 然后,如果引导至闪存,只要您将CodeStartBranch.asm文件包含在闪存项目中,应用程序就应开始运行。

    SAL
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    好的,但是我已经在使用motorware18中提供的链接器命令文件F2.8054万M.cmd。 CodeStartBranch.asm也包含在项目中。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好,

    是否可以确保设备正在引导至闪存? 如果您的闪存映像是最新的,并且您的设备设置为BRANCH,在独立复位时闪烁,则一切都应正常。 请确保开始处的LB指令位置(0x3F7FFE)正在分支到更新的闪存映像。 它应该分支到c_init。

    要确保这一点,您可以连接调试器,将PC移动到0x3F7FFE,然后运行。 在主地址设置断点,PC最终应在该地址处停止。 这会让您知道您已对适当的闪存映像进行了编程。 ROM可以成功地分支到它并开始执行您的应用程序。

    希望这有所帮助。
    SAL
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我看到LB指令位于Begin(0x37FFE)

    在反汇编窗口中,我看到007F3CF7写在程序地址0x3F7FFE上。

    当我重新启动电源并通过Uniflash读取相同的地址时,我再次看到007F3CF7被写入。 但在某种程度上,该程序在电源重置后无法工作。

    我还购买了2.8054万MISO控制板,并使用您的高压套件试用了它。 但我无法在加电重置时尝试它,因为它在加电后进入重置状态(我认为这是板载XDS100仿真器的结果,ı 不能删除演示板上的仿真器)

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

    连接仿真器后,将设备设置为引导至Flash,即使在仿真模式下也是如此。 TRM的第2章将提供此信息。 然后可以调试系统。

    因此,请将设备设置为引导至闪存(emu boot)并在开始时设置断点,然后即可开始调试代码。

    此外,您还可以连接到设备,移动PC以开始运行。 您也可以通过这种方式开始调试系统。

    希望这有所帮助。
    SAL