【68013】控制端口EP0使用
世界Skill
本文章将会说明68013控制端口EP0的使用方法。
简述
控制端口EP0是一个特殊的端口,该端口永远不会被死锁,在每次发送数据时会清空上一次的错误信息,主要用于传输一些控制指令。
EP0传输的指令有三种,用户自定义的指令是vendor类型。
PC端
前面贴中已经说过应用API实例化USB对象的方法,如果要使用EP0端口,只需要使用实例化的控制端口的XferData端口即可,不过要注意待传输的数据,控制端口传送的数据结构为:
令牌包+数据段
令牌包的作用是定义此次端口要实现的功能,数据段中则是需要传输的数据,令牌包的结构为:
Direction //指定端口类型,建议使用CyConst中的属性,比如此处想通过EP0向设备发送一个包,则使用DIR_TO_DEVICE属性。
ReqType //请求类型,一般选择CyConst.REQ_VENDOR表明为用户定义指令。
ReqCode //请求代码,这个是进入了某个类型的请求时需要进入的响应函数的分支,响应函数具体设计见下面。
Target //接收方设置。
Index //根据请求类型和请求代码按照需求设定。
Value //根据请求类型和请求代码按照需求设定。
数据段则是在令牌包后需要传输的数据,最多64bytes。
设置完成后,调用XferData传输即可。
固件部分
此处将会说明EP0使用的固件端。
前面的帖子已言,在FW.c内有一个控制指令响应函数,这个函数中有一个case分支,用户可以增加选项或者直接改写分支对应的响应函数来实现自己想要实现的功能。
分支的标识即为上位机EP0令牌包中的ReqCode,68013通过此数据选择进入的分支,执行响应的请求,例如我在在此处添加了两个自定义请求:
case 0xFF:
if (RstAll())
break;
case 0xFE:
if (GetState())
break;
第一个指令请求复位,第二个指令请求获取当前状态。
在分支中调用的函数由自己定义,原则上放在FW.c和自定义的slave.c内都可以,这里建议放在slave.c内,尽量不要在前一个文件中添加内容。
复位函数如下:
BOOL RstAll(void)
{
FIFORESET = 0x80;
SYNCDELAY;
FIFORESET = 0x02;
SYNCDELAY;
FIFORESET = 0x06;
SYNCDELAY;
FIFORESET = 0x00;
SYNCDELAY;
EP2FIFOCFG = 0x00;
SYNCDELAY;
EP2FIFOCFG = 0x10; //8bits
SYNCDELAY;
EP6FIFOCFG = 0x00;
SYNCDELAY;
EP6FIFOCFG = 0x09;
SYNCDELAY;
EP6AUTOINLENH = 0x02;
SYNCDELAY;
EP6AUTOINLENL = 0x00;
SYNCDELAY;
INPKTEND = 0x84;
SYNCDELAY;
INPKTEND = 0x84;
SYNCDELAY;
INPKTEND = 0x84;
SYNCDELAY;
INPKTEND = 0x84;
SYNCDELAY;
return( TRUE );
}
获取状态的函数也差不多,将请求类型设置为读取,然后在函数中将某些寄存器的值赋给EP0BUF数组中的元素,最后写EP0BCH/L即可。