书接上回
接下来,是两个用户自定义的请求;
case SC_SetData: //向端口发送数据
DR_SetData();
break;
case SC_ReadData: //读端口数据
DR_ReadData();
break;
//用户添加
#define SC_SetData 0xB1 //自定义请求
#define SC_ReadData 0xB2 //自定义请求
下来看DR_SetData();
BOOL DR_SetData(void) //向端口发送数据
{
EP0BUF[0]=0xB1;
EP0BCH=0;
EP0BCL=2;
EZUSB_Delay(100);
OED=0xFF; //OED定义为输出端口
IOD=EP0BUF[1];
EP0CS |= bmHSNAK;
return(TRUE);
}
1、向EP0BUF[0]写0xB1;
2、写字节计数寄存器;
3、延时100ms;
4、将Port E设置成输出;
5、将EP0BUF[1]赋给Port E;
6、
文档中关于Port D的介绍如下;
而函数DR_ReadData();是函数DR_SetData();的逆过程,不再赘述,只在此贴出代码:
BOOL DR_ReadData(void) //读端口数据
{
OED=0x00; //OED定义为输入端口
EP0BUF[0]=0xB2;
EP0BUF[1] =IOD;
EP0BCH=0;
EP0BCL=2;
EP0CS |= bmHSNAK;
return(TRUE);
}
下面这段代码可忽略:
default: // *** Invalid Command
if(DR_VendorCmnd())
EZUSB_STALL_EP0(); // Stall End Point 0
最后,
// Acknowledge handshake phase of device request
EP0CS |= bmHSNAK;
这句话解释了前面的代码,缺少清除HSNAK的语句。