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.

[参考译文] CCS/TMS320F2808:F2808 PLL 未解锁

Guru**** 2524460 points


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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/623917/ccs-tms320f2808-f2808-pll-not-unlock

器件型号:TMS320F2808

工具/软件:Code Composer Studio

大家好、我最近使用 F2808在 CCS 6中创建了我的第一个项目(我第一次使用这个微控制器)。 这是一个简单的项目,如果我只初始化 CLK,我使用函数 InitSysCtrl()。 我还使用标准链接器命令文件 F2808.cmd (我不更改它)。 但我的代码是行循环: while (SysCtrlRegs.PLLSTS.bit.PLLLOCKS!= 1)、这意味着 PLL 被锁定。

时钟配置:OSCCLK - 20、CLKINDIV - 2、PLLCR - 10。

e2e.ti.com/.../F2808.rar F2808.cmd

如果有人知道此问题的原因-请帮助我

#include "DSP280x_Device.h"
void InitSysCtrl (void)
{
易失性 uint16 i; //通用 uint16
volatile int16虚拟; //通用易失性 int16

EALLOW; //启用 EALLOW 受保护寄存器访问

DevEmuRegs.PROTSTART = 0x0100; //将默认值写入保护起始寄存器
DevEmuRegs.PROTRANGE = 0x00FF; //将默认值写入保护范围寄存器

虚拟= CsmPwl.PSWD0; //虚拟读取 PWL 位置
虚拟= CsmPwl.PSWD1; //虚拟读取 PWL 位置
虚拟= CsmPwl.PSWD2; //虚拟读取 PWL 位置
虚拟= CsmPwl.PSWD3; //虚拟读取 PWL 位置
虚拟= CsmPwl.PSWD4; //虚拟读取 PWL 位置
虚拟= CsmPwl.PSWD5; //虚拟读取 PWL 位置
虚拟= CsmPwl.PSWD6; //虚拟读取 PWL 位置
虚拟= CsmPwl.PSWD7; //虚拟读取 PWL 位置

SysCtrlRegs.WDCR = 0x00E8;
SysCtrlRegs.SCSR = 0x0000;

//确保 PLL 没有在跛形模式下运行
if (SysCtrlRegs.PLLSTS.bit.MCLKSTS!= 1)
{// PLL 未在跛行模式下运行
SysCtrlRegs.PLLSTS.bit.MCLKOFF = 1; //在设置 PLLCR 之前关闭缺少时钟检测
SysCtrlRegs.PLLCR.bit.DIV = 0x000A; // PLLx5

while (SysCtrlRegs.PLLSTS.bit.PLLLOCKS!= 1)
{//等待 PLLLOCKS 位被置位
SysCtrlRegs.WDKEY = 0x0055; //等待时处理看门狗
SysCtrlRegs.WDKEY = 0x00AA; //如果用户启用了它。
}

SysCtrlRegs.PLLSTS.bit.MCLKOFF = 0; //启用缺少时钟检测电路
}
否则{ // PLL 正在跛行模式下运行
asm (" ESTOP0");
}

/***配置时钟***/
SysCtrlRegs.HISPCP。ALL = 0x0004; //高速外设时钟预分频器、HSPCLK=SYSCLKOUT/8
SysCtrlRegs.LOSPCP。all = 0x0002; //低速 periph 时钟预分频器、LOSPCLK=SYSCLKOUT/4

SysCtrlRegs.PCLKCR1.bit.EQEP2ENCLK = 1;// SYSCLKOUT 至 eQEP2被启用
SysCtrlRegs.PCLKCR1.bit.EQEP1ENCLK = 1;//启用 SYSCLKOUT 至 eQEP1
SysCtrlRegs.PCLKCR1.bit.ECAP4ENCLK = 1;//启用 SYSCLKOUT 至 eCAP4
SysCtrlRegs.PCLKCR1.bit.ECAP3ENCLK = 1;// SYSCLKOUT 至 eCAP3被启用
SysCtrlRegs.PCLKCR1.bit.ECAP2ENCLK = 1;//启用 SYSCLKOUT 至 eCAP2
SysCtrlRegs.PCLKCR1.bit.ECAP1ENCLK = 1;//启用 SYSCLKOUT 至 eCAP1
SysCtrlRegs.PCLKCR1.bit.EPWM6ENCLK = 1;//启用 SYSCLKOUT 至 ePWM6
SysCtrlRegs.PCLKCR1.bit.EPWM5ENCLK = 1;//启用 SYSCLKOUT 至 ePWM5
SysCtrlRegs.PCLKCR1.bit.EPWM4ENCLK = 1;//启用 SYSCLKOUT 至 ePWM4
SysCtrlRegs.PCLKCR1.bit.EPWM3ENCLK = 1;//启用 SYSCLKOUT 至 ePWM3
SysCtrlRegs.PCLKCR1.bit.EPWM2ENCLK = 1;//启用 SYSCLKOUT 至 ePWM2
SysCtrlRegs.PCLKCR1.bit.EPWM1ENCLK = 1;// SYSCLKOUT 至 ePWM1启用

SysCtrlRegs.PCLKCR0.bit.ECANBENCLK = 1;// SYSCLKOUT 至 eCAN-B 被启用
SysCtrlRegs.PCLKCR0.bit.ECANAENCLK = 1;// SYSCLKOUT 至 eCAN-A 被启用
SysCtrlRegs.PCLKCR0.bit.SCIBENCLK = 1;//使能 LSPCLK 到 SCI-B
SysCtrlRegs.PCLKCR0.bit.SCIAENCLK = 1;//使能 LSPCLK 到 SCI-A
SysCtrlRegs.PCLKCR0.bit.SPIBENCLK = 1;//使能 LSPCLK 到 SPI-B
SysCtrlRegs.PCLKCR0.bit.SPIAENCLK = 1;//使能 LSPCLK 到 SPI-A
SysCtrlRegs.PCLKCR0.bit.SPIDENCLK = 1;//使能 LSPCLK 到 SPI-D
SysCtrlRegs.PCLKCR0.bit.SPICENCLK = 1;//使能 LSPCLK 到 SPI-C
SysCtrlRegs.PCLKCR0.bit.I2CAENCLK = 1;// SYSCLKOUT 至 I2C 被启用
SysCtrlRegs.PCLKCR0.bit.ADCENCLK = 1; // HSPCLK 到 ADC 被启用

SysCtrlRegs.LPMCR0.all = 0x00FC;

SysCtrlRegs.XCLK.bit.XCLKOUTDIV = 2;

EDIS;

}

