打印

请教d12程序

[复制链接]
2024|18
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
huangqi412|  楼主 | 2007-9-4 08:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
请教个问题
ep0 out中断是因为电脑发送了数据给d12 ep0 in中断是因为什么产生呢
看zlg“d12 usb固件编程与驱动开发》中 ep0中断处理是发送数据 在setup处理中也有发送数据
比如获取配置的处理 它会发送配置给电脑,那么ep0中断干什么用的呢,它发送的是什么。

相关帖子

沙发
computer00| | 2007-9-4 08:46 | 只看该作者

ep0 in中断是主机请求数据时产生的,而ep0 out是主机发送数据

给端点0后产生的。

使用特权

评论回复
板凳
wy3168| | 2007-9-4 09:19 | 只看该作者

遇到个关于D12的严重问题

我一个采样程序,AD用的是AD1674,想把采样数据通过D12送到主机,可是只要启动AD1674,USB就不能数据传输,单片机根本进入不了中断,我用的是zlg提供的USB调试助手调试的.只要关闭AD1674,USB就正常了.AD转换时间大概是10us,怎么处理能保证USB传输的实时性呢?

使用特权

评论回复
地板
huangqi412|  楼主 | 2007-9-4 11:54 | 只看该作者

00,第二个问题呢,

在枚举中如果请求是要求发送数据给主机 它的请求处理中已经有发送数据语句
ep0 in是什么时候被用到呢,它是发送什么数据用

使用特权

评论回复
5
computer00| | 2007-9-4 12:17 | 只看该作者

ep0 in就是返回数据用的,任何在0端点的数据返回都通过ep0

使用特权

评论回复
6
huangqi412|  楼主 | 2007-9-4 13:48 | 只看该作者

00,还请教下,zlg书上的

比如get status
过程是
主机发setup包,d12产生ep0 out中断 mcu读8字节
主机发in包   d12产生ep0 in中断 mcu发送数据给主机
主机再应答

Ep0 out中断:读取8字节并分析出setup包类型
Ep0 in中断:发送一串数据给主机

看zlg书中是ep0 out分析出setup包后
进入请求处理函数有写端点语句发送数据
而且是用局部数组
如果在请求处理中已经发送了数据
那么在ep0 in中断中mcu还发什么数据给主机呢?
我觉得应该在请求处理中只把数据填充到数组中
等待发生enp in中断时写给主机吧
这个数据(设备状态)到底是请求处理中还是ep0中发送?

使用特权

评论回复
7
computer00| | 2007-9-4 14:21 | 只看该作者

也许这里的ep0中断处理是数据发送完处理

在进入请求处理函数中,将数据写给了D12. 然后就等待D12发送完毕,一旦发送完毕,就会产生ep0 IN的一个中断。这个你可以看看数据手册。

使用特权

评论回复
8
huangqi412|  楼主 | 2007-9-4 14:37 | 只看该作者

00,你的status是不是在请求处理中发送的呢?

这样一说,好象是的
记起好象在另一本书上看过这样一段:将数据填入in端点,在一个in包到来时自动发送给主机。
在in中断处理中是发送一串数据,
那么,发生in中断时已经把数据发送了,in中断中发送数据是做什么呢?没看懂 但是枚举中好象用到了in中断

使用特权

评论回复
9
computer00| | 2007-9-4 15:08 | 只看该作者

re

我记得我的D12是在收到端点输入中断后,才返回数据的。然而,我在ISP1362则是先检查端点是否空,如果空就把数据写进去,只有数据发送完毕才会产生输入端点0中断。

使用特权

评论回复
10
huangqi412|  楼主 | 2007-9-4 15:48 | 只看该作者

做过d12的,看过zlg“d12 usb固件编程与驱动开发》的大虾

请指点一下,
实在没弄明白这两个发送的关系和区别,
请求处理是发送的局部变量
ep0 in发送的是全局量
比如在一个请求 get status中这两个是怎么工作的 各发送什么

使用特权

评论回复
11
huangqi412|  楼主 | 2007-9-4 22:51 | 只看该作者

00 你的部分代码

void get_configuration( void ) //获取配置状态
{
  unsigned char value = 0x01;
  write_endpoint_buff( 1, 1, &value );//请求处理 这里有写端点
  usb_flags.flags.usb_endp0_in = 0;
}

void endp0_in( void ) //终端点0输入处理
{~~~~~~~~~
case 8:
          get_configuration();  //这里调用了
~~~~~~~~~~~~
}

Main
{
  disconnect_usb();
  init_usb();
  connect_usb();
  while ( 1 )
if ( Interrupt_Register.Interrupt.control_in_port &&
        usb_flags.flags.usb_endp0_in )
      {
        endp0_in();  //这里调用
        continue;
      }
}
你程序结构蛮简单实用
没用中断 main中一直查中断(因为如果不处理脚会一直为低)
主程序调用ep0 in  get_configuration只给ep0_in调用 
那就是在ep0 in中发送  但是我看好多网上都zlg结构的 请求处理
和ep0 in分开的 都发送,且请求处理中发送枚举需要的数据 不知道
怎么理解了。还是想不通。

使用特权

评论回复
12
computer00| | 2007-9-4 23:22 | 只看该作者

我当初也看过D12驱动那本书,觉得那个代码写得罗嗦,

我才自己重新写代码的. 我觉得代码一定要简单清晰.

使用特权

评论回复
13
一级菜鸟| | 2007-9-4 23:24 | 只看该作者

同意OO的看法,ZLG写的D12驱动实在又臭又长,还用了一堆函数

使用特权

评论回复
14
awey| | 2007-9-4 23:28 | 只看该作者

那不是ZLG写的,是Philips提供程序上改的

使用特权

评论回复
15
一级菜鸟| | 2007-9-4 23:29 | 只看该作者

呵呵,PHILIPS的MIFARE模块驱动,一样又臭又长

使用特权

评论回复
16
awey| | 2007-9-4 23:31 | 只看该作者

长是长了点,但他的编程风格到是值得借鉴的

使用特权

评论回复
17
一级菜鸟| | 2007-9-4 23:33 | 只看该作者

就D12和RC500的官方驱动来说,俺认为可读性非常的差

使用特权

评论回复
18
huangqi412|  楼主 | 2007-9-5 10:08 | 只看该作者

觉得那个东西真的好长,结构也不好

看的人晕,不怎么好读。我还是没看懂他ep0 in到底是写什么数据

使用特权

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

本版积分规则

622

主题

24960

帖子

18

粉丝