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

📄 usb_user.c

📁 采用USB单片机开发的TMS320C6701/C6201系统的在线升级模块
💻 C
字号:
/*
	File Name	:	USB_USER.C

	Description	: 	Read and Write DSP memory by USB communication.
	              
	Programmer	:	Jack Song

	Make Data	:  2005.6.7 

	Change		:  xxxx...(Name) yyyy,mm.dd(Date)

	Version		:   1.00
*/
#include <c8051f320.h>
#include "USB_REGISTER.h"

#define  c_cUSER
#include <USB_USER.h>



void  Fun_Pro_Main()
{
	g_ucFStatus = FS_CMD;
	g_ucHostCmd = CMD_OTHERS;
	while(1)
	{
		switch (g_ucFStatus)
		{
			case	FS_CMD:
					if(g_ucUsbFlag)
					{	g_ucUsbFlag = 0;
						g_ucHostCmd = g_ucUsbGData[0];
						switch (g_ucHostCmd)
						{
							case	CMD_TEST:
									Fun_Pro_Test();
									POLL_WRITE_BYTE(INDEX, 1);           // Set index to endpoint 1 registers
									Fun_Fifo_Write(FIFO_EP1, 2, &g_ucUsbSData);	
									POLL_WRITE_BYTE(EINCSR1, rbInINPRDY);
									break;
							case	CMD_READ_EINIT:
									Fun_Pro_ReadEinit();
									break;
							case	CMD_WRITE_EINIT:
									Fun_Pro_WriteEInit();
									POLL_WRITE_BYTE(INDEX, 1);           // Set index to endpoint 1 registers
									Fun_Fifo_Write(FIFO_EP1, 2, &g_ucUsbSData);	
									POLL_WRITE_BYTE(EINCSR1, rbInINPRDY);
									break;
							case	CMD_READ_CODE:
									Fun_Pro_ReadCode();
									break;
							case	CMD_WRITE_CODE:
									g_ulDestAdd = g_ucUsbGData[1] + g_ucUsbGData[2]*256 + g_ucUsbGData[3]*256*256 + g_ucUsbGData[4]*256*256*256;
									g_uiCodeLength = g_ucUsbGData[5] + g_ucUsbGData[6]*256;
									g_ucFStatus = FS_DATA; 
							//		Fun_Pro_WriteCode();
									break;
							default:    break;
						}
					}				
					break;
			case	FS_DATA:
					if(g_ucUsbFlag)
					{
					//	Fun_Pro_WriteCode();					
						Hpi_Write_Section(g_ulDestAdd,g_ucUsbGData,g_ucCount); //write data to 6201 memory
						g_ulDestAdd = g_ulDestAdd + g_ucCount/4;
						g_uiCodeLength -= g_ucCount/4;
						
						if(g_ucCount < 64)	g_ucFStatus = FS_CMD;
						
						if((g_ucCount <64) & (g_uiCodeLength = 0))	g_ucUsbSData[1] = 0;
						else g_ucUsbSData[1] = ERROR_DATA;
						
						g_ucUsbSData[0] = CMD_WRITE_CODE;
						POLL_WRITE_BYTE(INDEX, 1);           // Set index to endpoint 1 registers
						Fun_Fifo_Write(FIFO_EP1, 2, &g_ucUsbSData);	
						POLL_WRITE_BYTE(EINCSR1, rbInINPRDY);
						g_ucUsbFlag = 0;
					}					
					break;
			default:	break;	 	
		
		}
	}
}

void	Fun_Pro_Test()
{
	g_ucUsbSData[0] = g_ucHostCmd;
	g_ucUsbSData[1] = 0x00;
}

void	Fun_Pro_ReadEinit()
{

}

void	Fun_Pro_WriteEInit()
{
	unsigned long ulData;
	ulData = g_ucUsbGData[1] + g_ucUsbGData[2]*256 + g_ucUsbGData[3]*256*256 + g_ucUsbGData[4]*256*256*256;
	Hpi_Write_Word(ulData,EMIF_GLOBAL_CONTORL);    //write emif registers
	ulData = g_ucUsbGData[5] + g_ucUsbGData[6]*256 + g_ucUsbGData[7]*256*256 + g_ucUsbGData[8]*256*256*256;
	Hpi_Write_Word(ulData,EMIF_CE1_CONTORL);    //write emif registers
	ulData = g_ucUsbGData[9] + g_ucUsbGData[10]*256 + g_ucUsbGData[11]*256*256 + g_ucUsbGData[12]*256*256*256;
	Hpi_Write_Word(ulData,EMIF_CE0_CONTORL);    //write emif registers
	ulData = g_ucUsbGData[13] + g_ucUsbGData[14]*256 + g_ucUsbGData[15]*256*256 + g_ucUsbGData[16]*256*256*256;
	Hpi_Write_Word(ulData,EMIF_CE2_CONTORL);    //write emif registers
	ulData = g_ucUsbGData[17] + g_ucUsbGData[18]*256 + g_ucUsbGData[19]*256*256 + g_ucUsbGData[20]*256*256*256;
	Hpi_Write_Word(ulData,EMIF_CE3_CONTORL);    //write emif registers
	ulData = g_ucUsbGData[21] + g_ucUsbGData[22]*256 + g_ucUsbGData[23]*256*256 + g_ucUsbGData[24]*256*256*256;
	Hpi_Write_Word(ulData,EMIF_SDRAM_CONTORL);    //write emif registers
	ulData = g_ucUsbGData[25] + g_ucUsbGData[26]*256 + g_ucUsbGData[27]*256*256 + g_ucUsbGData[28]*256*256*256;
	Hpi_Write_Word(ulData,EMIF_SDRAM_REFRESH);    //write emif registers
	
	g_ucUsbSData[0] = g_ucHostCmd;
	g_ucUsbSData[1] = 0x00;

}

