⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 usbcore.c

📁 基于AT91SAM7S64单片机的USB口转Uart串行口的实现
💻 C
📖 第 1 页 / 共 3 页
字号:
/******************************************************************
   本程序只供学习使用,未经作者许可,不得用于其它任何用途
			
        欢迎访问我的USB专区:http://group.ednchina.com/93/
        欢迎访问我的blog:   http://www.ednchina.com/blog/computer00
                             http://computer00.21ic.org

UsbCore.c file

作者:电脑圈圈
建立日期: 2008.06.29
修改日期: 2009.03.09
版本:V1.1
版权所有,盗版必究。
Copyright(C) 电脑圈圈 2008-2018
All rights reserved            
*******************************************************************/

#include <AT91SAM7S64.H>
#include "config.h"
#include "AT91SAMxUSB.h"
#include "uart.h"
#include "usbcore.h"



uint8 Buffer[16];  //读端点0用的缓冲区

//USB设备请求的各字段
uint8  bmRequestType;
uint8  bRequest;
uint16 wValue;
uint16 wIndex;
uint16 wLength;
//当前发送数据的位置
uint8 * pSendData;
//需要发送数据的长度
uint16 SendLength;
//是否需要发送0数据包的标志。在USB控制传输的数据过程中,
//当返回的数据包字节数少于最大包长时,会认为数据过程结束。
//当请求的字节数比实际需要返回的字节数长,而实际返回的字节
//数又刚好是端点0大小的整数倍时,就需要返回一个0长度的数据包
//来结束数据过程。因此这里增加一个标志,供程序决定是否需要返回
//一个0长度的数据包。
uint8 NeedZeroPacket;

//当前的配置值。只有在设置非0配置后
uint8 ConfigValue;

//端点1缓冲是否忙的标志。当缓冲区中有数据时,该标志为真。
//当缓冲区中空闲时,该标志为假。
uint8 Ep1InIsBusy;

//端点3缓冲是否忙的标志。当缓冲区中有数据时,该标志为真。
//当缓冲区中空闲时,该标志为假。
uint8 Ep3InIsBusy;

//LineCoding数组,用来保存波特率、停止位等串口属性。
//初始化波特率为9600,1停止位,无校验,8数据位。
uint8 LineCoding[7]={0x80,0x25,0x00,0x00,0x00,0x00,0x08};

//USB设备描述符的定义
const uint8 DeviceDescriptor[0x12]=  //设备描述符为18字节
{
//bLength字段。设备描述符的长度为18(0x12)字节
 0x12,
 
//bDescriptorType字段。设备描述符的编号为0x01
 0x01,
 
//bcdUSB字段。这里设置版本为USB1.1,即0x0110。
//由于是小端结构,所以低字节在先,即0x10,0x01。
 0x10,
 0x01,
 
//bDeviceClass字段。本设备必须在设备描述符中指定设备的类型,
//否则,由于在配置集合中有两个接口,就会被系统认为是一个USB
//复合设备,从而导致设备工作不正常。0x02为通信设备类的类代码。
 0x02,
 
//bDeviceSubClass字段。bDeviceClass字段为0时,该字段也为0。
 0x00,
 
//bDeviceProtocol字段。bDeviceClass字段为0时,该字段也为0。
 0x00,
 
//bMaxPacketSize0字段。AT91SAM7的端点0大小为8字节。
 0x08,
 
//idVender字段。厂商ID号,我们这里取0x8888,仅供实验用。
//实际产品不能随便使用厂商ID号,必须跟USB协会申请厂商ID号。
//注意小端模式,低字节在先。
 0x88,
 0x88,
 
//idProduct字段。产品ID号,由于是第5个实验,我们这里取0x2105。
//注意小端模式,低字节应该在前。
 0x05,
 0x21,
 
//bcdDevice字段。1.0版吧,即0x0100。
//小端模式,低字节在先。
 0x00,
 0x01,
 
//iManufacturer字段。厂商字符串的索引值,为了方便记忆和管理,
//字符串索引就从1开始吧。
 0x01,

//iProduct字段。产品字符串的索引值。刚刚用了1,这里就取2吧。
//注意字符串索引值不要使用相同的值。
 0x02,
 
//iSerialNumber字段。设备的序列号字符串索引值。
//这里取3就可以了。
 0x03,

//bNumConfigurations字段。该设备所具有的配置数。
//我们只需要一种配置就行了,因此该值设置为1。
 0x01
};
//////////////////////////设备描述符完毕//////////////////////////////

