Getafreelancer
兼职编程、开发,C/C++/C#, PHP, Web开发,ASP, 外包项目, 接国外私活
Scriptlance
做兼职开发赚美金:Java, PHP, SEO, HTML/CSS/JSP AJAX, J2EE。

LPC900单片机进入ISP问题

LPC900单片机(包括P89LPC920, P89LPC921,  P89LPC922等型号)进入ISP,通常有好几种方法:

1. 用“三个脉冲”方法

2. 用串口的帧间隔检测法

3. 直接跳入法

下面是在ZLG论坛上看到的一个用户遇到的问题:

快要被ISP弄晕了。呵呵。

ZLG网站上关于ISP的资料我全看了,但还是没法进入ISP。

我用的型号是LPC921FDH, 采用内部RC时钟,外部复位信号。P0.0上有跳线,用来判断是否进入ISP。

最开始,我把新的没用过的芯片焊在板子上,这时应该上电就进入ISP,用Flash Magic验证,也是可以进入ISP的。这个没问题。

然后我就写了一个代码:

main.c如下:

void main()
{
unsigned char i, j;

/* init I/O pins */
#if (ENABLE_DEBUG || ENABLE_ISP)
/* debug or ISP mode */
P0M1 = 0xEF;
P0M2 = 0×1E;
P1M1 = 0×2E;
P1M2 = 0xDD;
P3M1 = 0×00;
P3M2 = 0xFF;
#else
/* normal mode. For final released code */
P0M1 = 0xEE;
P0M2 = 0×1F;
P1M1 = 0×2C;
P1M2 = 0xDF;
P3M1 = 0×00;
P3M2 = 0xFF;
#endif

#if ENABLE_ISP
enterISP();
#endif

P0 = 0xf1;

while(1)
{
for(i = 0; i < 240; i++)
{
for( j =0; j < 240; j++)
{
}
}
P0 ^= 0×0E;
}
}

其中有个enterISP函数,是用汇编写的,也就是ZLG资料里面的帧间隔初始化代码:

?PR?enterISP?ISP     SEGMENT CODE
PUBLIC    enterISP

RSEG  ?PR?enterISP?ISP
enterISP:
JB      P0.0,?C0002

ANL SSTAT,#0FAH     ;clear BR bit, SSTAT.2
MOV BRGCON,#00H     ;shut-off baud rate generator
ORL AUXR1,#40H      ;set EBRR bit, let UART detect ISP signal
MOV SCON,#50H       ;set UART mode = 1
MOV BRGR1,#05H      ;set UART baud rate. Fosc = 7.3728MHz, baud rate = Fosc / ((BRGR1,BRGR0)+16) = 4800
MOV BRGR0,#0F0H
MOV BRGCON,#03H     ;turn-on baud rate generator

?C0003:
SJMP     ?C0003
?C0002:
RET

这段代码的意思就是,检测P0.0的值,若为0,初始化帧间隔检测,然后死循环;否则跳出,执行正常的程序。

这里有两个问题:
1. ZLG资料里面, 设置波特率为:BRGR1 = #90H, BRGR0 = #00H, 我不知道这里的时钟是频率是多少,
如果是12MHz的话,那么波特率算出来应该是:12000000/(0×9000 + 16) = 325 bps,这个正确吗?
反正这里我是按照内部RC时钟频率为7.3728MHz,设置成4800bps

2. 初始化帧间隔检测之后应该干什么呢?我这里的处理是死循环,等着上位机发帧间隔信号来。

我把这段程序编好后,用labtool-48uxp烧进单片机,用zlgISP_900程序,无法进入ISP。显示“超时,无法进入ISP”
我确认了以下关键点是没问题的:

1. 程序是没问题的。P0.0=1时,我的用户程序能正确运行。而P0.0=0时,用户程序没有运行,肯定是进入了
帧间隔检测代码段。
2. labtool-48uxp烧写的时候,肯定没有误擦除ISP驻留代码。
3. boot vector为1F, boot status改为0, (因为要从0×0000开始运行)
4. 电路连接也是没问题的,我用示波器看了, 使用zlgISP_900的时候,LPC921 UART的RXD上能收到上位机发的信号。

============  分割线 ==============

后面我烦了,又看到可以直接调用ISP代码,即跳转到0×1F00。于是我修改了程序,把初始化帧间隔检测的代码
直接改成跳转到0×1F00,仍然不行。

可见该用户考虑到了很多因素,但是还有一条需要注意,LPC900各个型号的boot vector有所区别,比如LPC921的boot vecotr应该是0×0F,而不是其datasheet上默认的0×1F,这也许是那个用户进不了ISP的原因。

Leave a Reply




getafreelancer.com 最新5个外包兼职项目,等待您来投标!