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

📄 sl811.c

📁 使用单片机C51实现的USB1.1通信的文件协议层
💻 C
📖 第 1 页 / 共 3 页
字号:
#include "common.h"
#include "SL811.H"
#include "HAL.H"
#include "HPI.H"
#include "intrins.h"
#include 	"AT89X52.H"

sbit SEL_OTHERS=P1^5;
sbit  MASTER_SLAVER=P3^5;   //master/slave usb的主从控制,0控制为MAST,1为SLAVE
//bit		SLAVE_ONLINE;

//extern	bit		modechanged;
extern bit		SLAVE_IS_ATTACHED;
//extern bit		SLAVE_REMOVED;
//extern bit		SLAVE_FOUND;
bit		TIMEOUT_ERR;		// timeout error during data endpoint transfer
bit		DATA_STOP;		// device unplugged during data transfer
bit		bMassDevice;
bit		bData1;
xdata unsigned char epst;		//端点返回状态
extern	data	union
	{
	uint		flash_page;
	uchar	flash_arr[2];
	struct
		{
		uchar	page_MSB;
		uchar	page_LSB;
		}flash_byte;
	}flash_address;

uchar xdata DBUF[2060]	_at_	0X1000;
pUSBDEV  xdata	uDev;			// Multiple USB devices attributes, Max 5 devices
xdata pDevDesc  	pDev;			// Device descriptor struct
xdata pCfgDesc 	pCfg;			// Configuration descriptor struct
xdata pIntfDesc 	pIfc;				// Interface descriptor struct
xdata pEPDesc 		pEnp;			// Endpoint descriptor struct
//xdata pStrDesc 	pStr;			// String descriptor struct

extern void FlashLowTo811(void);
extern void FlashHighTo811(void);
extern	void hardware_reset_811(void);
extern	void delay_1ms( void );
extern	void delay_2ms( void );

//*****************************************************************************************
// SL811H variables initialization
//*****************************************************************************************
//////bit SL811_GetRev(void)
//////{
//////	//SL811Write(SL811_ADDR_PORT, 0x0e);
//////	return SL811Read(0x0e);
//////}

void USBReset(void)
{
	unsigned char temp;
	temp=SL811Read(CtrlReg);
	SL811Write(CtrlReg,temp|0x08);
	DelayMs(50);
	SL811Write(CtrlReg,0x18);
	DelayMs(50);
	SL811Write(CtrlReg,temp|0x08);
	DelayMs(50);
	SL811Write(CtrlReg,temp);
	DelayMs(50);
}
bit FlashWithUsb(uint	wLen)	//将当前长度的FLASH中的数据通过USB发出,完成所有的数据传输才退出
	{
	idata uchar 	bufLen,cmd,intr,ep_out,page,inv_time,re_times;
	uchar	j;
	uchar *buffer=DBUF;


	ep_out=uDev.epbulkout&0x0F;
	cmd=DATA0_WR;					//将写命令的控制字准备好
	if(!uDev.bData1[ep_out])
		cmd|=0x40;
	SL811Write(IntStatus,INT_CLEAR); 	//清除中断标志
	page=(uchar)(wLen>>7);
	for(j=0;j<page;j++)		//这实际是本次要传输的FLASH的PAGE数
		{
		//加载A
		//SL811BufWrite(0x10,buffer,0x40);
                re_times=0;
		FlashLowTo811();



		//准备A的发送
//		bData1=!bData1;
//		if(bData1)
//    			cmd&=0xBF;                      	// Set Data0 bit in command,根据状况修改命令字
//    		else
//    			cmd|=0x40;                      	// Set Data1 bit in command,根据状况修改命令字
	        cmd^=0x40;
        while(TRUE)
            {

		SL811Write(EP0Status,(ep_out|PID_OUT));	// PID + EP address
		SL811Write(EP0Counter,1);				// USB address
		SL811Write(EP0Address,0x10);			// buffer address, start with "data0",首次传送的地址,一定从前部BUF开始
		SL811Write(EP0XferLen,0x40);			// data transfer length,本次传送的长度
		SL811Write(IntStatus,INT_CLEAR); 		// clear interrupt status,清除中断
		//A开始传送
		SL811Write(EP0Control,cmd);				// Enable ARM and USB transfer start here,开始传送
		//加载B
		//SL811BufWrite(0x50,buffer,0x40);
		//判断A传输是否结束
		while(1)											// always ensure requested device is
			{											// inserted at all time, then you will
			intr=SL811Read(IntStatus);			//读取中断标志
			if(intr& USB_A_DONE)				//本次传送完毕
				break;										// interrupt done !!!
			if(intr&INSERT_RESET)			// proceed to parse result from slave
				return	FALSE;								// flag true, so that main loop will
			}

		SL811Write(IntStatus,INT_CLEAR);
                intr=SL811Read(EP0Status);						// clear interrupt status,清除中断标志
		if(intr&EP0_ACK)							// Transmission ACK,如果接收正确
			{
			wLen-=0x40;										// update remainding wLen value,得到剩余要传字节的数量
			bufLen=0x40;	//上次已经传掉的数量
                        re_times=0;
                        break;
			}
		else
               {
               SL811Write(IntStatus,INT_CLEAR);
                for(inv_time=0;inv_time<200;inv_time++)
                delay_1ms();
                re_times++;
                if(re_times>=20)
                return  FALSE;
		continue;			// fail transmission
                }
          }
                re_times=0;
                FlashHighTo811();
		//准备B的发送
//		bData1=!bData1;
//		if(bData1)
//    			cmd&=0xBF;                      	// Set Data0 bit in command,根据状况修改命令字
//    		else
//    			cmd|=0x40;                      	// Set Data1 bit in command,根据状况修改命令字
		cmd^=0x40;
                while(TRUE)
                {
		SL811Write(EP0Status,(ep_out|PID_OUT));	// PID + EP address
		SL811Write(EP0Counter,1);				// USB address
		SL811Write(EP0Address,0x50);			// buffer address, start with "data0",首次传送的地址,一定从前部BUF开始
		SL811Write(EP0XferLen,0x40);			// data transfer length,本次传送的长度
		SL811Write(IntStatus,INT_CLEAR); 		// clear interrupt status,清除中断
		//B开始传送
		SL811Write(EP0Control,cmd);


                		//判断B传输是否结束

			while(1)											// always ensure requested device is
				{												// inserted at all time, then you will
				intr=SL811Read(IntStatus);			//读取中断标志
				if(intr&USB_A_DONE)
                                				//本次传送完毕
					break;
                                if(intr&INSERT_RESET)		// proceed to parse result from slave
					return	FALSE;								// flag true, so that main loop will
				}
			SL811Write(IntStatus,INT_CLEAR);
                        intr=SL811Read(EP0Status);						// clear interrupt status,清除中断标志
			if(intr&EP0_ACK)							// Transmission ACK,如果接收正确
				{
				wLen-=0x40;										// update remainding wLen value,得到剩余要传字节的数量
				bufLen=0x40;
                                re_times=0;
                                break;									//上次已经传掉的数量
				}
			else

               {
               SL811Write(IntStatus,INT_CLEAR);
                for(inv_time=0;inv_time<200;inv_time++)
                delay_1ms();
                re_times++;
                if(re_times>=20)
                return  FALSE;
		continue;			// fail transmission
                }
          }

                flash_address.flash_page++;				// Enable ARM and USB transfer start here,开始传送
		}
                return  TRUE;

	}


