CY68013学习分享(USB芯片)
一.源码结构
Fw.c:
需要首先完成特定的USB处理,然后才开始进行用户代码。
顺序执行以下操作
1.初始化变量,休眠模式,远程唤醒和自供电
2.初始化用户USB设备
3.固件程序中的定向USB描述符(用于指定usb设备的描述符)
4.使能usb各种中断
5.固件进行重列举(用于软件断开USB连接,然后以新的设备描述符来列举)
6.主循环,等待usb主机的请求
主循环中开始就是检测令牌指针标志位是否置位,然后进行数据请求解析和具体操作。主要的请求就是进行描述符的获取。用户请求处理操作。
Dscr.a51:主要是定义设备描述符的信息。在USB协议中,USB标准设备描述符包括设备描述符,配置描述符,接口描述符,端点描述符,字符串描述符,设备限定描述符合其他速率配置描述符。Dscr.a51详细描述符配置见附1.1.(感觉和程序其他宏定义没啥区别,都是赋值,然后在主程序中调用)
YJ.c:中断处理函数
I2c.c:IIC配置函数
USB软件主流程图如下所示:
USB控制传输分为三个阶段:
1. 建立阶段
2. 数据阶段
3. 状态阶段
注:每个阶段由特定的事务组成。每个事务又由三种类型的包组成。(令牌包,数据包,握手包)。令牌包可分为(IN包,OUT包,STEP包)。
整个控制传输流程如下图:
1.建立阶段
如果设备已收到主机要执行取得设备描述符的命令,设备就以握手封包来加以响应。因 此须注意的是,如果设备已准备接收的话就以ACK握手封包响应;如果尚未就绪就使用NAK握手封包响应;如果发生错误而停滞,就使用STALL握手封包响 应。
STEUP 中8字节DATA数据:
bmRequestType:这个字节在本项目中定义为:0x00(方向为主机到设备,标准请求,接收方是设备)
bRequest:为请求码,自定义请求码(0xB3 准备向FPGA写数据 0xB4 停止写数据),其他获取描述符功能码没变。
wLength:指示数据阶段所需传输的字节数,此值不能为零。
2.数据阶段
输出事务处理(OUT):表示上位机把一个数据包输出到usb设备中的过程。多数据包需要DATA0 DATA1切换发送。每个数据包最大为64字节(因为ep0buf最大为64字节)
3. 状态阶段
状态阶段:用来表示整个传输的过程已完全结束。
状态阶段传输的方向必须与数据阶段的方向相反,此程序中数据阶段的方向是是OUT令牌封包,这个阶段应为IN令牌封包,状态用DATA1发送
下图为一个OUT令牌实例:
附1.1:
1.设备描述符用于表示USB设备的总体信息包括设备类和设备子类。一个USB设备只能有一个设备描述符。经常需要更改的就是PID和VID。电脑端驱动,PID VID必须一致,不然会安装失败,win8,win10,在安装驱动时需要打开权限,才能安装成功。
2.配置描述符用于表示设备的配置信息,一个设备可以有多个配置,每个配置都必须包含一个配置描述符。
3.字符串描述符,用于保存一些供应商的名称,产品***等文本信息。
4.接口描述符,用于标书在USB设备中各个接口的特性包括接口号,端点个数,所属的设备类和子类。
5.端点描述符,这个描述符操作的比较多,在使用相应端点的时候都要先配置端点描述符。