void	Fun_Pro_ReadCode()
{}

void	Fun_Pro_WriteCode()
{
			
}
/************************************************/
/*	Name: 	Hpi_Write_Section()					*/
/*	In:	delay									*/
/*	Out:	None								*/
/*	Description: 	main delay functions		*/
/************************************************/
void Hpi_WakeUp_DSP()
{
	/*write HPIC with HWOB = 1,1st halfword transferred is least significant*/
/*								HCNTRL1 	HCNTRL0		HHWIL			*/
	HPIC0(0x0003);		//		0			0			0
	HPIC1(0x0003);		//		0			0			1
}	
/************************************************/
/*	Name: 	Hpi_Write_Word()					*/
/*	In:	delay									*/
/*	Out:	None								*/
/*	Description: 	main delay functions		*/
/************************************************/
void Hpi_Write_Word(unsigned long ulSourceWord,unsigned long ulDestAdd)
{
/*write HPIC with HWOB = 1,1st halfword transferred is least significant*/
/*								HCNTRL1 	HCNTRL0		HHWIL			*/
	HPIC0(0x0001);		//		0			0			0
	HPIC1(0x0001);		//		0			0			1
/*write destinaation address to HPIA,1st halfword is least significan	*/
/*								HCNTRL1 	HCNTRL0		HHWIL			*/
	HPIA0((uint)(ulDestAdd & 0x0ffff));		//		0			1			0
	HPIA1((uint)((ulDestAdd >> 16) & 0x0ffff));		//		0			1			1
/*write source word to HPID,1st halfword is least significan	*/
/*								HCNTRL1 	HCNTRL0		HHWIL			*/
	HPID0((uint)(ulSourceWord & 0x0ffff));		//		1			1			0
	HPID1((uint)((ulSourceWord >> 16) & 0x0ffff));		//		1			1			1
} 
/************************************************/
/*	Name: 	Hpi_Write_Section()					*/
/*	In:	delay									*/
/*	Out:	None								*/
/*	Description: 	main delay functions		*/
/************************************************/
void Hpi_Write_Section(unsigned long ulDestAdd,unsigned char *uiSource,unsigned int uiLength)
{
	uint y;
/*write HPIC with HWOB = 1,1st halfword transferred is least significant*/
/*								HCNTRL1 	HCNTRL0		HHWIL			*/
	HPIC0(0x0001);		//		0			0			0
	HPIC1(0x0001);		//		0			0			1
/*write destinaation address to HPIA,1st halfword is least significan	*/
/*								HCNTRL1 	HCNTRL0		HHWIL			*/
	HPIA0((uint)(ulDestAdd & 0x0ffff));		//		0			1			0
	HPIA1((uint)((ulDestAdd >> 16) & 0x0ffff));		//		0			1			1
/*write source section to HPID,1st halfword is least significan	*/
/*								HCNTRL1 	HCNTRL0		HHWIL			*/
	for(y = 0; y < uiLength; y++)
	{
		HPID0_SECTION(uiSource);		//		1			0			0
		HPID1_SECTION(uiSource);		//		1			0			1
	}
}
void Fun_Fifo_Write(BYTE addr, unsigned int uNumBytes, BYTE * pData)
{
	int i;
                                          
   // If >0 bytes requested,
   if (uNumBytes) 
   {
      while(USB0ADR & 0x80);              // Wait for BUSY->'0'
                                          // (register available)
      USB0ADR = (addr);                   // Set address (mask out bits7-6)

      // Write <NumBytes> to the selected FIFO
      for(i=0;i<uNumBytes;i++)
      {  
         USB0DAT = pData[i];
         while(USB0ADR & 0x80);           // Wait for BUSY->'0' (data ready)
      }
   }
}

⌨️ 快捷键说明

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