TI中文支持网
TI专业的中文技术问题搜集分享网站

TMS320F28069使用外部时钟出现问题

TMS320F28069使用内部振荡或者使用外部晶体工作均正常,使用外部时钟输入出现问题,具体情况如下:

硬件连接:X1——接地;X2——悬空,有源晶振产生的时钟从GPIO19或GPIO38输入。

软件设置如下:InitSysCtrl();中采用ExtOscSel()

// IntOsc1Sel();
ExtOscSel();
//XtalOscSel ();

其中ExtOscSel()代码如下:

void ExtOscSel (void) {
EALLOW;
SysCtrlRegs.XCLK.bit.XCLKINSEL = 1; // 1-GPIO19 = XCLKIN, 0-GPIO38 = XCLKIN
SysCtrlRegs.CLKCTL.bit.XTALOSCOFF = 1; // Turn on XTALOSC
SysCtrlRegs.CLKCTL.bit.XCLKINOFF = 0; // Turn on XCLKIN
SysCtrlRegs.CLKCTL.bit.OSCCLKSRC2SEL = 0; // Switch to external clock
SysCtrlRegs.CLKCTL.bit.OSCCLKSRCSEL = 1; // Switch from INTOSC1 to INTOSC2/ext clk
SysCtrlRegs.CLKCTL.bit.WDCLKSRCSEL = 1; // Switch Watchdog Clk Src to external clock
SysCtrlRegs.CLKCTL.bit.INTOSC2OFF = 1; // Turn off INTOSC2
SysCtrlRegs.CLKCTL.bit.INTOSC1OFF = 1; // Turn off INTOSC1
EDIS;
}

现在的问题是:如果时钟从GPIO38接入,工作正常,但是从GPIO19接入,就不能工作。当然,以上ExtOscSel()函数中SysCtrlRegs.XCLK.bit.XCLKINSEL都做好了相应的设置。

更为奇怪的是:如果时钟从GPIO38接入,无论SysCtrlRegs.XCLK.bit.XCLKINSEL设置为0或者1,都可以正常工作;而如果时钟从GPIO19接入,无论SysCtrlRegs.XCLK.bit.XCLKINSEL怎么设置,都不能正常工作。仿佛这个设置从来就没有起作用!?

从手册上看,28069默认的外部时钟输入口是GPIO38,如果使用GPIO38就会和JTAG时钟冲突,怎么把它切换到GPIO19呢?除了上述的SysCtrlRegs.XCLK.bit.XCLKINSEL设置以外,是否还需要其他的硬件或软件设置。

谢谢大家!

Eric Ma:

Hi Jie,

目前没有发现过有GPIO19不能作为外部时钟引脚的问题。

我想问Jie是如何判断GPIO19不能用的。

时钟切换到GPIO19后,失败,那应该会有时钟丢失的情况,那么芯片会复位,并进入下面的代码