//USB配置描述符集合的定义
//配置描述符总长度为9+9+5+5+4+5+7+9+7+7字节
const uint8 ConfigurationDescriptor[9+9+5+5+4+5+7+9+7+7]=
{
 /***************配置描述符***********************/
 //bLength字段。配置描述符的长度为9字节。
 0x09,
 
 //bDescriptorType字段。配置描述符编号为0x02。
 0x02,
 
 //wTotalLength字段。配置描述符集合的总长度,
 //包括配置描述符本身、接口描述符、类描述符、端点描述符等。
 sizeof(ConfigurationDescriptor)&0xFF, //低字节
 (sizeof(ConfigurationDescriptor)>>8)&0xFF, //高字节
 
 //bNumInterfaces字段。该配置包含的接口数,有两个接口。
 0x02,
 
 //bConfiguration字段。该配置的值为1。
 0x01,
 
 //iConfigurationz字段,该配置的字符串索引。这里没有,为0。
 0x00,
 
 //bmAttributes字段,该设备的属性。由于我们的板子是总线供电的,
 //并且我们不想实现远程唤醒的功能,所以该字段的值为0x80。
 0x80,
 
 //bMaxPower字段,该设备需要的最大电流量。由于我们的板子
 //需要的电流不到100mA,因此我们这里设置为100mA。由于每单位
 //电流为2mA,所以这里设置为50(0x32)。
 0x32,
 
 /*******************CDC类接口描述符*********************/
 //bLength字段。接口描述符的长度为9字节。
 0x09,
 
 //bDescriptorType字段。接口描述符的编号为0x04。
 0x04,
 
 //bInterfaceNumber字段。该接口的编号,第一个接口,编号为0。
 0x00,
 
 //bAlternateSetting字段。该接口的备用编号,为0。
 0x00,
 
 //bNumEndpoints字段。非0端点的数目。CDC接口只使用一个中断
 //输入端点。
 0x01,
 
 //bInterfaceClass字段。该接口所使用的类。CDC类的类代码为0x02。
 0x02,
 
 //bInterfaceSubClass字段。该接口所使用的子类。要实现USB转串口,
 //就必须使用Abstract Control Model(抽象控制模型)子类。它的
 //编号为0x02。
 0x02,
 
 //bInterfaceProtocol字段。使用Common AT Commands(通用AT命令)
 //协议。该协议的编号为0x01。
 0x01,
 
 //iConfiguration字段。该接口的字符串索引值。这里没有,为0。
 0x00,
 
 /***************以下为功能描述符****************/
 /********* Header Functional Descriptor ********/
 //bFunctionLength字段。该描述符长度为5字节
 0x05,
 
 //bDescriptorType字段。描述符类型为类特殊接口(CS_INTERFACE)
 //编号为0x24。
 0x24,
 
 //bDescriptorSubtype字段。描述符子类为Header Functional Descriptor
 //编号为0x00。
 0x00,
 
 //bcdCDC字段。CDC版本号,为0x0110(低字节在先)
 0x10,
 0x01,
 
 /**** Call Management Functional Descriptor ****/
 //bFunctionLength字段。该描述符长度为5字节
 0x05,
 
 //bDescriptorType字段。描述符类型为类特殊接口(CS_INTERFACE)
 //编号为0x24。
 0x24,
 
 //bDescriptorSubtype字段。描述符子类为Call Management 
 //functional descriptor,编号为0x01。
 0x01,
 
 //bmCapabilities字段。设备自己不管理call management
 0x00,
 
 //bDataInterface字段。没有数据类接口用作call management
 0x00,

 /*** Abstract Control Management Functional Descriptor ***/
 //bFunctionLength字段。该描述符长度为4字节
 0x04,
 
 //bDescriptorType字段。描述符类型为类特殊接口(CS_INTERFACE)
 //编号为0x24。
 0x24,
 
 //bDescriptorSubtype字段。描述符子类为Abstract Control 
 //Management functional descriptor,编号为0x02。
 0x02,

 //bmCapabilities字段。支持Set_Line_Coding、Set_Control_Line_State、
 //Get_Line_Coding请求和Serial_State通知
 0x02,

 /***  Union Functional Descriptor  **/
 //bFunctionLength字段。该描述符长度为5字节。 
 0x05,

 //bDescriptorType字段。描述符类型为类特殊接口(CS_INTERFACE)
 //编号为0x24。
 0x24,
 
 //bDescriptorSubtype字段。描述符子类为
 //Union functional descriptor,编号为0x06。
 0x06,
 
 //MasterInterface字段。这里为前面编号为0的CDC接口。
 0x00,
 
 //SlaveInterface字段,这里为接下来编号为1的数据类接口。
 0x01,

 /***********  以下为接口0的端点描述符  *******/
 //bLength字段。端点描述符长度为7字节。
 0x07,
 
 //bDescriptorType字段。端点描述符编号为0x05。
 0x05,
 
 //bEndpointAddress字段。端点的地址。这里使用端点3。
 //D7位表示数据方向,输入端点D7为1。所以输入端点3的地址为0x83。
 0x83,
 
 //bmAttributes字段。D1~D0为端点传输类型选择。
 //该端点为中断端点。中断端点的编号为3。其它位保留为0。
 0x03,
 
 //wMaxPacketSize字段。该端点的最大包长。端点1的最大包长为16字节。
 //注意低字节在先。
 0x10,
 0x00,
 
 //bInterval字段。端点查询的时间,这里设置为10个帧时间,即10ms。
 0x0A,
 
 /*********  以下为接口1(数据接口)的接口描述符  *********/
 //bLength字段。接口描述符的长度为9字节。
 0x09,
 
 //bDescriptorType字段。接口描述符的编号为0x04。
 0x04,
 
 //bInterfaceNumber字段。该接口的编号,第二个接口,编号为1。
 0x01,
 
 //bAlternateSetting字段。该接口的备用编号,为0。
 0x00,
 
 //bNumEndpoints字段。非0端点的数目。该设备需要使用一对批量端点,设置为2。
 0x02,
 
 //bInterfaceClass字段。该接口所使用的类。数据类接口的代码为0x0A。
 0x0A,
 
 //bInterfaceSubClass字段。该接口所使用的子类为0。
 0x00,
 
 //bInterfaceProtocol字段。该接口所使用的协议为0。
 0x00,
 
 //iConfiguration字段。该接口的字符串索引值。这里没有,为0。
 0x00,
 
 /*****  以下为接口1(数据类接口)的端点描述符  *****/
 /*************** 批量输入端点1描述符 ******************/
 //bLength字段。端点描述符长度为7字节。
 0x07,
 
 //bDescriptorType字段。端点描述符编号为0x05。
 0x05,
 
 //bEndpointAddress字段。端点的地址。我们输入端点1。
 //D7位表示数据方向,输入端点D7为1。所以输入端点1的地址为0x81。
 0x81,
 
 //bmAttributes字段。D1~D0为端点传输类型选择。
 //该端点为批量端点,批量端点的编号为0x02。其它位保留为0。
 0x02,
 
 //wMaxPacketSize字段。该端点的最大包长。端点2的最大包长为64字节。
 //注意低字节在先。
 0x40,
 0x00,
 
 //bInterval字段。端点查询的时间,这里对批量端点无效。
 0x00,
 
 /*************** 批量输出端点2描述符 ******************/
 //bLength字段。端点描述符长度为7字节。
 0x07,
 
 //bDescriptorType字段。端点描述符编号为0x05。
 0x05,
 
 //bEndpointAddress字段。端点的地址。我们使用输出端点2。
 //D7位表示数据方向,输出端点D7为0。所以输出端点2的地址为0x02。
 0x02,
 
 //bmAttributes字段。D1~D0为端点传输类型选择。
 //该端点为批量端点,批量端点的编号为0x02。其它位保留为0。
 0x02,
 
 //wMaxPacketSize字段。该端点的最大包长。端点2的最大包长为64字节。
 //注意低字节在先。
 0x40,
 0x00,
 
 //bInterval字段。端点查询的时间,这里对批量端点无效。
 0x00
};
////////////////////////配置描述符集合完毕//////////////////////////

/************************语言ID的定义********************/
const uint8 LanguageId[4]=
{
 0x04, //本描述符的长度
 0x03, //字符串描述符
 //0x0409为美式英语的ID
 0x09,
 0x04
};
////////////////////////语言ID完毕//////////////////////////////////

/**************************************************/
/*********        本转换结果来自         **********/
/********* Http://computer00.21ic.org    **********/
/*********        作者: 电脑圈圈         **********/
/*********         欢迎大家使用          **********/
/*********    版权所有,盗版请写明出处   **********/
/**************************************************/

//http://computer00.21ic.org/user1/2198/archives/2007/42769.html
//字符串“电脑圈圈的USB专区 Http://group.ednchina.com/93/”的Unicode编码

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -