打印

关于驱动程序,固件之间通讯的一点疑问

[复制链接]
1717|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
fshuangy|  楼主 | 2011-8-22 14:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
1:下面这段程序实现了端点2和6之间的数据传输,可见数据是存在于EP2FIFOBUF和EP6FIFOBUF中,但在程序中未见到对这两个缓冲区进行赋值的语句,请问是自动赋值还是通过其他的方式? 就是说为什么没有进行赋值,但是缓冲区中就存在数据了呢?
if(!(EP2468STAT & bmEP2EMPTY))
  { // check EP2 EMPTY(busy) bit in EP2468STAT (SFR), core set's this bit when FIFO is empty
     if(!(EP2468STAT & bmEP6FULL))
     {  // check EP6 FULL(busy) bit in EP2468STAT (SFR), core set's this bit when FIFO is full
        APTR1H = MSB( &EP2FIFOBUF );
        APTR1L = LSB( &EP2FIFOBUF );
        AUTOPTRH2 = MSB( &EP6FIFOBUF );
        AUTOPTRL2 = LSB( &EP6FIFOBUF );
        count = (EP2BCH << 8) + EP2BCL;
        // loop EP2OUT buffer data to EP6IN
        for( i = 0x0000; i < count; i++ )
        {
           // setup to transfer EP2OUT buffer to EP6IN buffer using AUTOPOINTER(s)
           EXTAUTODAT2 = EXTAUTODAT1;
        }
2:在bulkloop的头文件中没有找到与上位机进行读写操作的通信协议,请问驱动中是通过什么方式或者是发什么样的命令来控制固件进行读写操作的?(这里麻烦说清楚一点。)
    请大家帮帮忙,谢谢!

相关帖子

沙发
dqyubsh| | 2011-8-22 15:43 | 只看该作者
1,对固件来说,EP2是PC发送过来数据的端点(OUT端点),判断EP2缓冲区有数据,则接收。判断条件是if(!(EP2468STAT & bmEP2EMPTY)),只要该条件成立,表明EP2 FIFO已经有了可用数据。

同样,EP6是将固件的数据返回给PC的端点(IN端点),如果固件准备好了数据,并且EP6 FIFO空闲,即可将数据打到EP6 FIFO,从而被主机读走。判断EP6空闲的语句是  if(!(EP2468STAT & bmEP6FULL))。

bulkloop是一个回环测试程序,将从PC接收来的数据直接返回到PC,即,从EP2接收,直接返回到EP6。这是通过自动指针完成的,自动指针只要给出源地址、目标地址、传送长度即可完成一批数据的直接传送。中间部分即时这个功能。

2,你的第二个问题问的比较生涩。首先,通讯协议一定是没有的,要自己实现。bulkloop只是完成了数据通路,即,一个地球人和一个火星人拨通了手机。至于这两人用什么语言交流、如果约定吃饭逛街等等一些细节,只有这两个人之间才能清楚。

个人认为,主机与USB设备之间至少可以用两种方式完成协议。
1)通过端点0或者端点1,以厂商命令的型式进行少量数据的交互。比如,问设备的状态,给设备发送一个命令等等。因为这两个端点数据缓冲区是64字节,没有FIFO,所以这种通讯一定是慢速的、简单的、少量的。比如例程Vend_ax。
2)通过EP2/4/6/8进行大量数据的快速传输,这是FIFO的好处所在。

至于你怎样用,可以根据设备的情况作出自己的选择。协议的细节,完全是自己定义的,可以参照一些串口通讯的协议。

说问题生涩,是因为这些协议都与驱动无关,可在PC应用软件上实现这些通讯协议。CYPRESS已经把USB驱动做好了,除非你想自己从头再来,再弄一个USB驱动。

使用特权

评论回复
板凳
fshuangy|  楼主 | 2011-8-22 16:24 | 只看该作者
首先感谢你的回答得这么详细,不过我还是有个问题想追问一下:

既然68013不能主动和上位机通讯,那它就一定要响应上位机的指令才能进行数据的输入和输出。
那上位机是通过什么命令将数据传送到端口2,又是通过什么命令从端口6中将数据读回的呢?

下位机响应上位机的读写命令,在bulkloop中是怎么体现出来的呢?


谢谢!

使用特权

评论回复
地板
dqyubsh| | 2011-8-22 19:29 | 只看该作者
本帖最后由 dqyubsh 于 2011-8-22 19:45 编辑

那上位机是通过什么命令将数据传送到端口2,又是通过什么命令从端口6中将数据读回的呢?
——在安装目录里,有CYBULK项目,或者就叫bulkloop项目,是VC/BC工程,或者C#工程,你自己看一下。

下位机响应上位机的读写命令,在bulkloop中是怎么体现出来的呢?
——又绕回来了。上位机写了数据之后,固件在TD_Poll函数里通过查询EP2端点的FIFO状态会得到标识,bmEP2EMPTY……
具体的定义看手册。

使用特权

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

本版积分规则

0

主题

75

帖子

2

粉丝