新手求助:parallel I/O 从A方式!! 点击:1740 | 回复:17



乐少

    
  • 精华:0帖
  • 求助:0帖
  • 帖子:9帖 | 49回
  • 年度积分:0
  • 历史总积分:134
  • 注册:2004年1月05日
发表于:2004-11-26 16:42:00
楼主
用89c52与3150并行通讯(parallel 从A方式) 问题: 1.89c52有令牌权时,89c52往总线上传数据,而3150接收; 3150 有令牌权时,3150往总线上传数据,而 89c52接收; 所传数据为四种令牌命令字节,即写数据,传令牌,再同步或应答同步。对吗? 2.令牌权是否由R/~W来决定(“0”时89c52有令牌;“1”时3150有令牌)? 3.HS是否被用来表示从处理器3150的状态信号(3150读/写时为“0”;89c52读/写时为“1”)? 4./cs由89c52驱动,89c52中: CLR CS/SETB CS两条指令为一个负脉冲,用来执行读/写操作。对吗? 5.3150程序中,所传输的四种令牌命令字节是由3150自动生成,还是需要我重新定义? 四种令牌命令字节都是通过io-in()接收的吗?如果是,那么接收完之后是否需要人为分别处理这四种情况? 6.什么情况下io_in_ready()/io_out_ready()为True?此时/CS,R/~W和HS在什么状态下??



乐少

  • 精华:0帖
  • 求助:0帖
  • 帖子:9帖 | 49回
  • 年度积分:0
  • 历史总积分:134
  • 注册:2004年1月05日
发表于:2004-11-27 08:59:00
1楼
望衣卓老师及各位高手赐教!!谢谢!!

jjxhl

  • 精华:0帖
  • 求助:0帖
  • 帖子:8帖 | 48回
  • 年度积分:0
  • 历史总积分:92
  • 注册:2003年6月19日
发表于:2004-11-29 09:09:00
2楼
象你这种应用,我觉得应该用SLAVE B模式

乐少

  • 精华:0帖
  • 求助:0帖
  • 帖子:9帖 | 49回
  • 年度积分:0
  • 历史总积分:134
  • 注册:2004年1月05日
发表于:2004-11-29 10:58:00
3楼
to:jjxhl 能说说为什么吗??

jjxhl

  • 精华:0帖
  • 求助:0帖
  • 帖子:8帖 | 48回
  • 年度积分:0
  • 历史总积分:92
  • 注册:2003年6月19日
发表于:2004-11-29 12:03:00
4楼
一般神经元芯片之间的连接用MASTER或SLAVE A模式,而在与其它微处理器连接的时候采用SLAVE B模式,这里89C52作为MASTER,而3150则做为SLAVE B模式

乐少

  • 精华:0帖
  • 求助:0帖
  • 帖子:9帖 | 49回
  • 年度积分:0
  • 历史总积分:134
  • 注册:2004年1月05日
发表于:2004-11-29 15:38:00
5楼
to:jjxhl 资料上一般都是用从A方式!!都说是让89c52遵守并实现3150的令牌传递协议,可是具体究竟如何工作,却没有介绍。只是给出了3150中的io_in_ready()/io_out_ready()/io_in()/io_out()等程序,真是难以理解!!哎!!...真愁人!!能有个简单的列子该多好!! 您一定用过“parallel 从A方式”吧??能帮我回答上面的问题吗?? 谢谢了!!!

jjxhl

  • 精华:0帖
  • 求助:0帖
  • 帖子:8帖 | 48回
  • 年度积分:0
  • 历史总积分:92
  • 注册:2003年6月19日
发表于:2004-11-30 08:30:00
6楼
to ale 我用的是SLAVE B模式,MC68332作为MASTER而3150作SLAVE B 我看的是3150DATASHEET,3150能自动完成信令的传递,不用你去控制,只要控制你自己这边的就行了。我给你一段3150里的程序。你看看或许能明白点什么: IO_0 parallel slave_b s_bus; typedef struct parallel_io_interface { unsigned int lenth; unsigned int data[DATA_SIZE_MAX]; }piofc; piofc pifc; //buff for receive msg from parallel i/o far piofc pofc_current; //current buff for msg to Mcu by parallel i/o far piofc pofc_backup; //backup of msg to Mcu(refresh if check ok) network output bind_info(unackd_rpt priority) struct { unsigned int lenth; unsigned int data[NV_DOWN_SIZE]; }nv_down_a; network input struct{ unsigned int lenth; unsigned int data[NV_UP_SIZE]; }nv_up_b; network input struct{ unsigned int lenth; unsigned int data[NV_UP_SIZE]; }nv_up_c; unsigned int station_addr; boolean sum_ok; //chk sum ok; void chk_sum(void); //check summer of msg from Mcu void add_sum(void); //caculate check sum of msg to Mcu when(reset) { sum_ok=FALSE; } when(io_in_ready(s_bus)) { unsigned int i; pifc.lenth=DATA_SIZE_MAX; io_in(s_bus,&pifc); chk_sum(); if(sum_ok==TRUE) { nv_down_a.lenth=pifc.data[0]; for(i=0;i<nv_down_a.lenth;i++) nv_down_a.data[i]=pifc.data[i+1]; } } when(io_out_ready(s_bus)) { io_out(s_bus,&pofc_current); } when(nv_update_occurs(nv_up_b)) { unsigned int i; pofc_current.lenth=nv_up_b.lenth+2; for(i=0;i<nv_up_b.lenth;i++) pofc_current.data[i]=nv_up_b.data[i]; pofc_current.data[nv_up_b.lenth]=0; add_sum(); io_out_request(s_bus); } when(nv_update_occurs(nv_up_c)) { unsigned int i; pofc_current.lenth=nv_up_c.lenth+2; for(i=0;i<nv_up_c.lenth;i++) pofc_current.data[i]=nv_up_c.data[i]; pofc_current.data[nv_up_c.lenth]=1; add_sum(); io_out_request(s_bus); } void add_sum() { unsigned int sum; int i; sum=0; for(i=0;i<pofc_current.lenth-1;i++) sum+=pofc_current.data[i]; pofc_current.data[i]=sum; } void chk_sum() { unsigned int sum; int i; sum=0; for(i=0;i<pifc.lenth-1;i++) sum+=pifc.data[i]; sum_ok=(sum==pifc.data[i]) ? TRUE : FALSE; }

lyz8787

  • 精华:0帖
  • 求助:0帖
  • 帖子:3帖 | 2回
  • 年度积分:0
  • 历史总积分:11
  • 注册:2004年11月22日
发表于:2004-11-30 11:28:00
7楼
to jjxhl 能否将你的3150与单片机相连的电路图发一份给我! Thank you! email:lyz872004@163.com

乐少

  • 精华:0帖
  • 求助:0帖
  • 帖子:9帖 | 49回
  • 年度积分:0
  • 历史总积分:134
  • 注册:2004年1月05日
发表于:2004-11-30 19:27:00
8楼
to: jjxhl 感谢之至!! 您一定是个LONWORKS的前辈吧!!能收下我这个"徒弟"吗??

jjxhl

  • 精华:0帖
  • 求助:0帖
  • 帖子:8帖 | 48回
  • 年度积分:0
  • 历史总积分:92
  • 注册:2003年6月19日
发表于:2004-12-01 10:39:00
9楼
别光顾着谢,你试过没有啊

乐少

  • 精华:0帖
  • 求助:0帖
  • 帖子:9帖 | 49回
  • 年度积分:0
  • 历史总积分:134
  • 注册:2004年1月05日
发表于:2004-12-01 20:07:00
10楼
to: jjxhl 无论怎么样,都应该感谢你的回复!! 我还没试过呢!!因为,以前我看的都是从A方式,一下子还改不过来呢!!呵!!..... 你那段程序可以直接下载到3150中吧(是否需要主处理器方面的同步?)!!?能把主处理器中与3150同步的代码给我看看吗??最简单的那种!!我还不清楚主处理器中是如何实现信令协议的!!

乐少

  • 精华:0帖
  • 求助:0帖
  • 帖子:9帖 | 49回
  • 年度积分:0
  • 历史总积分:134
  • 注册:2004年1月05日
