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

📄 usb_test.c

📁 2812 USB程序
💻 C
📖 第 1 页 / 共 2 页
字号:
#include <stdlib.h>
#include "DSP28_Device.h"

#include "type.h"
#include "sx2.h"
#include "descriptors.h"
#include "DEC2812_USB.h" 
#include "ep0req.h"

void convertdecto127(unsigned int input);

unsigned int put;

//unsigned int count;
//long number[1000];

//interrupt void ISRTimer2(void);
interrupt void IST1PINT(void);

BOOL Load_descriptors(char length, char* desc);
BOOL Write_SX2reg(unsigned char addr, unsigned int value);
BOOL SX2_comwritebyte(unsigned int value);
BOOL SX2_FifoWrite(int channel,unsigned int *pdata,unsigned length);
BOOL SX2_FifoWriteSingle(int channel,unsigned int pdata);
unsigned int SX2_FifoReadSingle(int channel);
interrupt void XINT1_ISR_A(void);

extern char desctbl[];

unsigned char keepAliveCnt;	/* counter of Timer0 interrupts */
HANDLE codec_command =0;
HANDLE codec_data=0;
unsigned int FifoWriteCnt = 0;
unsigned int epdatar2[256] ={0};
unsigned int epdatar4[256] ={0};
unsigned int epdataw6[256] ={0}; 
unsigned int epdataw8[256] ={0};  

unsigned int irqValue;			 /* interrupt register value */
unsigned int setupBuff[8];		 /* setup transaction buffer */
BOOL sx2Ready;			 /* status byte for POST */ 
BOOL sx2BusActivity;	 /* status byte for suspend */ 
BOOL sx2EnumOK;			 /* status byte for enumeration complete */
BOOL sx2EP0Buf;			 /* status for endpoint 0 buffer */
BOOL sx2Setup;			 /* setup flag set in Int0() ISR */
BOOL FLAGS_READ = FALSE; /*FIFO的状态读请求*/
unsigned int INT_STATUS;
unsigned int SX2_int;   

BOOL readFlag;

unsigned int usbtimeout = 0x400;
unsigned int regdataread = 0; 	

unsigned int Fifolong = 0;     /*FIFO的长度*/

unsigned int setupCnt = 0;
static BOOL setupDat = FALSE;