void InitPll(Uint16 val, Uint16 divsel){ volatile Uint16 iVol;

// Make sure the PLL is not running in limp mode if (SysCtrlRegs.PLLSTS.bit.MCLKSTS != 0) { EALLOW; // OSCCLKSRC1 failure detected. PLL running in limp mode. // Re-enable missing clock logic. SysCtrlRegs.PLLSTS.bit.MCLKCLR = 1; EDIS; // Replace this line with a call to an appropriate // SystemShutdown(); function. __asm(" ESTOP0"); // Uncomment for debugging purposes }

Eric

TMS320F28069使用内部振荡或者使用外部晶体工作均正常,使用外部时钟输入出现问题,具体情况如下:

硬件连接:X1——接地;X2——悬空,有源晶振产生的时钟从GPIO19或GPIO38输入。

软件设置如下:InitSysCtrl();中采用ExtOscSel()

// IntOsc1Sel();
ExtOscSel();
//XtalOscSel ();

其中ExtOscSel()代码如下:

void ExtOscSel (void) {
EALLOW;
SysCtrlRegs.XCLK.bit.XCLKINSEL = 1; // 1-GPIO19 = XCLKIN, 0-GPIO38 = XCLKIN
SysCtrlRegs.CLKCTL.bit.XTALOSCOFF = 1; // Turn on XTALOSC
SysCtrlRegs.CLKCTL.bit.XCLKINOFF = 0; // Turn on XCLKIN
SysCtrlRegs.CLKCTL.bit.OSCCLKSRC2SEL = 0; // Switch to external clock
SysCtrlRegs.CLKCTL.bit.OSCCLKSRCSEL = 1; // Switch from INTOSC1 to INTOSC2/ext clk
SysCtrlRegs.CLKCTL.bit.WDCLKSRCSEL = 1; // Switch Watchdog Clk Src to external clock
SysCtrlRegs.CLKCTL.bit.INTOSC2OFF = 1; // Turn off INTOSC2
SysCtrlRegs.CLKCTL.bit.INTOSC1OFF = 1; // Turn off INTOSC1
EDIS;
}

现在的问题是:如果时钟从GPIO38接入,工作正常,但是从GPIO19接入,就不能工作。当然,以上ExtOscSel()函数中SysCtrlRegs.XCLK.bit.XCLKINSEL都做好了相应的设置。

更为奇怪的是:如果时钟从GPIO38接入,无论SysCtrlRegs.XCLK.bit.XCLKINSEL设置为0或者1,都可以正常工作;而如果时钟从GPIO19接入,无论SysCtrlRegs.XCLK.bit.XCLKINSEL怎么设置,都不能正常工作。仿佛这个设置从来就没有起作用!?

从手册上看,28069默认的外部时钟输入口是GPIO38,如果使用GPIO38就会和JTAG时钟冲突,怎么把它切换到GPIO19呢?除了上述的SysCtrlRegs.XCLK.bit.XCLKINSEL设置以外,是否还需要其他的硬件或软件设置。

谢谢大家!

Jie Hu2:

回复 Eric Ma:

目前情况是这样的:

我事先将程序通过JTAG烧录到DSP。

当把时钟线连到GPIO19,开机没有任何反应。

当把时钟线连到GPIO38,开机即正常运行。而且,即便是SysCtrlRegs.XCLK.bit.XCLKINSEL = 1; // 1-GPIO19 = XCLKIN, 0-GPIO38 = XCLKIN,仍然可以正常运行,所以我判断是这切换时钟线的话根本没有起作用。为了避免意外失误,我用了两块板子做实验,情况完全一致。可是GPIO38是JTAG的TCK引脚,不太适合当外部时钟使用。请问:

外部时钟输入线默认为GPIO38,要切换到GPIO19除了上述的这行代码,还需要其他的软件或者硬件设置吗?

项目需要,急待解决,谢谢各位!

TMS320F28069使用内部振荡或者使用外部晶体工作均正常,使用外部时钟输入出现问题,具体情况如下:

硬件连接:X1——接地;X2——悬空,有源晶振产生的时钟从GPIO19或GPIO38输入。

软件设置如下:InitSysCtrl();中采用ExtOscSel()

// IntOsc1Sel();
ExtOscSel();
//XtalOscSel ();

其中ExtOscSel()代码如下:

void ExtOscSel (void) {
EALLOW;
SysCtrlRegs.XCLK.bit.XCLKINSEL = 1; // 1-GPIO19 = XCLKIN, 0-GPIO38 = XCLKIN
SysCtrlRegs.CLKCTL.bit.XTALOSCOFF = 1; // Turn on XTALOSC
SysCtrlRegs.CLKCTL.bit.XCLKINOFF = 0; // Turn on XCLKIN
SysCtrlRegs.CLKCTL.bit.OSCCLKSRC2SEL = 0; // Switch to external clock
SysCtrlRegs.CLKCTL.bit.OSCCLKSRCSEL = 1; // Switch from INTOSC1 to INTOSC2/ext clk
SysCtrlRegs.CLKCTL.bit.WDCLKSRCSEL = 1; // Switch Watchdog Clk Src to external clock
SysCtrlRegs.CLKCTL.bit.INTOSC2OFF = 1; // Turn off INTOSC2
SysCtrlRegs.CLKCTL.bit.INTOSC1OFF = 1; // Turn off INTOSC1
EDIS;
}

现在的问题是:如果时钟从GPIO38接入,工作正常,但是从GPIO19接入,就不能工作。当然,以上ExtOscSel()函数中SysCtrlRegs.XCLK.bit.XCLKINSEL都做好了相应的设置。

更为奇怪的是:如果时钟从GPIO38接入,无论SysCtrlRegs.XCLK.bit.XCLKINSEL设置为0或者1,都可以正常工作;而如果时钟从GPIO19接入,无论SysCtrlRegs.XCLK.bit.XCLKINSEL怎么设置,都不能正常工作。仿佛这个设置从来就没有起作用!?

从手册上看,28069默认的外部时钟输入口是GPIO38,如果使用GPIO38就会和JTAG时钟冲突,怎么把它切换到GPIO19呢?除了上述的SysCtrlRegs.XCLK.bit.XCLKINSEL设置以外,是否还需要其他的硬件或软件设置。

谢谢大家!

Jie Hu2:

回复 Eric Ma:

附件是JTAG连接图,请帮助看看是否有问题。

TMS320F28069使用内部振荡或者使用外部晶体工作均正常,使用外部时钟输入出现问题,具体情况如下:

硬件连接:X1——接地;X2——悬空,有源晶振产生的时钟从GPIO19或GPIO38输入。

软件设置如下:InitSysCtrl();中采用ExtOscSel()

// IntOsc1Sel();
ExtOscSel();
//XtalOscSel ();

其中ExtOscSel()代码如下:

void ExtOscSel (void) {
EALLOW;
SysCtrlRegs.XCLK.bit.XCLKINSEL = 1; // 1-GPIO19 = XCLKIN, 0-GPIO38 = XCLKIN
SysCtrlRegs.CLKCTL.bit.XTALOSCOFF = 1; // Turn on XTALOSC
SysCtrlRegs.CLKCTL.bit.XCLKINOFF = 0; // Turn on XCLKIN
SysCtrlRegs.CLKCTL.bit.OSCCLKSRC2SEL = 0; // Switch to external clock
SysCtrlRegs.CLKCTL.bit.OSCCLKSRCSEL = 1; // Switch from INTOSC1 to INTOSC2/ext clk
SysCtrlRegs.CLKCTL.bit.WDCLKSRCSEL = 1; // Switch Watchdog Clk Src to external clock
SysCtrlRegs.CLKCTL.bit.INTOSC2OFF = 1; // Turn off INTOSC2
SysCtrlRegs.CLKCTL.bit.INTOSC1OFF = 1; // Turn off INTOSC1
EDIS;
}

现在的问题是:如果时钟从GPIO38接入,工作正常,但是从GPIO19接入,就不能工作。当然,以上ExtOscSel()函数中SysCtrlRegs.XCLK.bit.XCLKINSEL都做好了相应的设置。

更为奇怪的是:如果时钟从GPIO38接入,无论SysCtrlRegs.XCLK.bit.XCLKINSEL设置为0或者1,都可以正常工作;而如果时钟从GPIO19接入,无论SysCtrlRegs.XCLK.bit.XCLKINSEL怎么设置,都不能正常工作。仿佛这个设置从来就没有起作用!?

从手册上看,28069默认的外部时钟输入口是GPIO38,如果使用GPIO38就会和JTAG时钟冲突,怎么把它切换到GPIO19呢?除了上述的SysCtrlRegs.XCLK.bit.XCLKINSEL设置以外,是否还需要其他的硬件或软件设置。

谢谢大家!

Eric Ma:

回复 Jie Hu2:

Jie,

JTAG没什么问题。

1. 如果是用GPIO38,对你工程仿真造成什么样的影响?

2. 如果是用GPIO19失效,我建议是要带仿真器调试一下,看一下是什么问题,是否是真的出现时钟失效?

Eric 

TMS320F28069使用内部振荡或者使用外部晶体工作均正常,使用外部时钟输入出现问题,具体情况如下:

硬件连接:X1——接地;X2——悬空,有源晶振产生的时钟从GPIO19或GPIO38输入。

软件设置如下:InitSysCtrl();中采用ExtOscSel()

// IntOsc1Sel();
ExtOscSel();
//XtalOscSel ();

其中ExtOscSel()代码如下:

void ExtOscSel (void) {
EALLOW;
SysCtrlRegs.XCLK.bit.XCLKINSEL = 1; // 1-GPIO19 = XCLKIN, 0-GPIO38 = XCLKIN
SysCtrlRegs.CLKCTL.bit.XTALOSCOFF = 1; // Turn on XTALOSC
SysCtrlRegs.CLKCTL.bit.XCLKINOFF = 0; // Turn on XCLKIN
SysCtrlRegs.CLKCTL.bit.OSCCLKSRC2SEL = 0; // Switch to external clock
SysCtrlRegs.CLKCTL.bit.OSCCLKSRCSEL = 1; // Switch from INTOSC1 to INTOSC2/ext clk
SysCtrlRegs.CLKCTL.bit.WDCLKSRCSEL = 1; // Switch Watchdog Clk Src to external clock
SysCtrlRegs.CLKCTL.bit.INTOSC2OFF = 1; // Turn off INTOSC2
SysCtrlRegs.CLKCTL.bit.INTOSC1OFF = 1; // Turn off INTOSC1
EDIS;
}

现在的问题是:如果时钟从GPIO38接入,工作正常,但是从GPIO19接入,就不能工作。当然,以上ExtOscSel()函数中SysCtrlRegs.XCLK.bit.XCLKINSEL都做好了相应的设置。

更为奇怪的是:如果时钟从GPIO38接入,无论SysCtrlRegs.XCLK.bit.XCLKINSEL设置为0或者1,都可以正常工作;而如果时钟从GPIO19接入,无论SysCtrlRegs.XCLK.bit.XCLKINSEL怎么设置,都不能正常工作。仿佛这个设置从来就没有起作用!?

从手册上看,28069默认的外部时钟输入口是GPIO38,如果使用GPIO38就会和JTAG时钟冲突,怎么把它切换到GPIO19呢?除了上述的SysCtrlRegs.XCLK.bit.XCLKINSEL设置以外,是否还需要其他的硬件或软件设置。

谢谢大家!

Jie Hu2:

回复 Eric Ma:

谢谢您的答复。

按照手册上的描述,如果用GPIO38,会和仿真时钟TCK造成时钟竞争。

接GPIO19带仿真器运行时是正常的,大概是因为此时使用的是仿真器提供的时钟,但是停止仿真后系统就不运行了。

InitPll函数内容如下:单步仿真运行过程正常,不会进入您上文讲到的丢失时钟的选项。void InitPll(Uint16 val, Uint16 divsel){ volatile Uint16 iVol;

// Make sure the PLL is not running in limp mode if (SysCtrlRegs.PLLSTS.bit.MCLKSTS != 0) { EALLOW; // OSCCLKSRC1 failure detected. PLL running in limp mode. // Re-enable missing clock logic. SysCtrlRegs.PLLSTS.bit.MCLKCLR = 1; EDIS; // Replace this line with a call to an appropriate // SystemShutdown(); function. asm(" ESTOP0"); // Uncomment for debugging purposes }

// DIVSEL MUST be 0 before PLLCR can be changed from // 0x0000. It is set to 0 by an external reset XRSn // This puts us in 1/4 if (SysCtrlRegs.PLLSTS.bit.DIVSEL != 0) { EALLOW; SysCtrlRegs.PLLSTS.bit.DIVSEL = 0; EDIS; }

// Change the PLLCR if (SysCtrlRegs.PLLCR.bit.DIV != val) {

EALLOW; // Before setting PLLCR turn off missing clock detect logic SysCtrlRegs.PLLSTS.bit.MCLKOFF = 1; SysCtrlRegs.PLLCR.bit.DIV = val; EDIS;

// Optional: Wait for PLL to lock. // During this time the CPU will switch to OSCCLK/2 until // the PLL is stable. Once the PLL is stable the CPU will // switch to the new PLL value. // // This time-to-lock is monitored by a PLL lock counter. // // Code is not required to sit and wait for the PLL to lock. // However, if the code does anything that is timing critical, // and requires the correct clock be locked, then it is best to // wait until this switching has completed.

// Wait for the PLL lock bit to be set.

// The watchdog should be disabled before this loop, or fed within // the loop via ServiceDog().

// Uncomment to disable the watchdog DisableDog();

while(SysCtrlRegs.PLLSTS.bit.PLLLOCKS != 1) { // Uncomment to service the watchdog // ServiceDog(); }

EALLOW; SysCtrlRegs.PLLSTS.bit.MCLKOFF = 0; EDIS; }

// If switching to 1/2 if((divsel == 1)||(divsel == 2)) { EALLOW; SysCtrlRegs.PLLSTS.bit.DIVSEL = divsel; EDIS; }

// If switching to 1/1 // * First go to 1/2 and let the power settle // The time required will depend on the system, this is only an example // * Then switch to 1/1 if(divsel == 3) { EALLOW; SysCtrlRegs.PLLSTS.bit.DIVSEL = 2; DELAY_US(50L); SysCtrlRegs.PLLSTS.bit.DIVSEL = 3; EDIS; }}

TMS320F28069使用内部振荡或者使用外部晶体工作均正常,使用外部时钟输入出现问题,具体情况如下:

硬件连接:X1——接地;X2——悬空,有源晶振产生的时钟从GPIO19或GPIO38输入。

软件设置如下:InitSysCtrl();中采用ExtOscSel()

// IntOsc1Sel();
ExtOscSel();
//XtalOscSel ();

其中ExtOscSel()代码如下:

void ExtOscSel (void) {
EALLOW;
SysCtrlRegs.XCLK.bit.XCLKINSEL = 1; // 1-GPIO19 = XCLKIN, 0-GPIO38 = XCLKIN
SysCtrlRegs.CLKCTL.bit.XTALOSCOFF = 1; // Turn on XTALOSC
SysCtrlRegs.CLKCTL.bit.XCLKINOFF = 0; // Turn on XCLKIN
SysCtrlRegs.CLKCTL.bit.OSCCLKSRC2SEL = 0; // Switch to external clock
SysCtrlRegs.CLKCTL.bit.OSCCLKSRCSEL = 1; // Switch from INTOSC1 to INTOSC2/ext clk
SysCtrlRegs.CLKCTL.bit.WDCLKSRCSEL = 1; // Switch Watchdog Clk Src to external clock
SysCtrlRegs.CLKCTL.bit.INTOSC2OFF = 1; // Turn off INTOSC2
SysCtrlRegs.CLKCTL.bit.INTOSC1OFF = 1; // Turn off INTOSC1
EDIS;
}

现在的问题是:如果时钟从GPIO38接入,工作正常,但是从GPIO19接入,就不能工作。当然,以上ExtOscSel()函数中SysCtrlRegs.XCLK.bit.XCLKINSEL都做好了相应的设置。

更为奇怪的是:如果时钟从GPIO38接入,无论SysCtrlRegs.XCLK.bit.XCLKINSEL设置为0或者1,都可以正常工作;而如果时钟从GPIO19接入,无论SysCtrlRegs.XCLK.bit.XCLKINSEL怎么设置,都不能正常工作。仿佛这个设置从来就没有起作用!?

从手册上看,28069默认的外部时钟输入口是GPIO38,如果使用GPIO38就会和JTAG时钟冲突,怎么把它切换到GPIO19呢?除了上述的SysCtrlRegs.XCLK.bit.XCLKINSEL设置以外,是否还需要其他的硬件或软件设置。

谢谢大家!

yanhui fu:

jie hu2 你好

我28069设置外部时钟输入是这样的。

首先硬件和你设置的一样X1——接地;X2——悬空。

软件我只实验过使用外部有源时钟源输入到GPIO19时钟和使用内部时钟源的情况。使用内部时钟源既然你能用,我就不多说了,说说我使用外部时钟源的情况,我是这么设置的,

//—————————————————————————

// Example: ExtOscSel:

//—————————————————————————

// This function switches to External oscillator and turns off all other clock // sources to minimize power consumption.

void ExtOscSel (void) 

{     

EALLOW;     

SysCtrlRegs.XCLK.bit.XCLKINSEL = 1;             // 1-GPIO19 = XCLKIN, 0-GPIO38 = XCLKIN     

SysCtrlRegs.CLKCTL.bit.XTALOSCOFF = 1;    // Turn on XTALOSC     

SysCtrlRegs.CLKCTL.bit.XCLKINOFF = 0;        // Turn on XCLKIN     

SysCtrlRegs.CLKCTL.bit.OSCCLKSRC2SEL = 0; // Switch to external clock     

SysCtrlRegs.CLKCTL.bit.OSCCLKSRCSEL = 1;  // Switch from INTOSC1 to INTOSC2/ext clk     

SysCtrlRegs.CLKCTL.bit.WDCLKSRCSEL = 0;    // Clock Watchdog off of INTOSC1 always     

SysCtrlRegs.CLKCTL.bit.INTOSC2OFF = 1;        // Turn off INTOSC2     

SysCtrlRegs.CLKCTL.bit.INTOSC1OFF = 0;        // Leave INTOSC1 on     

EDIS;

}

黄色背景颜色是咱俩不同的地方,我是按TI提供源程序做的,我想你是修改了这两行,我当时没有考虑看门狗这块,你不妨修改后试试,我这块没有仔细研究。如果还不行,咱有空再细细研究这一块。

TMS320F28069使用内部振荡或者使用外部晶体工作均正常,使用外部时钟输入出现问题,具体情况如下:

硬件连接:X1——接地;X2——悬空,有源晶振产生的时钟从GPIO19或GPIO38输入。

软件设置如下:InitSysCtrl();中采用ExtOscSel()

// IntOsc1Sel();
ExtOscSel();
//XtalOscSel ();

其中ExtOscSel()代码如下:

void ExtOscSel (void) {
EALLOW;
SysCtrlRegs.XCLK.bit.XCLKINSEL = 1; // 1-GPIO19 = XCLKIN, 0-GPIO38 = XCLKIN
SysCtrlRegs.CLKCTL.bit.XTALOSCOFF = 1; // Turn on XTALOSC
SysCtrlRegs.CLKCTL.bit.XCLKINOFF = 0; // Turn on XCLKIN
SysCtrlRegs.CLKCTL.bit.OSCCLKSRC2SEL = 0; // Switch to external clock
SysCtrlRegs.CLKCTL.bit.OSCCLKSRCSEL = 1; // Switch from INTOSC1 to INTOSC2/ext clk
SysCtrlRegs.CLKCTL.bit.WDCLKSRCSEL = 1; // Switch Watchdog Clk Src to external clock
SysCtrlRegs.CLKCTL.bit.INTOSC2OFF = 1; // Turn off INTOSC2
SysCtrlRegs.CLKCTL.bit.INTOSC1OFF = 1; // Turn off INTOSC1
EDIS;
}

现在的问题是:如果时钟从GPIO38接入,工作正常,但是从GPIO19接入,就不能工作。当然,以上ExtOscSel()函数中SysCtrlRegs.XCLK.bit.XCLKINSEL都做好了相应的设置。

更为奇怪的是:如果时钟从GPIO38接入,无论SysCtrlRegs.XCLK.bit.XCLKINSEL设置为0或者1,都可以正常工作;而如果时钟从GPIO19接入,无论SysCtrlRegs.XCLK.bit.XCLKINSEL怎么设置,都不能正常工作。仿佛这个设置从来就没有起作用!?

从手册上看,28069默认的外部时钟输入口是GPIO38,如果使用GPIO38就会和JTAG时钟冲突,怎么把它切换到GPIO19呢?除了上述的SysCtrlRegs.XCLK.bit.XCLKINSEL设置以外,是否还需要其他的硬件或软件设置。

谢谢大家!

jim lee1:

本人遇到同样问题, 你的设置没有问题,但是你必须保证后面初始化GPIO的时候,一定不能,配置GPIO19,我的最后解决就是,初始化GPIO时,不初始化,GPIO19,结果就正确了,

赞(0)
未经允许不得转载:TI中文支持网 » TMS320F28069使用外部时钟出现问题
分享到: 更多 (0)