采用PDIUSBD12的USB系统固件程序设计
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包
{ Setup_read();
Setup_control();
}
else
{ Setup_read();
}
}
else if(ist 0x02)//ENDP0_IN
{ XmtBuff.in=1;
D12_COMMAND=0x41;//读in最后状态
ist=D12_DATA;
USB_submit();
}
else if(ist 0x04)//ENDP1_OUT
{ XmtBuff.out=2;
XmtBuff.in=3;
D12_COMMAND=0x42;//读out最后状态
ist=D12_DATA;
read_out();
}
else if(ist 0x08)//ENDP1_IN
{ XmtBuff.in=3;
D12_COMMAND=0x43;//读in最后状态
ist=D12_DATA;
XmtBuff.b[0]=5;
XmtBuff.wrLength=1;
XmtBuff.p=XmtBuff.b;
USB_submit();
}
……
在发出连接USB命令后,主机先读取设备描述符,然后发出设置USB地址SETUP包,设置USB地址后,进行主机客户驱动与设备初始化。其余端点(ENDPOINT)依此类推。
在其头文件里需定义USB规范中的各种描述符格式,包括设备描述表、配置描述表、接口描述表、端点描述表、字符串描述表以及描述表类型。这样,在发送配置[,接口(1),端点(1),接口(2),端点(2),…,类,厂商等]联合描述表时,主机USBD可以根据描述类型标识区分各种分描述表。
下面是固件程序的主循环部分:
#includereg51.h>
//指向外部D12访问地址
#define D12_COMMAND(*(unsigned char xdata *)0xff01)
#define D12_DATA (*(unsigned char xdata *)0x7f02)
extern void D12_int();
sbit D12_suspend=P1^0;
sbit D12_int_n=P1^1;
sbit D12_eot_n=P1^2;
sbit D12_DMAck_n=P1^3;
sbit D12_DMAreq=P1^4;
void main(void)
{
unsigned char ist;
P1=0xff;
D12_COMMAND=0xf3;
D12_DATA=0x06;//设置模式0
D12_DATA=0x03;//初始化频率12MHz
D12_COMMAND=0xd0;
D12_DATA=0x80;//设置地址0使能
D12_COMMAND=0xf3;//连接主机
D12_DATA=0x16;
while(1)
{ if(!D12_int_n)
{
D12_int();
}
}
}
在编写USB的固件程序时,需要注意:
①单片机的中断应设置为电平触发;中断后一定要读上次传输状态寄存器(命令40~45H),以清除中断寄存器中的中断标志。这样,PDIUSBD12的中断输出才能变回高电平,这一点非常重要。
②在接收到Setup包后,一定要调用D8命令重新使能端口0。
③在向IN端写完数据后,一定调用命令FAH,指明缓冲区中的数据有效,可以发送到主机。
④读写数据后,一定调用命令F2H,以保证可以接收新的包。
⑤可以通过调用命令FDH,检查PDIUSBD12是否工作。该命令要读两个字节数据。
固件程序的编程是整个USB外设开发中非常重要的一环,它直接影响到设计开发的产品的数据传输速度。例如,采用不同的传输类型、设置不同的分组大小、是否采用DMA方式、传输缓冲区的大小等都会使得传输速率发生很大的变化。还有在高速情况下的超时处理等,也包含了很多的内容。
总之,在USB技术应用越来越广泛的今天,只有掌握了固件程序的编写,才可能开发出一个好的USB产品。
- 基于DSP的PDIUSBD12芯片的应用开发(07-02)
- 基于引言DSP平台的USB接口设计(11-30)
- 基于DSP平台的USB接口设计(11-28)
- 基于DSP的PDIUSBD12芯片系统的应用开发(07-06)
- USB硬件原理图(10-12)
- 采用PDIUSBD12芯片的USB应用开发(05-02)