int main (void)
{
InitSysCtrl();
} 


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

    您好 Andrei、

    在  您的 while 环路之前、您是否已在内联写入 PLLCR 寄存器之前禁用了看门狗模块?

    还请注意、在时钟馈送到内核之前、PLLSTS[CLKINDIV]启用或旁路两分频块。 在写入 PLLCR 前、该位必须为0、并且只能在 PLLSTS[PLLOCKS]=1后置位。

    此致、

    Ozino

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我还想知道 TI 提供的 InitPll()是否适合您、或者它是否会一直等待 PLL 锁定...?

    惠特尼
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Ozino Odharo、
    在此代码中、我不会禁用 WDT、IT 服务在循环中、但我会尝试在循环之前禁用 WDT、正如您所说的那样、并获得旧结果。
    因此、在写入位于行 SysCtrlRegs.PLLCR.bit.DIV = 0x000A 的 PLLCR 之前、我还向 PLLSTS[CLKINDIV]写入0;
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的惠特尼:
    函数 InitSysCtrl()是 TI 提供的,我从 DSP280x_sysctrl.c 文件中获取它。 我 尝试使用 InitPll()函数、结果相同。 我可能需要更改 cmd 文件、您怎么看?

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

    伙计们、我找到了一个解决方案-我将 DSP280x_Headers_nonBIOS.cmd 添加到项目中

    e2e.ti.com/.../DSP280x_5F00_Headers_5F00_nonBIOS.rar