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

[复制链接]
2967|4
 楼主| qxxqxq 发表于 2007-4-30 11:08 | 显示全部楼层 |阅读模式
#include&ltat89x52.h&gt<br /><br />#define&nbsp;&nbsp;&nbsp;HCNTL1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;P2_4<br />#define&nbsp;&nbsp;&nbsp;HCNTL0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;P2_5<br />#define&nbsp;&nbsp;&nbsp;HBIL&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;P2_6&nbsp;&nbsp;&nbsp;&nbsp;//字节识别信号:控制读写数据是属于16位字的第1还是第2字节<br />#define&nbsp;&nbsp;&nbsp;HRW&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;P2_7&nbsp;&nbsp;&nbsp;&nbsp;//读写控制选通信号<br />#define&nbsp;&nbsp;&nbsp;HDS1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;P3_6<br />#define&nbsp;&nbsp;&nbsp;HDS2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;P3_7<br />#define&nbsp;&nbsp;&nbsp;HCS&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;P2_1<br />#define&nbsp;&nbsp;&nbsp;HRDY&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;P2_2<br /><br />void&nbsp;delay(void)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//延时函数<br />{<br />&nbsp;&nbsp;int&nbsp;i;<br />&nbsp;&nbsp;for(i=0;i&lt1500;i++);<br />}<br /><br /><br />void&nbsp;icdriver(void)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//IC驱动<br />{<br />&nbsp;&nbsp;HDS2=1;<br />&nbsp;&nbsp;HDS1=1;<br />&nbsp;&nbsp;_nop();<br /><br />&nbsp;&nbsp;HDS2=0;<br />&nbsp;&nbsp;HDS1=0;<br />&nbsp;&nbsp;_nop();<br /><br />}<br /><br />void&nbsp;main(void)<br />{<br />&nbsp;&nbsp;int&nbsp;x,y;<br />&nbsp;&nbsp;P1_7=0;&nbsp;&nbsp;&nbsp;//上电时LED指示灯点亮<br />&nbsp;&nbsp;HCS=0;&nbsp;&nbsp;&nbsp;&nbsp;//片选信号(HPI的使能输入端,每次寻址期间必须为0)<br /><br />/*********************设置HPIC:&nbsp;&nbsp;16bit的HPI控制寄存器*************************/<br /><br /><br /><br />&nbsp;&nbsp;HCNTL1=0;<br />&nbsp;&nbsp;HCNTL0=0;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//主机可以读写HPIC<br />&nbsp;&nbsp;&nbsp;HRW=0;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//表示主机要写HPI<br /><br />&nbsp;&nbsp;HBIL=0;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//DSP认为主机传送过来的是第1个字节<br />&nbsp;&nbsp;P0=0;<br /><br />&nbsp;&nbsp;icdriver();<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;<br /><br />&nbsp;&nbsp;HBIL=1;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//DSP认为主机传送过来的是第2个字节<br />&nbsp;&nbsp;P0=0x00;<br />&nbsp;&nbsp;icdriver();&nbsp;&nbsp;&nbsp;//HPIC=0x0000;BOB=0:第一个字节为高字节<br /><br /><br />/****************************选通HPIA****************************************/<br />&nbsp;&nbsp;HCNTL1=0;<br />&nbsp;&nbsp;HCNTL0=1;<br />&nbsp;&nbsp;HBIL=0;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//设置传送来的数据是第1个字节<br />&nbsp;&nbsp;HRW=0;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//对HPI进行写操作<br /><br />&nbsp;&nbsp;P0=0x00;<br />&nbsp;&nbsp;icdriver();<br /><br />&nbsp;&nbsp;HBIL=1;<br />&nbsp;&nbsp;P0=0x55;<br />&nbsp;&nbsp;icdriver();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//准备读地址为0x1055的数据<br />&nbsp;&nbsp;while(HRDY==0)&nbsp;&nbsp;&nbsp;//&nbsp;判断DSP内部传输是否完成<br />&nbsp;&nbsp;{};<br /><br />&nbsp;/****************************选通HPID并读数据*******************************/<br />&nbsp;&nbsp;HCNTL1=1;<br />&nbsp;&nbsp;HCNTL0=1;<br />&nbsp;&nbsp;HBIL=0;<br />&nbsp;&nbsp;HRW=1;<br /><br /><br />&nbsp;//读高八位:<br /><br />&nbsp;&nbsp;icdriver();<br />&nbsp;&nbsp;x=P0;<br />&nbsp;&nbsp;x=x&lt&lt8;<br />&nbsp;&nbsp;HBIL=1;<br />&nbsp;&nbsp;HRW=1;<br /><br />&nbsp;//读低八位:<br /><br />&nbsp;&nbsp;icdriver();<br />&nbsp;&nbsp;y=P0;<br />&nbsp;&nbsp;y=0x00ff&y;<br />&nbsp;&nbsp;x=x|y;<br /><br />&nbsp;//判断x<br />&nbsp;&nbsp;if(x==0xaaaa)<br />&nbsp;&nbsp;&nbsp;&nbsp;P1_7=1;<br />&nbsp;&nbsp;else<br />&nbsp;&nbsp;&nbsp;&nbsp;P1_7=0;<br /><br />/************************************************************************/<br />}<br /><br />以上为单片机的程序<br />单片机:C51<br />DSP:5402<br />问题是:往HPIC写东西写不进去,不管是主机写,还是DSP写<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;大家帮帮忙,看看程序哪些需要改进?<br />
shao_hx 发表于 2007-5-17 19:45 | 显示全部楼层

