javasy 发表于 2012-5-21 21:59:54

使用C8051F时晶振不起振,请有经验的朋友赐教。

本帖最后由 javasy 于 2012-5-22 07:32 编辑

我使用的是062,在切换外部时钟时程序一直停在了检查外部晶振处(下面程序加下划线一句),换过晶振、片子、电容等,用示波器看晶振脚上确定没起振。
哪位朋友遇到过这种情况,请指点一下,谢谢!
程序如下:

#include <c8051f060.h>
/************************************/

#define Crystal_Clock 12000000
/************************************/

void SYSCLK_Init (void);
void SYSCLK_ExtOsc_Init (void);         
/************************************/

//----------------------------------------/
//内部时钟设置
void SYSCLK_Init (void)
{
OSCICN = 0x83;                     
RSTSRC = 0x04;                           // Enable missing clock detector
}

//----------------------------------------/
// 外部时钟初始化
void SYSCLK_ExtOsc_Init (void)
{
unsigned inti;

#if (Crystal_Clock <= 32000)
    #define XFCN 0   
#elif (Crystal_Clock <= 84000)
    #define XFCN 1
#elif (Crystal_Clock <= 225000)
    #define XFCN 2
#elif (Crystal_Clock <= 590000)
    #define XFCN 3
#elif (Crystal_Clock <= 1500000)
    #define XFCN 4
#elif (Crystal_Clock <= 4000000)
    #define XFCN 5
#elif (Crystal_Clock <= 10000000)
    #define XFCN 6
#elif (Crystal_Clock <= 30000000)
    #define XFCN 7
#else
    #error "Defined Crystal Frequency outside allowable range!"
    #define XFCN 0
#endif

OSCXCN = 0x60;                     
OSCXCN |= XFCN;
for (i = 13000; i > 0; i--);         // 24.5MHz, 1ms=24500 SYSCLKs DJNZ=2 SYSCLKs
while (!(OSCXCN & 0x80));
CLKSEL = 0x01;                     // 禁止内部振荡器;

return;
}


/*****************************************/
//   主 程 序
void main (void)
{
WDTCN = 0xDE;                            // Disable watchdog timer
WDTCN = 0xAD;
SYSCLK_Init();
SYSCLK_ExtOsc_Init ();
while(1);
}

Spunky 发表于 2012-5-22 00:33:48

将起荡电容改小,用15p试试

68336016 发表于 2012-5-22 00:48:00

帮顶。
我用的是060,不过是有源晶振。

javasy 发表于 2012-5-22 07:34:08

Spunky 发表于 2012-5-22 00:33 static/image/common/back.gif
将起荡电容改小,用15p试试

我已经试过了也不行,之前用的是33pF,后来改到22,15都不行。

techbaby 发表于 2012-5-22 07:59:56

//   主 程 序
void main (void)
{
WDTCN = 0xDE;                            // Disable watchdog timer
WDTCN = 0xAD;
SYSCLK_ExtOsc_Init ();
SYSCLK_Init();
while(1);
}
将时钟设置子程序更改一下位置,貌似外部时钟还未初始化时,已经开启了时钟检测功能。

techbaby 发表于 2012-5-22 08:04:11

attach://19450.rar

使用一下官方的测试程序,确认不是硬件的问题再说!

ibmx311 发表于 2012-5-22 08:25:56

我从来不相信任何单片机的启振电路,我都是在外面振完再送进去的,虽然要多花0.2元.
C8051F410就经常在-35度时不能启动

chenxujiaoyang 发表于 2012-5-22 08:45:30

我觉得应该是晶振的引脚没有焊接好,很可能虚焊了,你再检查一下

unrama 发表于 2012-5-22 09:34:54

ibmx311 发表于 2012-5-22 08:25 static/image/common/back.gif
我从来不相信任何单片机的启振电路,我都是在外面振完再送进去的,虽然要多花0.2元.
C8051F410就经常在-35度 ...

你说的是用有源的?

javasy 发表于 2012-5-22 10:36:09

官方的试过,两条语句顺序也不影响,真不知怎么回事

zyzsorry 发表于 2012-5-22 14:18:45

unrama 发表于 2012-5-22 09:34 static/image/common/back.gif
你说的是用有源的?

他得意思是,外接一个无源晶振。外接无源晶振相对而言比内部晶振要稳定和精确很多,而且并不贵。

ibmx311 发表于 2012-5-22 15:28:58

unrama 发表于 2012-5-22 09:34 static/image/common/back.gif
你说的是用有源的?

我的意思是用晶体管+晶振振好了,再送到单片机里

and001 发表于 2013-9-11 17:38:30

问题找到了吗?

javasy 发表于 2013-9-11 21:17:27

and001 发表于 2013-9-11 17:38 static/image/common/back.gif
问题找到了吗?

问题早已经解决了,是狗的问题

and001 发表于 2013-9-11 23:54:25

哦我正考虑用外部晶振,内部快钟太快了没必要,现在太耗电了10mA(平时)电池一下就没了

javasy 发表于 2013-9-12 21:24:29

and001 发表于 2013-9-11 23:54 static/image/common/back.gif
哦我正考虑用外部晶振,内部快钟太快了没必要,现在太耗电了10mA(平时)电池一下就没了 ...

你用电池供电啊?可以考虑用430单片机,功耗小,我们有一款产品上就用的430

and001 发表于 2013-9-13 00:13:26

没用的!如果就用内部快钟肯定不行

and001 发表于 2013-9-13 00:14:29

你是搞软件的就知道,如果不是可以问问你们的软件工程师!一定得用慢钟定时否则耗点一定大
页: [1]
查看完整版本: 使用C8051F时晶振不起振,请有经验的朋友赐教。