发表于:2004-12-01 20:29:00
11楼
to: jjxhl 以下是我的一个89c52同步子程序和一个3150程序,请看看其中有什么问题!!为什么在单片机运行时,3150的程序却下载不下去,一直复位(使用lonworks开发模板nodebuilder实验)? ---------------------------------------------------- ;其中,P20,P21,P22分别接IO8-IO10 ;主程序中循环执行这个子程序 SYNC3150: CLR RW ;定义89c52拥有令牌 JB HS, $ ;检测3150状态,1为忙,0为闲 MOV P0, #5AH ;89c52写操作,5A为CMD-RESYNC CLR CS SETB CS ; 3150读操作 JB HS, $ ;检测3150状态 MOV P0, #00H ;89c52写操作,00为EOM SETB RW ;传递令牌给3150 JB HS, $ ;检测3150状态 CLR CS SETB CS ;89c52读操作 MOV A, P0 ;把读到的数据给A JB HS, $ ;检测3150状态 CJNE A, #07H, SYNC3150 ;判断是否为07 CMD-ACKSYNC ,不是则重新同步 CLR RW ;传递令牌给89C52 RET ------------------------------------------------------- network input char nvin=0; IO_0 parallel slave s_bus; #define data_size 10 char i=0; typedef struct parallel_io_interface { unsigned int length; unsigned int data[data_size]; }piofc; far piofc p_in,p_out; when(nv_update_occurs(nvin)) { p_out.length=10; for(i=0;i<10;i++) { p_out.data[i]=3; } io_out_request(s_bus); } when(io_out_ready(s_bus)) { io_out(s_bus,&p_out); } when(io_in_ready(s_bus)) { p_in.length=data_size; io_in(s_bus,&p_in); }

jjxhl

  • 精华:0帖
  • 求助:0帖
  • 帖子:8帖 | 48回
  • 年度积分:0
  • 历史总积分:92
  • 注册:2003年6月19日
发表于:2004-12-02 11:34:00
12楼
你调试过没有?能收到3150的应答信号吗?

乐少

  • 精华:0帖
  • 求助:0帖
  • 帖子:9帖 | 49回
  • 年度积分:0
  • 历史总积分:134
  • 注册:2004年1月05日
发表于:2004-12-02 16:26:00
13楼
to: jjxhl 经过重新编译之后,我的程序已经成功下载了!!可是,只有在重新按下RESET后,数据才能通信!请问:这是否正常??

jjxhl

  • 精华:0帖
  • 求助:0帖
  • 帖子:8帖 | 48回
  • 年度积分:0
  • 历史总积分:92
  • 注册:2003年6月19日
发表于:2004-12-03 12:58:00
14楼
这有可能啊!只有RESET口它们才建立同步吧!既然以近通了,剩下的只是细节问题,自己调调就OK了!

乐少

  • 精华:0帖
  • 求助:0帖
  • 帖子:9帖 | 49回
  • 年度积分:0
  • 历史总积分:134
  • 注册:2004年1月05日
发表于:2004-12-04 11:01:00
15楼
to: jjxhl 万事ok了!!谢谢你的帮助!!

乐勇

  • 精华:0帖
  • 求助:0帖
  • 帖子:2帖 | 5回
  • 年度积分:0
  • 历史总积分:11
  • 注册:2006年11月15日
发表于:2007-01-08 21:25:00
16楼
请教大家,我用nodebuilder开发盒实验,把89C52(单独的一块电路板)的P0跟3150的IO0-IO7连接,P2.0、P2.1、P2.2分别连接IO8、IO9、IO10,电源和地都用89C52板上的,编程基本按照上面的例子,但是也改动了一下,只用了同步的的程序,也不知道对不对,结果开发盒上的复位灯一直亮着(此时3150里面还没有下载程序),测了一下vcc是4.67v,reset是3.4v,程序如下:
CS BIT P2.0
RW BIT P2.1
HS BIT P2.2
SYNC3150:
CLR RW ;定义89c52拥有令牌
JB HS,$ ;检测3150状态,1为忙,0为闲
MOV P0,#5AH ;89c52写操作,5A为CMD-RESYNC
CLR CS
SETB CS ;3150读操作
JB HS,$ ;检测3150状态
MOV P0,#00H ;89c52写操作,00为EOM
CLR CS
SETB CS ;3150读操作
SETB RW ;传递令牌给3150
JB HS,$ ;检测3150状态
MOV A,P0 ;把读到的数据给A
CLR CS
SETB CS ;8952读操作?
CLR RW ;传递令牌给8952
CJNE A,#07H,SYNC3150 ;判断是否为07 CMD-ACKSYNC,不是则重新同步
RET
END
能不能帮我看看程序有什么错误,还有如果程序正确之后,是不是复位灯就不会亮了,然后就可以往3150里下载程序了?

还请好心人指教,万分感激!

jjxhl

  • 精华:0帖
  • 求助:0帖
  • 帖子:8帖 | 48回
  • 年度积分:0
  • 历史总积分:92
  • 注册:2003年6月19日
发表于:2007-06-03 21:29:00
17楼
上面都这么详细的说了,好问?

热门招聘
相关主题

官方公众号

智造工程师