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

📄 cmain70310.c

📁 一个DSP2407读取PUDID12USB芯片的源码
💻 C
字号:
//=============================================
//TMS320LF2407A USB1.0 CONTROLLER
//=============================================
#include "regs240x.h"
#include "usb.h"

typedef unsigned char   uint8;                   // 无符号8位整型变量         
typedef signed   char   int8;                    // 有符号8位整型变量         
typedef unsigned int  	uint16;                  // 无符号16位整型变量           
typedef signed   int  	int16;                   // 有符号16位整型变量           
typedef unsigned long   uint32;                  // 无符号32位整型变量           
typedef signed   long   int32;                   // 有符号32位整型变量           
typedef float           fp32;                    // 单精度浮点数(32位长度)     
typedef double          fp64;                    // 双精度浮点数(64位长度)     

typedef unsigned char   BOOLEAN;
typedef unsigned char   INT8U;          		// Unsigned  8 bit quantity
typedef signed   char   INT8S;          		// Signed    8 bit quantity
typedef unsigned int    INT16U;           		// Unsigned 16 bit quantity
typedef signed   int    INT16S;           		// Signed   16 bit quantity
typedef unsigned long  	INT32U;         		// Unsigned 32 bit quantity
typedef signed   long  	INT32S;         		// Signed   32 bit quantity
typedef float           FP32;           		// Single   precision floating point
typedef double          FP64;           		// Double   precision floating point
typedef unsigned long   DWORD;

#define   U8            INT8U          			// unsigned  8 bits.
#define   I16           INT16S         			// signed   16 bits.
#define   U16           INT16U         			// unsigned 16 bits.
#define   I32           INT32S         			// signed   32 bits.
#define   U32           INT32U         			// unsigned 32 bits.
#define   I16P          INT16S         			// signed   16 bits OR MORE !
#define   U16P          INT16U          		// unsigned 16 bits OR MORE !

//12 相关定义
#define D12_NOLAZYCLOCK			0x02
#define D12_CLOCKRUNNING        0x04
#define D12_SOFTCONNECT			0x10

#define D12_CLOCK_12M			0x03
#define D12_CLOCK_4M			0x0b
#define D12_SETTOONE            0x40

#define D12_INT_ENDP0OUT		0x01
#define D12_INT_ENDP0IN			0x02
#define D12_INT_ENDP1OUT		0x04
#define D12_INT_ENDP1IN			0x08
#define D12_INT_ENDP2OUT		0x10
#define D12_INT_ENDP2IN			0x20
#define D12_INT_BUSRESET		0x40
#define D12_INT_SUSPENDCHANGE	0x80
#define D12_INT_EOT				0x0100

#define	STATUS_ERR			1
#define	STATUS_OK			0

#define	UsbDevDescType		1
#define	UsbCfgDescType		2
#define	UsbStrDescType		3
#define	UsbItfDescType		4
#define	UsbEndpDescType		5
#define	UsbPwrDescType		6

#define	UsbDevDescSize		18
#define	UsbCfgDescSize		9
#define	UsbItfDescSize		9
#define	UsbEndpDescSize		7

#define	UsbEndpBulk			2
#define	UsbEndpInterrupt	3	

#define	Ep0PacketSize		16
#define	Ep1PacketSize		16
#define	Ep2PacketSize		64
#define	EndpCnt	4
#define	UsbTotalCfgDescSize	UsbCfgDescSize+UsbItfDescSize+EndpCnt*UsbEndpDescSize

#define	D12EpStall			1

//===================================
//设备描述符数据结构
//===================================
typedef struct 
{
	INT8U size;
	INT8U type;
	INT8U ver1;
	INT8U ver2;

	INT8U class;
	INT8U subclass;
	INT8U protocol;
	INT8U pktsize;
	INT8U vid1;					
	INT8U vid2;					

	INT8U pid1;					
	INT8U pid2;					
	INT8U pver1;				
	INT8U pver2;				
	INT8U stridx0;
	INT8U stridx1;
	INT8U stridx2;
	INT8U itfcnt;
}UsbDevDesc;

//===========================================
//全部描述符数据结构
//===========================================
typedef  struct
{
	UsbDevDesc DevDesc;	
	INT8U CfgDesc[9];
	INT8U ItfDesc[9];
	INT8U Endp2Desc[7];
	INT8U Endp3Desc[7];
	INT8U Endp4Desc[7];
	INT8U Endp5Desc[7];

}Drivpake;

//============================================
//描述符具体定义
//============================================
Drivpake static ThisDevDesc =			
{
	{								//设备描述符
		UsbDevDescSize,				//设备描述符长度,= 12H
		UsbDevDescType,				//设备描述符类型,= 01H
		
		
		0x10,						//协议版本,= 1.10
		0x01,						//协议版本,= 1.10
		
		0xdc,//0, 					//测试设备类型, = 0DCH	
		0, 0,						//设备子类,设备协议
		Ep0PacketSize,				//端点0最大数据包大小,= 10H	
		0x71,						//PHILIPS公司的设备ID
		0x04,						//PHILIPS公司的设备ID
		
		0x66,						//设备制造商定的产品ID
		0x06,						//设备制造商定的产品ID

		0x00,						//设备系列号
		0x01,						//设备系列号

		0, 0, 0,					//索引
		1							//可能的配置数
	},
	{								//配置描述符
		UsbCfgDescSize,				//配置描述符长度,= 09H
		UsbCfgDescType,				//配置描述符类型,= 02H
		UsbTotalCfgDescSize,		//描述符总长度, = 002EH
		0,
		1,							//只支持1个接口
		1,							//配置值
		0,							//字符串描述符指针(无)
		0x80,						//自供电,支持远程唤醒
		0x32						//最大功耗(100mA)
	},
		
	{								//接口描述符
		UsbItfDescSize,				//接口描述符长度,= 09H
		UsbItfDescType,				//接口描述符类型,= 04H
		0,							//接口数,只有1个
		0,							//可选配置,只有1个
		EndpCnt,					//除端点0的端点索引数目,= 04H
		0xdc,//UsbClassMassStorage,	//测试设备类型,= 0DCH
		0xa0,//UsbSubClassUfi,		//子类代码,= 0A0H	
		0xb0,//UsbProtocolBulk,		//协议代码,= 0B0H
		0							//字符串描述符索引
	},
//========================================
	{								//端点描述符,端点1输入
		UsbEndpDescSize,			//端点描述符长度,= 07H
		UsbEndpDescType,			//端点描述符类型,= 05H
		0x81,						//端点1 IN
		UsbEndpInterrupt,			//中断传输, = 03H
		Ep1PacketSize,				//端点最大包的大小,= 0010H
		0,							//传输间隔时间,= 10ms
		10
	},
	{								//端点描述符,端点1输出
		UsbEndpDescSize,			//端点描述符长度,= 07H
		UsbEndpDescType,			//端点描述符类型,= 05H
		0x01,						//端点1 OUT
		UsbEndpInterrupt,			//中断传输,= 03H
		Ep1PacketSize,				//端点最大包的大小,= 0010H
		0,							//传输间隔时间,= 10ms
		10
	},
//========================================

	{								//端点2输入
		UsbEndpDescSize,			//端点描述符长度,= 07H
		UsbEndpDescType,			//端点描述符类型,= 05H
		0x82,						//端点2 OUT
		UsbEndpBulk,				//批量传输,= 02H
		Ep2PacketSize,				//端点最大包的大小,= 0040H
		0,							//批量传输时该设备无效
		10
	},
	{								//端点2输出
		UsbEndpDescSize,			//端点描述符长度,= 07H
		UsbEndpDescType,			//端点描述符类型,= 05H
		0x2,						//端点2 IN	
		UsbEndpBulk,				//批量传输,= 02H
		Ep2PacketSize,				//端点最大包的大小,= 0040H
		0,							//批量传输时该设备无效
		10
	}					
};

static 	char SetupPkt[8];
static INT8U usb_remote_wake;
static INT8U UsbSendDescF;
static INT8U usb_config;
static int send_remain;
static INT32U send_ptr;

INT8U receive_buf[100];     

