qiezi
驱动小牛
驱动小牛
  • 注册日期2002-10-17
  • 最后登录2005-04-20
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1670回复:19

关于MCU如何读写D12数据的问题,请大侠指点。

楼主#
更多 发布于:2002-12-16 18:54
关于MCU如何读写D12数据的问题我是这样理解的,不知道是否正确(我的是51-D12-PC)。

1、首先我认为MCU不能引起D12中断寄存器状态的改变(下面都是在这个基础上理解的,希望没有理解错哦)。 :P
2、只有主机的命令才能使D12中断寄存器的状态改变。
3、当IN操作时D12产生中断(以读写主端点为例),MCU读中断寄存器的状态,如果主端点缓冲区为空,则MCU往主端点缓冲区写数据,然后就可以上传给主机;否则就可以直接上传个主机了。
4、反之,OUT操作时亦然。

大侠给看看是不是这样呀?错了我晕倒再爬起来接着来。 :P

最新喜欢:

crazyqpcrazyq...
dacongtou
驱动中牛
驱动中牛
  • 注册日期2002-11-11
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2002-12-18 08:12
主要是因为我们现在做的东西必须用汇编来编写,而我做的USB部分只是主程序的一小部分,只是实现简单的数据传送就好了..所以没办法啊...
那些描述符用查表方式就行了啊.MOVC A,@A+DPTR
jinghuiren
驱动巨牛
驱动巨牛
  • 注册日期2002-06-01
  • 最后登录2008-10-27
  • 粉丝0
  • 关注0
  • 积分291分
  • 威望460点
  • 贡献值0点
  • 好评度428点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2002-12-17 20:11
