📄 hpi.lst
字号:
265 1 /* 初始化变量 */
266 1 m_sHPIQue.ucTxPendNum = 0; /* HPI接口 */
267 1 m_sHPIQue.ucRxPendNum = 0;
268 1 m_sHPIQue.ucTxDealIndex = 0;
269 1 m_sHPIQue.ucTxPlaceIndex = 0;
270 1 m_sHPIQue.ucRxDealIndex = 0;
271 1 m_sHPIQue.ucRxPlaceIndex = 0;
272 1
273 1 m_ucHPIWatchdogTC = 0;
274 1 m_bHPIWatchdogFlag = TRUE;
275 1
276 1 return;
277 1 }
278
279
280 /********************************************************************************/
281 /* 函数名称:void TestHPI(void) */
282 /* 简要描述:/* 测试HPI口读写状况 */
283 /* */
284 /* 时 间:2002年02月21日 */
285 /********************************************************************************/
286 void TestHPI(void)
287 {
288 1 uchar data i,j,k,a;
289 1
290 1 a = 0;
291 1
292 1 for(i=0; i<4; i++)
293 1 {
294 2 WATCHDOG = ~WATCHDOG;
295 2
296 2 /* 基地址确定 */
297 2 if(i == 0)
298 2 {
299 3 m_pHPI = HPI1;
300 3 }
301 2 else if(i == 1)
302 2 {
303 3 m_pHPI = HPI2;
C51 COMPILER V3.20, SN-0 HPI 05/14/03 11:30:42 PAGE 6
304 3 }
305 2 else if(i == 2)
306 2 {
307 3 m_pHPI = HPI3;
308 3 }
309 2 else if(i == 3)
310 2 {
311 3 m_pHPI = HPI4;
312 3 }
313 2
314 2 /* 设置HPI写区间和长度 */
315 2 m_uiHPIAREA = HPITEST;
316 2 m_ucHPILEN = BUFSIZE;
317 2
318 2 for(j=0;j<BUFSIZE;j++)
319 2 {
320 3 HPITxVar[j] = j+0x70;
321 3 HPIRxVar[j] = 0;
322 3 }
323 2
324 2 /* 写数据 */
325 2 SendFrameHPI();
326 2
327 2 /* 延时 */
328 2 for(j=0;j<0xf0;j++)
329 2 for(k=0;k<0xf0;k++);
330 2
331 2
332 2 /* 读数据 */
333 2 m_uiHPIAREA = HPITEST+1;
334 2 ReadFrameHPI();
335 2
336 2 /* 比较 */
337 2 for(j=0;j<BUFSIZE;j++)
338 2 {
339 3 if( HPIRxVar[j]!=(j+0x70) )
340 3 {
341 4 a = 1;
342 4 }
343 3 }
344 2
345 2 /* 根据结果置标志 */
346 2 if(a==1)
347 2 {
348 3 m_bHPITestFlag = WRONG;
349 3 }
350 2 else
351 2 {
352 3 m_bHPITestFlag = RIGHT;
353 3 }
354 2 }
355 1
356 1 return;
357 1 }
358
359
360 /********************************************************************************/
361 /* 函数名称:void CheckDSP(void) */
362 /* 简要描述:查询DSP是否死机 */
363 /* */
364 /* 时 间:2000年11月04日 */
365 /********************************************************************************/
C51 COMPILER V3.20, SN-0 HPI 05/14/03 11:30:42 PAGE 7
366 void CheckDSP(void)
367 {
368 1 uchar data i;
369 1
370 1 /* 依次检查4片DSP运行状态 */
371 1
372 1 for(i=0; i<4; i++)
373 1 {
374 2 WATCHDOG = ~WATCHDOG;
375 2
376 2 /* 基地址确定 */
377 2 if(i == 0)
378 2 {
379 3 m_pHPI = HPI1;
380 3 }
381 2 else if(i == 1)
382 2 {
383 3 m_pHPI = HPI2;
384 3 }
385 2 else if(i == 2)
386 2 {
387 3 m_pHPI = HPI3;
388 3 }
389 2 else if(i == 3)
390 2 {
391 3 m_pHPI = HPI4;
392 3 }
393 2
394 2
395 2 /* 设置HPI读写区间和长度 */
396 2 m_uiHPIAREA = DSPSTATUS;
397 2 m_ucHPILEN = 1;
398 2
399 2 /* 读DSPSTATUS状态字 */
400 2 ReadFrameHPI();
401 2
402 2 /* 判断DSP是否死机 */
403 2 if(HPIRxVar[0] != 0x55)
404 2 {
405 3 m_bHPIWatchdogFlag = FALSE;
406 3 /* 复位 */
407 3 *(RESET+i) = 0x0; /* b0写入0 */
408 3 }
409 2
410 2 /* 设置HPI读写区间和长度 */
411 2 HPITxVar[0] = 0;
412 2 m_uiHPIAREA = DSPSTATUS;
413 2 m_ucHPILEN = 1;
414 2
415 2 /* 复位DSPSTATUS状态字 */
416 2 SendFrameHPI();
417 2 }
418 1
419 1 if(m_bHPIWatchdogFlag == FALSE)
420 1 {
421 2 m_ucHPIWatchdogTC++;
422 2
423 2 if(m_ucHPIWatchdogTC>2)
424 2 {
425 3 m_ucHPIWatchdogTC = 0;
426 3 m_bHPIWatchdogFlag = TRUE;
427 3
C51 COMPILER V3.20, SN-0 HPI 05/14/03 11:30:42 PAGE 8
428 3 /* 清复位 */
429 3 *(RESET+0) = 0x01; /* b0写入1 */
430 3 *(RESET+1) = 0x01; /* b0写入1 */
431 3 *(RESET+2) = 0x01; /* b0写入1 */
432 3 *(RESET+3) = 0x01; /* b0写入1 */
433 3 }
434 2 }
435 1 else
436 1 {
437 2 m_ucHPIWatchdogTC = 0;
438 2 }
439 1
440 1 return;
441 1 }
442
443
444 /********************************************************************************/
445 /* 函数名称:void SendFrameHPI(void) */
446 /* 简要描述:通过HPI向各DSP转发命令 */
447 /* */
448 /* 时 间:2002年02月21日 */
449 /********************************************************************************/
450 void SendFrameHPI(void)
451 {
452 1 uchar data i;
453 1
454 1 /* 关中断 */
455 1 EX1 = 0;
456 1
457 1 *(m_pHPI+WRITE+HPIC+BYTE1) = 0x00; /* 写HPIC第1字节为0,BOB=0 */
458 1 *(m_pHPI+WRITE+HPIC+BYTE2) = 0x00; /* 写HPIC第2字节为0,BOB=0 */
459 1 *(m_pHPI+WRITE+HPIA+BYTE1) = (m_uiHPIAREA>>8)&0xff; /* 写HPIA第1字节为写区首地址*/ /* 高字节 */
460 1 *(m_pHPI+WRITE+HPIA+BYTE2) = m_uiHPIAREA&0xff;; /* 写HPIA第2字节为写区首地址*/ /* 低字节 */
461 1
462 1 /* 写有效字节 */
463 1 for(i=0; i<=m_ucHPILEN; i++)
464 1 {
465 2 *(m_pHPI+WRITE+HPIDAI+BYTE1) = 0x0;
466 2 *(m_pHPI+WRITE+HPIDAI+BYTE2) = HPITxVar[i];
467 2 }
468 1
469 1 /* 开中断 */
470 1 EX1 = 1;
471 1
472 1 return;
473 1 }
474
475
476 /********************************************************************************/
477 /* 函数名称:void SetDSPINT(void) */
478 /* 简要描述:通过HPI向各DSP发中断通知 */
479 /* */
480 /* 时 间:2002年02月21日 */
481 /********************************************************************************/
482 void SetDSPINT(void)
483 {
484 1 /* 关中断 */
485 1 EX1 = 0;
486 1
487 1 /* 发中断通知C549 */
488 1 *(m_pHPI+WRITE+HPIC+BYTE1) = 0x04; /* 写HPIC第1字节为0,DSPINT=1 */
489 1 *(m_pHPI+WRITE+HPIC+BYTE2) = 0x04; /* 写HPIC第2字节为0,DSPINT=1 */
C51 COMPILER V3.20, SN-0 HPI 05/14/03 11:30:42 PAGE 9
490 1
491 1 /* 开中断 */
492 1 EX1 = 1;
493 1
494 1 return;
495 1 }
496
497 /********************************************************************************/
498 /* 函数名称:void ReadFrameHPI(void) */
499 /* 简要描述:通过HPI读取DSP消息帧 */
500 /* */
501 /* 时 间:2002年02月21日 */
502 /********************************************************************************/
503 void ReadFrameHPI(void)
504 {
505 1 uchar data temp1,i;
506 1
507 1 EX1 = 0; /* 关中断防止读出错 */
508 1
509 1 *(m_pHPI+WRITE+HPIC+BYTE1) = 0x00; /* 写HPIC第1字节为0,BOB=0 */
510 1 *(m_pHPI+WRITE+HPIC+BYTE2) = 0x00; /* 写HPIC第2字节为0,BOB=0 */
511 1 *(m_pHPI+WRITE+HPIA+BYTE1) = (m_uiHPIAREA>>8)&0xff; /* 写HPIA第1字节为写区首地址 */ /* 高字节 *
-/
512 1 *(m_pHPI+WRITE+HPIA+BYTE2) = m_uiHPIAREA&0xff;; /* 写HPIA第2字节为写区首地址 */ /* 低字节 */
513 1
514 1 /* 读有效字节 */
515 1 for(i=0; i<=m_ucHPILEN; i++)
516 1 {
517 2 temp1 = *(m_pHPI+READ+HPIDAI+BYTE1);
518 2 HPIRxVar[i] = *(m_pHPI+READ+HPIDAI+BYTE2);
519 2 }
520 1
521 1 EX1 = 1; /* 重开中断 */
522 1
523 1 return;
524 1 }
525
526
527 /********************************************************************************/
528 /* 函数名称:void xint1(void) */
529 /* 简要描述:HPI接口外部中断1服务程序 */
530 /* */
531 /* 时 间:2000年11月04日 */
532 /********************************************************************************/
533 void xint1(void) interrupt 2 using 3 /* use registerbank 3 for interrupt */
534 {
535 1 uchar data temp1,temp2,temp3,temp4;
536 1 uchar data i,j;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -