打印

CY7C63813初学使用求助

[复制链接]
13849|35
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
beckham|  楼主 | 2012-1-16 23:16 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 beckham 于 2012-1-17 08:43 编辑

   初学赛普拉斯的USB控制器,看了NUSB基础知识,很是头大,第一次接触USB应用,而且发现CY7C63***的参考资料真少,折腾了几个礼拜,一度失去信心,真想换个其他厂商的USB控制器,但做事贵在**,希望大虾能一路给予指导,让我少走弯路,在此先谢过了。也希望自己用这个帖子能够详细记录CY7C63***系列USB控制器初学乍练的过程(包括CY7C63***硬件、软件、USB基础知识、CY3217开发工具),完成第一个USB控制的应用项目,给后来者快速入门提供一点点参考。
    USB方面的书我主要看了两本:圈圈教你玩USBUSB外围设备设计与应用(台湾许永和编著2002年)。许永和的书介绍的正好是CY7C63系列USB控制器,可惜当时63813还没有出来,而且书上的程序都是汇编语言版,开发环境和开发工具已经过时,现在都用PSOC designerC编程,烧录用的是CY3217。尽管如此,许永和的书还是值得一看,想想人家2002年就把USB研究的很透了,而且确实是在编书,有个人的理解,不是在翻译技术手册。圈圈的书和他有异曲同工之妙,只不过圈圈以51+D12的方式介绍。手头没有圈圈书配套的电路板,没动手照着做,只是照着例程看,总算是对USB包结构、传输类型、标准设备请求、各类描述符的结构有了初步认识(过程真是痛苦啊,这是必经之路,逃也逃不掉)。
    再来说说我演的这出戏的主角CY63803/813,它价格在3-4元左右,很有价格优势,比起其他带有USB控制器的单片机要便宜多了,在做一些低成本应用时,确实是个好选择。CY63803/813属于encoreII系列,好像是CYPRESS目前最低档的USB控制器芯片,勉强属于PSOC吧,用户模块很少。其实我对PSOC不大了解,完全是因为要开发一个USB项目才接触到CYPRESS的产品,才知道了PSOC,真感慨技术发展的真快,自己不懂的东西太多了,呜呜。
    进入正题,现在进行第一步,实现USB设备(鼠标或键盘都行,HID类的,上手容易一些)的枚举。我用CY7C63813搭了简单电路(当然,这芯片什么内置了,也没什么电路,直接连了个USB接口,呵呵)。(1)新建PSOC DESIGNER 工程,添加USB用户模块,在USB 设置向导里面进行各描述符的设置(具体设置见附件,我也是参考别人给的一个例子,应该是没有问题的)。(2)编程。这就有些无从下手啦,哈哈。像圈圈书上用的51+D12的方式,各个函数都是用户自己编写的,虽然比较繁琐,但是D12的例子铺天盖地。我感觉CY7C63813应该不会这么麻烦吧。关键是没什么参考的例子,惨。仅仅实现枚举的话,主函数是不是不需要写什么东西,关键是中断函数里?端点0和端点1的中断函数?PSOC DESIGNER这个软件是不是很多东西自己就做了?

     今天先写到这里吧,明天继续……



沙发
jxin| | 2012-1-17 11:56 | 只看该作者
“我感觉CY7C63813应该不会这么麻烦吧。关键是没什么参考的例子,惨。“
〉可以参照 CY3655 kit - http://www.cypress.com/?rID=14327

仅仅实现枚举的话,主函数是不是不需要写什么东西,关键是中断函数里?端点0和端点1的中断函数?PSOC DESIGNER这个软件是不是很多东西自己就做了?
〉需要写一些东西,
USB_Start(0);        // Enable USB
while (USB_bGetConfiguration() == 0)    // Wait for USB enumeration
这是实现枚举必须的。
中断不需要自己去做,PSoC Designer和其中提供的API把这些处理好了。

使用特权

评论回复
板凳
beckham|  楼主 | 2012-1-17 16:37 | 只看该作者
本帖最后由 beckham 于 2012-1-17 16:40 编辑

CYPRESS的PSOC designer这个软件 确实提供了很大的便利,简化了用户的工作。今天上午从软件自带的HELP文档中找到了一个鼠标应用的小程序,实现屏幕光标自己不停移动的功能。如下:
#include <m8c.h>        // part specific constants and macros
#include "PSoCAPI.h"    // PSoC API definitions for all User Modules
BYTE abMouseData[3] = {0,0,0};
BYTE i = 0;
   
void main (void)
{
    M8C_EnableGInt; //Enable Global Interrupts
   
    USB_1_Start(0); //Start USB Operation using device 0
   
    while (!USB_1_bGetConfiguration()); //Wait for Device to enumerate
    USB_1_LoadEP (1, abMouseData, 3); //Begin initial USB transfers
    while(1)
    {
        if (USB_1_bGetEPAckState (1)) //Check and see if ACK has occured
        {
            USB_1_LoadEP (1, abMouseData, 3); //Load EP1 with mouse data
            
            if(i==128)
                abMouseData[1] = 0x05; //Start moving the mouse to the right
            else if(i==255)
                abMouseData[1] = 0xFB; //Start moving the mouse to the left
            i++;
        }
    }
}

     只不过,HELP文档里是USB_Start(0)....要统统改成USB_1_Start(0); 函数都加一个1,不然编译通不过,自己调试发现的,呵呵。
    确实如楼上所说,实现枚举功能的语句很简单,就两句:
    USB_1_Start(0); //Start USB Operation using device 0
    while (!USB_1_bGetConfiguration()); //Wait for Device to enumerate
    现在对USB_1_LoadEP (1, abMouseData, 3);这个函数功能不太明白,HELP文档里介绍的不够详细,里面的参数有什么用呢?
    枚举成功后,现在第二步,一个简单的应用:上电后,设备能给PC机传输一个键盘PAGEDOWN按下的信号。实际上,我想实现一个PPT翻页器的功能。所以,这个USB设备就是一个USB键盘,键盘上就只有几个键。
今天就还是有很大收获的,呵呵,感谢jxin.

使用特权

评论回复
地板
beckham|  楼主 | 2012-1-17 21:30 | 只看该作者
我想问的是,如果是一个键盘HID类设备的话,下面这个函数USB_1_LoadEP (1, BUFF, COUNT); COUNT值应该是多少?BUFF应该是一个8元素的数组?

使用特权

评论回复
5
beckham|  楼主 | 2012-1-18 10:31 | 只看该作者
     函数USB_1_LoadEP (1, BUFF, COUNT); COUNT值应该是8,BUFF应该是一个8元素的数组。试验成功,看看键盘报告描述符就知道了。
   新的问题是:
   BYTE KeyData[8] = {0,0,0x5b,0,0,0,0,0};//按下PageDown键的报告描述符
   M8C_EnableGInt; //Enable Global Interrupts
    USB_1_Start(0); //Start USB Operation using device 0
    while (!USB_1_bGetConfiguration()); //Wait for Device to enumerate
    USB_1_LoadEP (1, KeyData, 8); //Begin initial USB transfers
    while(1)
    {
           if (USB_1_bGetEPAckState (1)) //Check and see if ACK has occured
          {       
        USB_1_LoadEP (1, KeyData, 8); //Load EP1 with keyboard data
          }
    //while(1);
    }       
如果不加红色的那一句,也就是必须不停的发送报告描述符,PC才能收到;如果加上红色的原地等待语句,也就是只发送一次报告,发现PC机没有反应,打开的PPT文档并没有翻页,应该怎么解决呢?

使用特权

评论回复
6
jxin| | 2012-1-18 11:14 | 只看该作者
只不过,HELP文档里是USB_Start(0)....要统统改成USB_1_Start(0); 函数都加一个1,不然编译通不过,自己调试发现的,呵呵。
> 当place一个USB 模块后, 默认的名字是USB_1, 这个名字可以改为任何你想要的名字,但是在调用USB的任何api时,名字都要给为新命名的名字。

现在对USB_1_LoadEP (1, abMouseData, 3);这个函数功能不太明白,HELP文档里介绍的不够详细,里面的参数有什么用呢?
> 你说的help文档是USB user module datasheet?

使用特权

评论回复
7
beckham|  楼主 | 2012-2-8 11:24 | 只看该作者
我说的help文档是USB user module datasheet。感觉不够详细,CY7C63系列的例子太少了。
以下程序实现联机时自动给PC机一次PAGEDOWN按键的信号(0X5D),实测时发现PC机一直在接收PAGEDOWN信号,这是为什么呢?明明我就发送了一次?
....
BYTE KeyData[8] = {0,0,0x5b,0,0,0,0,0};
....
M8C_EnableGInt; //Enable Global Interrupts
USB_1_Start(0); //Start USB Operation using device 0
while (!USB_1_bGetConfiguration()); //Wait for Device to enumerate
for (y1=0;y1<100;y1++)//must delay some time!!!
delay();
  USB_1_LoadEP (1, KeyData, 8); //Begin initial USB transfers
while (!USB_1_bGetEPAckState (1)); //Check and see if ACK has occured
while(1);
.....

用BUS HOUND监听数据发现如下内容:
  36.1  IN     00 00 5b 00  00 00 00 00  ..[.....              1374.1.0        
  37    IN     0d 00 51 00  00 00 00 00  ..Q.....              1375.1.0(3227)

使用特权

评论回复
8
xuelongzhiwu| | 2013-9-11 11:11 | 只看该作者
继续呀,学习了,还是很有用的。

使用特权

评论回复
9
someonewho| | 2013-10-21 22:36 | 只看该作者
挺详细的 了解了

使用特权

评论回复
10
justbybing| | 2013-10-21 23:04 | 只看该作者
楼主码字很辛苦啊 支持一下

使用特权

评论回复
11
G21372| | 2013-10-23 13:15 | 只看该作者
对初学者来说是个很有用资料

使用特权

评论回复
12
yangguangaisha| | 2013-10-23 13:30 | 只看该作者
这么详细初学者一定看得懂 赞一个

使用特权

评论回复
13
gexingyouxian| | 2013-10-23 13:40 | 只看该作者
楼主很强大 扫盲利器呀

使用特权

评论回复
14
acer4736| | 2013-10-23 22:42 | 只看该作者
很棒的资料 谢谢楼主

使用特权

评论回复
15
jinpaidianzi| | 2013-10-24 22:46 | 只看该作者
没有了吗 写的很详细 不错

使用特权

评论回复
16
teabottle| | 2013-10-24 22:53 | 只看该作者
留着了 以后给新手看

使用特权

评论回复
17
wangjinlili| | 2013-10-24 23:02 | 只看该作者
给初学者很棒的教材 赞一个

使用特权

评论回复
18
shibalihuandao| | 2013-10-25 20:00 | 只看该作者
这都是楼主的经验之谈啊 不容易 赞一个

使用特权

评论回复
19
sishangcine| | 2013-10-25 21:06 | 只看该作者
写的很详细 对新手来说也很好理解 赞一个

使用特权

评论回复
20
heibaiyinjiag| | 2013-10-25 21:14 | 只看该作者
楼主写的很好啊 正好不太懂 谢谢楼主了

使用特权

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

本版积分规则

81

主题

238

帖子

1

粉丝