不知道标准请求里那一堆结构(设备描述符,端点描述符等)用汇编怎么编 :D :D :D :D
qiezi
驱动小牛
驱动小牛
  • 注册日期2002-10-17
  • 最后登录2005-04-20
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2002-12-17 17:04
谢谢.收到了...但是...但是....但是.... :( :( :( :(

看不懂....

(我只会汇编还不怎么样.要是能看懂早就弄出来了,现在c51例子那么多,可是汇编的没几个啊)

看来我还是要自己慢慢熬了...

不过不管怎么说还是非常谢谢你啦



我当初还不是和你一样,用几天时间来看一下C51磨刀不误砍柴工啊,没办法呀,谁叫我们吃这碗饭呢? :P
qiezi
驱动小牛
驱动小牛
  • 注册日期2002-10-17
  • 最后登录2005-04-20
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2002-12-17 16:58
关于(2)中你所说的,如果主机取数据,而MCU没给数据是要产生NAK,但我试了一下,D12并没有进入中断,并且我的主机功能驱动死机了,所以我觉得在你的固件中应该和主机协调好,先给IN缓冲区准备好发到主机中的数据。



 :o 嘻嘻,不好意思啊,大侠!我还不知道在没有中断产生的情况下,MCU如何主动往缓冲区写数据。我原来一直以为MCU往D12的IN 缓冲区写数据是从中断程序进去的。 :(
zfnuaa
驱动牛犊
驱动牛犊
  • 注册日期2002-09-28
  • 最后登录2004-04-12
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2002-12-17 16:08
关于(2)中你所说的,如果主机取数据,而MCU没给数据是要产生NAK,但我试了一下,D12并没有进入中断,并且我的主机功能驱动死机了,所以我觉得在你的固件中应该和主机协调好,先给IN缓冲区准备好发到主机中的数据。
关于(3)中,只要缓冲区不为0,就有中断。
dacongtou
驱动中牛
驱动中牛
  • 注册日期2002-11-11
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2002-12-17 16:08
[quote][quote]我还是在啃程序,先看看别人的,我看了你给我的周立功的,还有斑竹的好象都是同一个来源,打算改一改把我的插进去。要是让我自己写,那都到猴年马月啦!对了,你是不是没有那些头文件呀,我这里有,你要不?


要啊..当然要.我编不出来都快急死了..老板催得太紧啊 [/quote]


葱头大哥请查收,我发的是EYOU 的那个邮箱! :P [/quote]

谢谢.收到了...但是...但是....但是.... :( :( :( :(

看不懂....

(我只会汇编还不怎么样.要是能看懂早就弄出来了,现在c51例子那么多,可是汇编的没几个啊)

看来我还是要自己慢慢熬了...

不过不管怎么说还是非常谢谢你啦
qiezi
驱动小牛
驱动小牛
  • 注册日期2002-10-17
  • 最后登录2005-04-20
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2002-12-17 15:21
[quote]我还是在啃程序,先看看别人的,我看了你给我的周立功的,还有斑竹的好象都是同一个来源,打算改一改把我的插进去。要是让我自己写,那都到猴年马月啦!对了,你是不是没有那些头文件呀,我这里有,你要不?


要啊..当然要.我编不出来都快急死了..老板催得太紧啊 [/quote]


葱头大哥请查收,我发的是EYOU 的那个邮箱! :P
qiezi
驱动小牛
驱动小牛
  • 注册日期2002-10-17
  • 最后登录2005-04-20
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2002-12-17 15:05
谢谢jinghuiren大侠,这下明白了不少! :D :D :D
还请多多指教!
jinghuiren
驱动巨牛
驱动巨牛
  • 注册日期2002-06-01
  • 最后登录2008-10-27
  • 粉丝0
  • 关注0
  • 积分291分
  • 威望460点
  • 贡献值0点
  • 好评度428点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2002-12-17 14:57
[quote]我来就这个问题说一下我的观点:
1.MCU能改变D12的中断寄存器,当MCU读最后处理状态寄存器的时候,中断寄存器中相应位(0-5)会清0。只有这样,MCU才会再次进入中断。所以每个相应断点的中断处理程序中都要有读最后处理状态寄存器这一步。
2.如何进入IN中断,我认为是由于主机过来要数据,并已把IN缓冲区中的数据读走了,D12才会产生IN中断,所以在给主机发数据之前,MCU应该已经把数据写到缓冲区里,等着主机来取,进入IN中断后,MCU要发送下一个要传的数据,或不。
3.如何进入OUT中断,我认为就是主机发数据过来,数据放入OUT缓冲区中,这比较好理解,所以MCU只要取数据就可以了。
以上是我的看法,
 :D



关于(1)大侠说的极是,我也明白了,谢谢大侠! :P
关于(2)中比如在一开始的时候IN缓冲区为空,如果这时候主机来取数据是不是要先产生一个NAK信号,然后启动中断程序MCU往IN缓冲区送数据。如果主机没有把IN缓冲区的数据取完,那还会产生中断吗?
关于(3)是只要缓冲区中有数据MCU就读吗?
谢谢大侠赐教! [/quote]

 关于(2)如果第一个NAK不能产生中断,那可以采用在IN中断中设置标志位,在主程序中向IN端点填充数据的方法,具体做法是在初始化时将标志位置1,在中断子程序中将标志位置1,这样你第一次写数据时判断到标志位为1,就可一些数据到端点中,写完后将标志位清为0。等这个数据包被读走后,主机来的ACK会产生中断,在中断中标志位又会被置1。不存在主机没有取完数据就产生中断的情况,因为主机一旦读一个端点就会一次读完,否则就是出错。
  对于OUT,如果设备正确接收到主机发来的数据,会产生ACK给主机(硬件实现),这个ACK也同时会对设备方产生中断,你在中断程序中读出数据即可,或者采用上述方法。
  我用的ISP1581能把中断配置为对第一个NAK和所有的ACK产生中断,因此没有你说的问题。
dacongtou
驱动中牛
驱动中牛
  • 注册日期2002-11-11
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2002-12-17 14:35
我还是在啃程序,先看看别人的,我看了你给我的周立功的,还有斑竹的好象都是同一个来源,打算改一改把我的插进去。要是让我自己写,那都到猴年马月啦!对了,你是不是没有那些头文件呀,我这里有,你要不?


要啊..当然要.我编不出来都快急死了..老板催得太紧啊
qiezi
驱动小牛
驱动小牛
  • 注册日期2002-10-17
  • 最后登录2005-04-20
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
11楼#
发布于:2002-12-17 13:36
我来就这个问题说一下我的观点:
1.MCU能改变D12的中断寄存器,当MCU读最后处理状态寄存器的时候,中断寄存器中相应位(0-5)会清0。只有这样,MCU才会再次进入中断。所以每个相应断点的中断处理程序中都要有读最后处理状态寄存器这一步。
2.如何进入IN中断,我认为是由于主机过来要数据,并已把IN缓冲区中的数据读走了,D12才会产生IN中断,所以在给主机发数据之前,MCU应该已经把数据写到缓冲区里,等着主机来取,进入IN中断后,MCU要发送下一个要传的数据,或不。
3.如何进入OUT中断,我认为就是主机发数据过来,数据放入OUT缓冲区中,这比较好理解,所以MCU只要取数据就可以了。
以上是我的看法,
 :D



关于(1)大侠说的极是,我也明白了,谢谢大侠! :P
关于(2)中比如在一开始的时候IN缓冲区为空,如果这时候主机来取数据是不是要先产生一个NAK信号,然后启动中断程序MCU往IN缓冲区送数据。如果主机没有把IN缓冲区的数据取完,那还会产生中断吗?
关于(3)是只要缓冲区中有数据MCU就读吗?
谢谢大侠赐教!
zfnuaa
驱动牛犊
驱动牛犊
  • 注册日期2002-09-28
  • 最后登录2004-04-12
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
12楼#
发布于:2002-12-17 11:40
我来就这个问题说一下我的观点:
1.MCU能改变D12的中断寄存器,当MCU读最后处理状态寄存器的时候,中断寄存器中相应位(0-5)会清0。只有这样,MCU才会再次进入中断。所以每个相应断点的中断处理程序中都要有读最后处理状态寄存器这一步。
2.如何进入IN中断,我认为是由于主机过来要数据,并已把IN缓冲区中的数据读走了,D12才会产生IN中断,所以在给主机发数据之前,MCU应该已经把数据写到缓冲区里,等着主机来取,进入IN中断后,MCU要发送下一个要传的数据,或不。
3.如何进入OUT中断,我认为就是主机发数据过来,数据放入OUT缓冲区中,这比较好理解,所以MCU只要取数据就可以了。
以上是我的看法,
 :D
qiezi
驱动小牛
驱动小牛
  • 注册日期2002-10-17
  • 最后登录2005-04-20
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
13楼#
发布于:2002-12-17 11:35
我还是在啃程序,先看看别人的,我看了你给我的周立功的,还有斑竹的好象都是同一个来源,打算改一改把我的插进去。要是让我自己写,那都到猴年马月啦!对了,你是不是没有那些头文件呀,我这里有,你要不?
dacongtou
驱动中牛
驱动中牛
  • 注册日期2002-11-11
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
14楼#
发布于:2002-12-17 11:22
关于MCU如何读写D12数据的问题我是这样理解的,不知道是否正确(我的是51-D12-PC)。



你做到那一步了啊现在??
dacongtou
驱动中牛
驱动中牛
  • 注册日期2002-11-11
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
15楼#
发布于:2002-12-17 08:26

3、当IN操作时D12产生中断(以读写主端点为例),MCU读中断寄存器的状态,如果主端点缓冲区为空,则MCU往主端点缓冲区写数据,然后就可以上传给主机;否则就可以直接上传个主机了。
4、反之,OUT操作时亦然。


我也不太明白了,,高手快来.愿闻其详.
qiezi
驱动小牛
驱动小牛
  • 注册日期2002-10-17
  • 最后登录2005-04-20
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
16楼#
发布于:2002-12-16 21:06
还请大侠们告之,我头越来越大了! :(
Jkw_Dev
驱动中牛
驱动中牛
  • 注册日期2002-11-03
  • 最后登录2014-11-28
  • 粉丝0
  • 关注0
  • 积分82分
  • 威望28点
  • 贡献值0点
  • 好评度8点
  • 原创分0分
  • 专家分0分
17楼#
发布于:2002-12-16 20:50
是这样吗?
。。。
qiezi
驱动小牛
驱动小牛
  • 注册日期2002-10-17
  • 最后登录2005-04-20
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
18楼#
发布于:2002-12-16 20:33
D12的NAK中断好象没有看到,大侠你的意思是只有端点的缓冲区为空(IN操作)和缓冲区为满时(OUT操作)才会产生中断(别的中断源暂且不考虑,只管读写),是吧?我明白了,谢谢!
jinghuiren
驱动巨牛
驱动巨牛
  • 注册日期2002-06-01
  • 最后登录2008-10-27
  • 粉丝0
  • 关注0
  • 积分291分
  • 威望460点
  • 贡献值0点
  • 好评度428点
  • 原创分0分
  • 专家分0分
19楼#
发布于:2002-12-16 19:56
我觉得3有点问题,应该是数据发走后主机如果正确接收到数据会发送ACK握手(如果数据没准备好设备会向主机产生NAK,不知道D12能不能对NAK产生中断),这时才会产生中断,也就是说进入in端点中断子程序时你的端点肯定是空的,否则是进不了这个中断子程序的。

还有2中那个‘命令’值得商榷
游客

返回顶部