1

太多高手,不屑回答,小弟我是不会了!!!!
wowow 发表于 2007-5-18 08:53 | 显示全部楼层

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

很久以前搞过,忘得差不多了,幸好当时记了笔记:<br />=========<br />发现必须从MCU清HINT&nbsp;<br />DSP上电时HPIC是0088,HINT是低电平<br />从DSP写0到HPIC无效<br />主板写08到HPIC,从CCS查HPIC是0080。HINT变为高电平。<br />=========<br /><br />MCU的代码供参考:<br />;从串口接收地址(16bit)和长度(8bit),读相应内存的内容发送到串口&nbsp;<br />;p0.0-p0.7&nbsp;=====&nbsp;HD0-HD7<br />;P2.0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=====&nbsp;HCNTL0<br />;P2.1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=====&nbsp;HCNTL1<br />;P2.2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=====&nbsp;HBIL<br />;P2.4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=====&nbsp;HPIR/W<br />;P2.7&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=====&nbsp;HCS<br />;write&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=====&nbsp;HDS2<br />;read&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=====&nbsp;HDS1<br />;ALE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=====&nbsp;HAS<br />;HINT&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=====&nbsp;INT0<br />&nbsp;&nbsp;&nbsp;&nbsp;ORG&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0000H<br />&nbsp;&nbsp;&nbsp;&nbsp;AJMP&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MAIN<br />&nbsp;&nbsp;&nbsp;&nbsp;ORG&nbsp;&nbsp;&nbsp;&nbsp;0003H&nbsp;&nbsp;&nbsp;&nbsp;;INT0中断子程序<br />&nbsp;&nbsp;&nbsp;&nbsp;RETI<br />&nbsp;&nbsp;&nbsp;&nbsp;ORG&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0030H<br />MAIN:<br />;设置串口<br />&nbsp;&nbsp;&nbsp;&nbsp;MOV&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SCON,#50H&nbsp;&nbsp;&nbsp;&nbsp;;SCON:&nbsp;mode&nbsp;1,&nbsp;8-bit&nbsp;UART,&nbsp;enable&nbsp;rcvr<br />&nbsp;&nbsp;&nbsp;&nbsp;MOV&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TMOD,#20H&nbsp;&nbsp;&nbsp;&nbsp;;TMOD:&nbsp;timer&nbsp;1,&nbsp;mode&nbsp;2,&nbsp;8-bit&nbsp;reload<br />&nbsp;&nbsp;&nbsp;&nbsp;MOV&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TH1,#0FDH&nbsp;&nbsp;&nbsp;&nbsp;;TH1:&nbsp;&nbsp;reload&nbsp;value&nbsp;for&nbsp;9600&nbsp;baud&nbsp;@&nbsp;11.0592MHz<br />&nbsp;&nbsp;&nbsp;&nbsp;MOV&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TL1,#0FDH&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;SETB&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TR1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;timer&nbsp;1&nbsp;run<br /><br />;初始化BOB、清HINT<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MOV&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;A,#08h<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MOV&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DPTR,#0000h<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MOVX&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@DPTR,A<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MOV&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DPTR,#0400h<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MOVX&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@DPTR,A<br /><br />SetAddress:<br />;从串口读高地址位<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CLR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TI<br />&nbsp;&nbsp;&nbsp;&nbsp;JNB&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;RI,$<br />&nbsp;&nbsp;&nbsp;&nbsp;MOV&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;A,SBUF&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;CLR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;RI<br />;写HPIA高地址<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MOV&nbsp;&nbsp;&nbsp;&nbsp;DPTR,#0200h<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MOVX&nbsp;&nbsp;&nbsp;@DPTR,A<br />;从串口读低地址位<br />&nbsp;&nbsp;&nbsp;&nbsp;JNB&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;RI,$<br />&nbsp;&nbsp;&nbsp;&nbsp;MOV&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;A,SBUF&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;CLR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;RI<br />;写HPIA低地址<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MOV&nbsp;&nbsp;&nbsp;&nbsp;DPTR,#0600h<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MOVX&nbsp;&nbsp;&nbsp;@DPTR,A<br />;从串口读数据长度<br />&nbsp;&nbsp;&nbsp;&nbsp;JNB&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;RI,$<br />&nbsp;&nbsp;&nbsp;&nbsp;MOV&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;A,SBUF&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;CLR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;RI<br />&nbsp;&nbsp;&nbsp;&nbsp;MOV&nbsp;&nbsp;&nbsp;&nbsp;R1,A<br /><br />;读DSP内部存贮区并发送到串口<br />ReadHPI:<br />;读高字节并发送<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MOV&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DPTR,#1100h<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MOVX&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;A,@DPTR<br />&nbsp;&nbsp;&nbsp;&nbsp;MOV&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SBUF,A<br />&nbsp;&nbsp;&nbsp;&nbsp;JNB&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TI,$<br />&nbsp;&nbsp;&nbsp;&nbsp;CLR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TI<br />;读低字节并发送<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MOV&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DPTR,#1500h&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MOVX&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;A,@DPTR<br />&nbsp;&nbsp;&nbsp;&nbsp;MOV&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SBUF,A<br />&nbsp;&nbsp;&nbsp;&nbsp;JNB&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TI,$<br />&nbsp;&nbsp;&nbsp;&nbsp;CLR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TI<br />&nbsp;&nbsp;&nbsp;&nbsp;DJNZ&nbsp;&nbsp;&nbsp;&nbsp;R1,ReadHPI&nbsp;&nbsp;&nbsp;&nbsp;<br />;再次取地址<br />&nbsp;&nbsp;&nbsp;&nbsp;AJMP&nbsp;SetAddress<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;End
dreambird 发表于 2007-5-19 00:10 | 显示全部楼层

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

void&nbsp;icdriver(void)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//IC驱动<br />{<br />&nbsp;&nbsp;HDS2=1;<br />&nbsp;&nbsp;HDS1=1;<br />&nbsp;&nbsp;_nop();<br /><br />&nbsp;&nbsp;HDS2=0;<br />&nbsp;&nbsp;HDS1=0;<br />&nbsp;&nbsp;_nop();<br /><br />&nbsp;&nbsp;HDS2=1;<br />&nbsp;&nbsp;HDS1=1;<br />&nbsp;&nbsp;_nop();<br /><br />}<br />
dreambird 发表于 2007-5-19 11:22 | 显示全部楼层

看了一下时序图

建议你不要用icdriver<br />应该是在hds的下降沿锁地址,控制,hds的上升沿锁数据
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

8

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部