采用PDIUSBD12的USB系统固件程序设计
单片机与PDIUSBD12的通信主要是靠单片机给PDIUSBD12发命令和数据来实现的。PDIUSBD12的命令字分为三种:初始化命令字、数据流命令字和通用命令字。PDIUSBD12数据手册给出了各种命令的代码和地址。单片机先给PDIUSBD12的命令地址发命令,根据不同命令的要求再发送或读出不同的数据。因此,可以将每种命令做成函数,用函数实现各个命令,以后直接调用函数即可。
下面的程序是处理主机的标准控制请求的一个模板:
unsigned char ENDPOINT_A0_FIFO[8];
//判断输入的是SETUP请求,并将其读入缓冲区ENDPOINT_A0_FIFO
…
if((ENDPOINT_A0_FIFO[0] & 0b011000000)==0x00)
{
if(ENDPOINT_A0_FIFO[1]<=0C)
{
(*StandardFunctionTable[ENDPOINT_A0_FIFO[1]])();
return;
}
}
…
const void (*StandardFunctionTable[])(void)=
{
GetSatus,ClearFeature,USB_Reserved,SetFeature,
USB_Reserved,SetAddress,GetDescriptor,SetDescriptor,
GetConfiguration,SetConfiguration,GetInterface,
SetInterface,SynchFrame
};
USB设备在正常使用以前,必须由主机配置设备。主机一般会从USB设备获取配置信息后再确定此设备有哪些功能。
作为配置操作的一部分,主机会设备设备的配置值,如果必要的话会选择合适的接口备选设备。其初始化函数为:
void D12_int()
{ XmtBuff.pNum=16;
D12_COMMAND=0xf4;//读中断寄存器
ist=D12_DATA;
ist=D12_DATA;
if(ist & 0x01) //ENDP0_OUT
{XmtBuff.out=0;
XmtBuff.in=1;
D12_COMMAND=0x40; //读OUT最后状态
ist=D12_DATA;
if(ist & 0x20)//收到SETUP包
《采用PDIUSBD12的USB系统固件程序设计(第2页)》