打印

单片机与DSP(HPI口)通信问题 (内含程序)

[复制链接]
1997|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
qxxqxq|  楼主 | 2007-4-30 11:08 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#include<at89x52.h>

#define   HCNTL1      P2_4
#define   HCNTL0      P2_5
#define   HBIL        P2_6    //字节识别信号:控制读写数据是属于16位字的第1还是第2字节
#define   HRW         P2_7    //读写控制选通信号
#define   HDS1        P3_6
#define   HDS2        P3_7
#define   HCS         P2_1
#define   HRDY        P2_2

void delay(void)              //延时函数
{
  int i;
  for(i=0;i<1500;i++);
}


void icdriver(void)           //IC驱动
{
  HDS2=1;
  HDS1=1;
  _nop();

  HDS2=0;
  HDS1=0;
  _nop();

}

void main(void)
{
  int x,y;
  P1_7=0;   //上电时LED指示灯点亮
  HCS=0;    //片选信号(HPI的使能输入端,每次寻址期间必须为0)

/*********************设置HPIC:  16bit的HPI控制寄存器*************************/



  HCNTL1=0;
  HCNTL0=0;     //主机可以读写HPIC
   HRW=0;       //表示主机要写HPI

  HBIL=0;       //DSP认为主机传送过来的是第1个字节
  P0=0;

  icdriver();
  
  

  HBIL=1;      //DSP认为主机传送过来的是第2个字节
  P0=0x00;
  icdriver();   //HPIC=0x0000;BOB=0:第一个字节为高字节


/****************************选通HPIA****************************************/
  HCNTL1=0;
  HCNTL0=1;
  HBIL=0;         //设置传送来的数据是第1个字节
  HRW=0;         //对HPI进行写操作

  P0=0x00;
  icdriver();

  HBIL=1;
  P0=0x55;
  icdriver();      //准备读地址为0x1055的数据
  while(HRDY==0)   // 判断DSP内部传输是否完成
  {};

 /****************************选通HPID并读数据*******************************/
  HCNTL1=1;
  HCNTL0=1;
  HBIL=0;
  HRW=1;


 //读高八位:

  icdriver();
  x=P0;
  x=x<<8;
  HBIL=1;
  HRW=1;

 //读低八位:

  icdriver();
  y=P0;
  y=0x00ff&y;
  x=x|y;

 //判断x
  if(x==0xaaaa)
    P1_7=1;
  else
    P1_7=0;

/************************************************************************/
}

以上为单片机的程序
单片机:C51
DSP:5402
问题是:往HPIC写东西写不进去,不管是主机写,还是DSP写
       大家帮帮忙,看看程序哪些需要改进?

相关帖子

沙发
shao_hx| | 2007-5-17 19:45 | 只看该作者

1

太多高手,不屑回答,小弟我是不会了!!!!

使用特权

评论回复
板凳
wowow| | 2007-5-18 08:53 | 只看该作者

原来做的,看对你有没有用

很久以前搞过,忘得差不多了,幸好当时记了笔记:
=========
发现必须从MCU清HINT 
DSP上电时HPIC是0088,HINT是低电平
从DSP写0到HPIC无效
主板写08到HPIC,从CCS查HPIC是0080。HINT变为高电平。
=========

MCU的代码供参考:
;从串口接收地址(16bit)和长度(8bit),读相应内存的内容发送到串口 
;p0.0-p0.7 ===== HD0-HD7
;P2.0      ===== HCNTL0
;P2.1      ===== HCNTL1
;P2.2      ===== HBIL
;P2.4      ===== HPIR/W
;P2.7      ===== HCS
;write     ===== HDS2
;read      ===== HDS1
;ALE       ===== HAS
;HINT       ===== INT0
    ORG     0000H
    AJMP     MAIN
    ORG    0003H    ;INT0中断子程序
    RETI
    ORG     0030H
MAIN:
;设置串口
    MOV     SCON,#50H    ;SCON: mode 1, 8-bit UART, enable rcvr
    MOV     TMOD,#20H    ;TMOD: timer 1, mode 2, 8-bit reload
    MOV     TH1,#0FDH    ;TH1:  reload value for 9600 baud @ 11.0592MHz
    MOV     TL1,#0FDH    
    SETB     TR1        ;timer 1 run

;初始化BOB、清HINT
        MOV       A,#08h
        MOV       DPTR,#0000h
        MOVX      @DPTR,A
        MOV        DPTR,#0400h
        MOVX       @DPTR,A

SetAddress:
;从串口读高地址位
        CLR     TI
    JNB     RI,$
    MOV     A,SBUF    
    CLR     RI
;写HPIA高地址
        MOV    DPTR,#0200h
        MOVX   @DPTR,A
;从串口读低地址位
    JNB     RI,$
    MOV     A,SBUF    
    CLR     RI
;写HPIA低地址
        MOV    DPTR,#0600h
        MOVX   @DPTR,A
;从串口读数据长度
    JNB     RI,$
    MOV     A,SBUF    
    CLR     RI
    MOV    R1,A

;读DSP内部存贮区并发送到串口
ReadHPI:
;读高字节并发送
        MOV        DPTR,#1100h
        MOVX       A,@DPTR
    MOV     SBUF,A
    JNB     TI,$
    CLR     TI
;读低字节并发送
        MOV        DPTR,#1500h               
        MOVX       A,@DPTR
    MOV     SBUF,A
    JNB     TI,$
    CLR     TI
    DJNZ    R1,ReadHPI    
;再次取地址
    AJMP SetAddress

    End

使用特权

评论回复
地板
dreambird| | 2007-5-19 00:10 | 只看该作者

好像是在上升沿锁控制信号,试试下面

void icdriver(void)           //IC驱动
{
  HDS2=1;
  HDS1=1;
  _nop();

  HDS2=0;
  HDS1=0;
  _nop();

  HDS2=1;
  HDS1=1;
  _nop();

}

使用特权

评论回复
5
dreambird| | 2007-5-19 11:22 | 只看该作者

看了一下时序图

建议你不要用icdriver
应该是在hds的下降沿锁地址,控制,hds的上升沿锁数据

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

8

帖子

1

粉丝