void main(void)
{
    unsigned int regValue = 0;
//	unsigned int Sx2int = 0;     /*SX2的中断状态*/
	unsigned int Usb2or11= 1;    /*USB工作在哪一个标准上*/
	unsigned int i = 0;
	unsigned int FifoStatus24 = 0;	/*FIFO24的状态标识*/
	unsigned int FifoStatus68 = 0; 	/*FIFO68的状态标识*/
	unsigned int Fifostatus = 0;
	BOOL hshostlink = FALSE; /*为真是高速USB接口,为假是低速USB接口*/
//	BOOL codec_runing = FALSE;
//	BOOL codec_halt = FALSE;
//	BOOL codec_rev = FALSE;
//	BOOL codec_play = FALSE;
//	BOOL codec_datok = FALSE;
//	BOOL codec_horfull = TRUE;
//	BOOL codec_back = FALSE;  
//	BOOL sx2EnumOK = FALSE;
//	unsigned int codec_count = 0;
//	unsigned int codec_sample = 0;
//	unsigned int codec_regvalue = 0;
//	unsigned int audiodata =0;
	unsigned int RecievedDataLongth = 0;
//	unsigned int LedCount = 0; /*记录LED定时器的次数*/
	unsigned int DataToEndpoint0 = 0;/*写入到Endpoint0的数据缓冲*/
//	unsigned long flashbaddr = 0;
//	unsigned int flashdata = 0;
//	unsigned int flasherr = 0;
//	unsigned long flashlong = 0;

    put=0x0ff00;
    for(i=0;i<256;i++)
    {
       epdatar2[i] = 2;
       epdatar4[i] = 4;
       epdataw6[i] = 6; 
       epdataw8[i] = 8; 
    }       
	/*初始化系统*/
	InitSysCtrl();
	/*关中断*/
	DINT;
	IER = 0x0000;
	IFR = 0x0000;

	/*初始化PIE*/
	InitPieCtrl();

	/*初始化PIE中断矢量表*/
	InitPieVectTable();	
	
	/*初始化外设*/
	InitPeripherals();
	
	/*初始化GPIO*/
	InitGpio1();
	
	InitEv();
	
	/*EvaRegs.EVAIMRA.bit.T1PINT=1;
    EvaRegs.EVAIFRA.bit.T1PINT=1;
	
	PieCtrl.PIEIER2.all=M_INT4;//周期中断 TIPINT=0X0008
    PieCtrl.PIEIER3.all=M_INT1;*/
    //PieCtrl.PIEIER2.all=M_INT5;/*比较中断0X0010*/
	
	EALLOW;	// This is needed to write to EALLOW protected registers
	PieVectTable.XINT1 = &XINT1_ISR_A;
	//PieVectTable.T1PINT=&IST1PINT;
	EDIS;   // This is needed to disable write to EALLOW protected registers
	
	/*初始化ZONE 1区*/
	//InitXintf();
	/*初始化外部中断*/
	InitXIntrupt();
	
	*USB_STS = 1;
	
	/*开中断*/
    
   IER |= (M_INT1 | M_INT14 | M_INT2);
    
	for(;;)
    	{
    		if(GpioDataRegs.GPEDAT.bit.GPIOE0 == 0)
    		{
    			InitGpio();
    			SX2_int = *USB_COMMAND & (SX2_INT_ENUMOK + SX2_INT_READY);
    			if(SX2_int)
    			{
    				EINT;   // Enable Global interrupt INTM
					ERTM;	// Enable Global realtime interrupt DBGM
				break;
			}
		}
		else
		{
			InitGpio();
			SX2_int = *USB_COMMAND & (SX2_INT_ENUMOK + SX2_INT_READY);
			EINT;   // Enable Global interrupt INTM
			ERTM;	// Enable Global realtime interrupt DBGM
			break;
		}
    	}
	
	
	for(;;)
	{
		/* initialize global variables */
		readFlag 		= FALSE;	/* false until register read */
		sx2Ready		= FALSE;	/* false until POST or wakeup */
		sx2BusActivity	= FALSE;	/* false until absence or resumption of USB bus activity */
		sx2EnumOK		= FALSE;	/* false until ENUMOK interrupt */
		sx2EP0Buf		= FALSE;	/* false until EP0BUF interrupt */
		sx2Setup		= FALSE;	/* false until SETUP interrupt */
		
		/* Initialize global variables specific to this test firmware */
		keepAliveCnt		= 0;

		/* Initialize local variables */
		/* reusable variable for read register data */
		regValue			= 0;
		if(!Load_descriptors(DESCTBL_LEN, &desctbl[0]))
		{
			while(TRUE);
		}
		
		/*装载描述表后,等待自举成功*/
		while(1)
		{
			if(sx2EnumOK == TRUE)
			{
				break;
			}
		}

		/*设置当前的接口的形式*/
		Write_SX2reg(SX2_IFCONFIG , 0xE8);
		/*设置当前系统中各使能信号的极性
		  其中SLOE、SLRD、SLWR只能有EEPROM来配置*/
		Write_SX2reg(SX2_FIFOPOLAR, SX2_WUPOL | SX2_EF | SX2_FF);
		/*读取当前工作在哪个USB的标准*/
		Read_SX2reg(SX2_FNADDR, &Usb2or11);
		hshostlink = (Usb2or11 & SX2_HSGRANT) ? TRUE : FALSE;
		/*初始化USB的工作状态*/
		if(hshostlink ==TRUE)
		{
			/*工作在2.00标准,设定数字接口为16位,数据包的大小为512字节*/
			Fifolong = 0x100;
			Write_SX2reg(SX2_EP2PKTLENH , SX2_WORDWIDE | 0x02);
			Write_SX2reg(SX2_EP2PKTLENL , 0x00);
			Write_SX2reg(SX2_EP4PKTLENH , SX2_WORDWIDE | 0x02);
			Write_SX2reg(SX2_EP4PKTLENL , 0x00);
			Write_SX2reg(SX2_EP6PKTLENH , SX2_WORDWIDE | 0x02);
			Write_SX2reg(SX2_EP6PKTLENL , 0x00);
			Write_SX2reg(SX2_EP8PKTLENH , SX2_WORDWIDE | 0x02);
			Write_SX2reg(SX2_EP8PKTLENL , 0x00);
		}
		else
		{
			/*工作在1.1标准,设定数字接口为16位,数据包的大小为64字节*/
			Fifolong =0x20;
			Write_SX2reg(SX2_EP2PKTLENH , SX2_WORDWIDE);
			Write_SX2reg(SX2_EP2PKTLENL , 0x40);
			Write_SX2reg(SX2_EP4PKTLENH , SX2_WORDWIDE);
			Write_SX2reg(SX2_EP4PKTLENL , 0x40);
			Write_SX2reg(SX2_EP6PKTLENH , SX2_WORDWIDE);
			Write_SX2reg(SX2_EP6PKTLENL , 0x40);
			Write_SX2reg(SX2_EP8PKTLENH , SX2_WORDWIDE);
			Write_SX2reg(SX2_EP8PKTLENL , 0x40);
		}
		/*设置FLAGSA为FIFO6的空的标志位;
		  设置FLAGSB为FIFO8的空的标志位;
		  FLAGSC与FLAGSD的状态为默认的状态*/
		Write_SX2reg(SX2_FLAGAB , SX2_FLAGA_FF6 | SX2_FLAGB_FF8); 
		/*清空所有的节点*/
		Write_SX2reg(SX2_INPKTEND, SX2_CLEARALL);
		Read_SX2reg(SX2_EP68FLAGS, &FifoStatus68);
		
		
		//自举后进行主程序的循环
		while(sx2EnumOK)
		{
		   	//读FIFO状态
			if(FLAGS_READ)
			{
				FLAGS_READ = FALSE;
				//FIFO24状态的读取
					if(Read_SX2reg(SX2_EP24FLAGS, &FifoStatus24))
					{
						//确定是否有FIFO满
						Fifostatus = FifoStatus24;
						if(!(Fifostatus & SX2_EP2EF))
						{						
							RecievedDataLongth = 256;
							for(i = 0;i<RecievedDataLongth;i++)
							{
								epdatar2[i] = SX2_FifoReadSingle(ENDPOINT2);
							//	SX2_FifoWriteSingle(ENDPOINT6,epdatar[i]);
							}						
							SX2_FifoWrite(ENDPOINT6,&epdatar2[0],RecievedDataLongth);
							//小于整数据包的数据提交SX2发送给主机
							if(RecievedDataLongth<(Fifolong-1))
							{
								Write_SX2reg(SX2_INPKTEND, 0x06);	
							}							
						}
						Fifostatus = FifoStatus24;
						if(!(Fifostatus & SX2_EP4EF))
						{
     					    RecievedDataLongth = Fifolong;
							for(i = 0;i<RecievedDataLongth;i++)
							{
								epdatar4[i] = SX2_FifoReadSingle(ENDPOINT4);
							//	SX2_FifoWriteSingle(ENDPOINT6,epdatar[i]);
							}										   
							SX2_FifoWrite(ENDPOINT8,&epdatar4[0],RecievedDataLongth);
							//小于整数据包的数据提交SX2发送给主机
							if(RecievedDataLongth<(Fifolong-1))
							{
								Write_SX2reg(SX2_INPKTEND, 0x08);	
							}	
						}	
					}//FIFO24状态的读取
					//FIFO68状态的读取
					if(Read_SX2reg(SX2_EP68FLAGS, &FifoStatus68))
					{
						//无操作,可由用户测试使用		
					}	
				}//不是音频传送
		   	//关于setup中断的处理
			if(sx2Setup)
			{
				//清SETUP数据读的标志
				sx2Setup = FALSE;
				//解析OUT类型的命令申请
				if(setupBuff[0] == VR_TYPE_OUT)
				{
					//分析命令类型
					switch(setupBuff[1])
					{	
						//写操作	
						case VR_BULK_WRITE:
							//清空节点6与8
							//Write_SX2reg(SX2_INPKTEND, 0xc0);
							switch (setupBuff[2])
							{
								case ENDPOINT6:
									//写入节点6
									for(i = 0;i<0x100;i++)
									{
										epdataw6[i] = i*2;	
									}
									//读当前FIFO的状态,是否已满
//									regValue = *USB_STS;
//									FifoWriteCnt = 0;
									SX2_FifoWrite(ENDPOINT6,&epdataw6[0],Fifolong);
									if(hshostlink == TRUE)
									{
										Write_SX2reg(SX2_INPKTEND, 0x06);
									}
									//写0到EP0的计数寄存器,结束本次控制握手
									Write_SX2reg(SX2_EP0BC, 0);
									break;
								case  ENDPOINT8:
									//写入节点8
									for(i = 0;i<0x100;i++)
									{
										epdataw8[i] = i*2+1;
									}
									//读当前FIFO的状态,是否已满
//									regValue = *USB_STS;
									SX2_FifoWrite(ENDPOINT8,&epdataw8[0],Fifolong);
									if(hshostlink == TRUE)
									{
										Write_SX2reg(SX2_INPKTEND, 0x08);
							        }
									//写0到EP0的计数寄存器,结束本次控制握手
									Write_SX2reg(SX2_EP0BC, 0);
									break;
								case 4 :
									//写0到EP0的计数寄存器,结束本次控制握手
									Write_SX2reg(SX2_EP0BC, 0);
									break;
								default:
									//写0到EP0的计数寄存器,结束本次控制握手
									Write_SX2reg(SX2_EP0BC, 0);
									break;	
							}	
							break;	
						default:
							//不支持的请求
							//写非零数到SX2_SETUP,取消此请
							Write_SX2reg(SX2_SETUP, 0xff);
							break;	
					}//分析命令类型
				}
				else
				{
					//解析IN类型的命令申请
					if(setupBuff[0] == VR_TYPE_IN)
					{
						//分析命令类型

⌨️ 快捷键说明

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