unsigned int USBID0;
unsigned int USBID1;
unsigned int USBint_reg1;
unsigned int USBint_reg2;
unsigned int P0lstin_status;
unsigned int P0lstout_status;
//========================================
void 	ep0_rxdone(void);
void 	ep0_txdone(void);
void 	UsbSendDesc(void);
void 	D12AckEp(INT8U Ep);
void 	D12SelEp(INT8U Ep);
void 	D12SetEp(INT8U Val);
void 	D12RdEpStat(INT8U Ep);
void 	D12SetAddr(INT8U Addr);
void 	D12RdLastTrStat(INT8U Ep);
void 	outportb(INT8U port, INT8U val);
void 	D12SetEpStat(INT8U Ep,INT8U Stat);
void 	D12SetMode(INT8U Val1, INT8U Val2);
INT8U 	inportc(void);
INT8U 	D12RdInt(void);
INT8U 	inportb(INT8U port);
INT8U 	D12WrEp(INT8U Ep, char *buf,INT8U cnt);
INT8U 	D12RdEp(INT8U Ep, char *buf, INT8U cnt);

//========================================
// 函数名称: void bus_delay(void)
// 功能描述: 总线延时
// 输   入: 无
// 输   出: 无
//========================================
void bus_delay(void)
{
	INT8U i;
	//i = D12_NOP;			
	for(i=0;i<10;i++);
}
/*
DELAY:
	DMOV R


*/

//========================================
// 函数名称: void outportc(INT8U Data)
// 功能描述: 输出命令
// 输   入: INT8U Data:    命令字节
// 输   出: 无
//========================================
void outportc(INT8U Data)
{
	bus_delay();				
	D12_COM = Data;				
}

//========================================
// 函数名称: void outportd(INT8U Data)
// 功能描述: 输出数据
// 输   入: INT8U Data:    数据字节
// 输   出: 无
//========================================
void outportd(INT8U Data)
{
	bus_delay();				
	D12_DAT = Data;				
}

//========================================
// 函数名称: INT8U inportd(void)
// 功能描述: 读入数据
// 输   入: 无
// 输   出: 读到的数据
//========================================
INT8U inportd(void)
{
	bus_delay();				
	return D12_DAT;				
}

INT8U inportc(void)
{
	bus_delay();			
	return D12_COM;			
}

void outportb(INT8U port, INT8U val)
{
	INT8U i;
	if(port)
		outportc(val);				//while port=1 it is for command
	else
		outportd(val);				//while port=1 it is for command
		
	i = 25;							//延时,使得读写周期大于500ns
	while(i--);
}

INT8U inportb(INT8U port)
{
	INT8U c;
	INT8U i;
	if(port) c = inportc();
	else c = inportd();
	i = 25;							//延时,使得读写周期大于500ns
	while(i--);
	return c;
}

//========================================
// 函数名称: void D12_SetMode(INT8U bConfig,INT8U bClkDiv)
// 功能描述: 模式设置
// 输   入: INT8U bConfig:  配置字节信息
//	     	 INT8U bClkDiv:  分频系数
// 输   出: 无
//========================================
void D12_SetMode(INT8U bConfig,INT8U bClkDiv)
{
	outportc(0xF3);				//输出设置模式指令
	outportd(bConfig);			//输出配置字节信息
	outportd(bClkDiv);			//输出时钟分频因数字节
}

//========================================
// 函数名称: INT16U D12_ReadInterruptRegister(void)
// 功能描述: 读取中断寄存器值
// 输   入: 无
// 输   出: 中断寄存器值
//========================================
INT16U D12_ReadInterruptRegister(void)
{
	INT8U b1;
	INT16U j;

	outportc(0xF4);				//读取中断寄存器命令
	b1 = inportd();				//读取低8位字节
	j = inportd();				//读取高8位字节

	j = j * 256;			
	j += b1;					//组合为16位

	return j;
}

//========================================
// 函数名称: INT8U D12_ReadEndpointStatus(INT8U bEndp)
// 功能描述: 读取端点状态
// 输   入: INT8U bEndp:   端点索引号,取值0 ~ 5
// 输   出: 端点状态
//========================================
INT8U D12_ReadEndpointStatus(INT8U bEndp)
{
	INT8U c;

	outportc(0x80 + bEndp);				//读取端点状态命令
	c = inportd();						//读取端点状态
	return c;
}

//========================================
// 函数名称: INT8U D12_ReadLastTransactionStatus(INT8U bEndp)
// 功能描述: 读取最后处理状态寄存器

⌨️ 快捷键说明

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