//bit FlashWithUsb(uint	wLen)	//将当前长度的FLASH中的数据通过USB发出,完成所有的数据传输才退出
//	{
//	uchar 	cmd,result,intr,ep_out;
//	idata uchar	bufLen,addr,xferLen;
//	uchar	i=255;
//	uchar *buffer=DBUF;
//	ep_out=uDev.epbulkout&0x0F;
//	//------------------------------------------------
//	// Default setting for usb trasnfer
//	//------------------------------------------------
//	bufLen=0;			//初始化基本参数
//	TIMEOUT_ERR=DATA_STOP=FALSE;
//	//------------------------------------------------
//	// Define data transfer payload
//	//------------------------------------------------
//	if(wLen>=0x40)  		// select proper data payload	//判断实际要求传送的长度
//		xferLen=0x40;		// limit to wPayload size	//最大不能超过负载,超过部分下次再传
//	else					// else take < payload len
//		xferLen=wLen;
//	// For OUT token
//	if(xferLen)			// only when there are,把需要加载的数据转移到811
//		SL811BufWrite(0x10,buffer,xferLen); 	// data to transfer on USB
//	cmd=sDATA0_WR;		//将写命令的控制字准备好
//	bData1=uDev.bData1[ep_out];		//得到当前的切换状况
//    	uDev.bData1[ep_out]=(!bData1); 	// DataToggle,翻转,为下次准备
//	if(bData1)
//    		cmd|=0x40;                      	// Set Data1 bit in command,根据状况修改命令字
//	//------------------------------------------------
//	//------------------------------------------------
//	// Arming of USB data transfer for the first pkt,准备数据,送到SIE待传
//	//------------------------------------------------
//	SL811Write(EP0Status,(ep_out|PID_OUT));	// PID + EP address
//	SL811Write(EP0Counter,1);				// USB address
//	SL811Write(EP0Address,0x10);			// buffer address, start with "data0",首次传送的地址,一定从DATA0开始
//	SL811Write(EP0XferLen,xferLen);			// data transfer length,本次传送的长度
//	SL811Write(IntStatus,INT_CLEAR); 		// clear interrupt status,清除中断
//	SL811Write(EP0Control,cmd);				// Enable ARM and USB transfer start here,开始传送
//	//------------------------------------------------
//	// Main loop for completing a wLen data trasnfer
//	//------------------------------------------------
//	while(i--)
//		{
//		//---------------Wait for done interrupt------------------
//		while(TRUE)											// always ensure requested device is
//			{												// inserted at all time, then you will
//			intr=SL811Read(IntStatus);			//读取中断标志
//			if((intr&USB_RESET)||(intr&INSERT_REMOVE))			// proceed to parse result from slave
//				{											// device.设备被重置了要退出传送并给出标志
//				DATA_STOP=TRUE;								// if device is removed, set DATA_STOP
//				return	FALSE;								// flag true, so that main loop will
//				}											// know this condition and exit gracefully
//			if(intr& USB_A_DONE)		//本次传送完毕
//				break;										// interrupt done !!!
//			}
//		SL811Write(IntStatus,INT_CLEAR); 						// clear interrupt status,清除中断标志
//		result=SL811Read(EP0Status);								// read EP0status register,得到传送结果
//		//-------------------------ACK----------------------------
//		if (result&EP0_ACK)										// Transmission ACK,如果接收正确
//			{
//			// OUT TOKEN
//			wLen-=(uint)xferLen;								// update remainding wLen value,得到剩余要传字节的数量
//			bufLen=xferLen;			//上次已经传掉的数量
//			if(wLen)	//如果还有数据要传送
//				{
//		        	bData1=uDev.bData1[ep_out];
//		        	uDev.bData1[ep_out]=(!bData1); 				// DataToggle,把标志切换到下一个

⌨️ 快捷键说明

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