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

📄 usbmain.c

📁 16位单片机H8的例子源代码
💻 C
📖 第 1 页 / 共 2 页
字号:
	while ((writeArea != 0) && (memoryReadLPtr != memoryLPtr->AccessDataType.ReadType.endPtr)) {
		/*	transfer data from ring buffer RAM to FIFO	*/
		*usbDataRegPtr = *memoryReadLPtr;
		
		if (memoryReadLPtr >= (unsigned char*)returnAddLVar) {
			/*	reset ring buffer RAM pointer	*/
			memoryReadLPtr = (unsigned char*)memoryLPtr->beginAriaPtr;
		}
		else {
			/*	Normal	*/
			memoryReadLPtr++;
		}
		
		writeArea--;
	}
	
	/*	enable transfer data in FIFO	*/
	WRITE_FINISH
	
	memoryLPtr->AccessDataType.ReadType.startPtr = memoryReadLPtr;
	
	return (*epInfoPtr->FifoSize - writeArea);
}



/***************************************************************************
Function Name	:PutPacket4(EpInfoType*,BuffType*)
Working			:Transfering data from RAM to FIFO in 4 byte units
Return Value	:short
Modified		:{Author : T.Ishikawa & E.Ondou[2001.Nov.28]}
Created			:{Author : T.Ishikawa[2001.Jan.10]}
***************************************************************************/
short	PutPacket4(EpInfoType*	epInfoPtr,BuffType*	memoryLPtr) {

	/*	FIFO size	*/
	unsigned short 	writeArea = *epInfoPtr->FifoSize;
	/*	ring buffer RAM pointer address	*/
	unsigned long	returnAddLVar = (unsigned long)memoryLPtr->endAriaPtr & 0xFFFFFFFC;

	unsigned long*	usbDataRegLPtr = epInfoPtr->epdrLPtr;
	unsigned long*	memoryReadLongLPtr = memoryLPtr->AccessDataType.ReadType4.startPtr;

	while ((writeArea != 0) && (memoryReadLongLPtr != memoryLPtr->AccessDataType.ReadType4.endPtr)) {
		/*	transfer data from ring buffer RAM to FIFO	*/
		*usbDataRegLPtr = *memoryReadLongLPtr;
		
		if (memoryReadLongLPtr >= (unsigned long*)returnAddLVar) {
			/*	reset ring buffer RAM pointer	*/
			memoryReadLongLPtr = (unsigned long*)memoryLPtr->beginAriaPtr;
		}
		else {
			/*	Normal	*/
			memoryReadLongLPtr++;
		}
		
		writeArea -= 4;
	}
	
	/*	enable transfer data in FIFO	*/
	WRITE_FINISH
	
	memoryLPtr->AccessDataType.ReadType4.startPtr = memoryReadLongLPtr;
	
	return (*epInfoPtr->FifoSize - writeArea);
}



/***************************************************************************
Function Name	:PutPacket4S(EpInfoType*,BuffType*)
Working			:Transfering data from RAM to FIFO in 4 byte units
Return Value	:short
Created			:{Author : T.Ishikawa & E.Ondou[2001.Nov.28]}
***************************************************************************/
short	PutPacket4S(EpInfoType*	epInfoPtr,BuffType*	memoryLPtr) {

	/*	FIFO size	*/
	unsigned short 	writeArea = *epInfoPtr->FifoSize;
	/*	ring buffer RAM pointer address	*/
	unsigned long	returnAddLVar = (unsigned long)memoryLPtr->endAriaPtr & 0xFFFFFFFC;

	unsigned long*	usbDataRegLPtr = epInfoPtr->epdrLPtr;
	unsigned long*	memoryReadLongLPtr = memoryLPtr->AccessDataType.ReadType4.startPtr;

	while ((writeArea != 0) && (memoryReadLongLPtr != memoryLPtr->AccessDataType.ReadType4.endPtr)) {
		/*	transfer data from ring buffer RAM to FIFO	*/
		*usbDataRegLPtr = *memoryReadLongLPtr;
		
		memoryReadLongLPtr++;
		writeArea -= 4;
	}
	
	/*	enable transfer data in FIFO	*/
	WRITE_FINISH
	
	memoryLPtr->AccessDataType.ReadType4.startPtr = memoryReadLongLPtr;
	
	return (*epInfoPtr->FifoSize - writeArea);
}



/***************************************************************************
Function Name	:SetControlOutContents(ControlType*,BuffType*)
Working			:Changing transfered data from Host
Return Value	:enum SetCompleteType (COMPLETE or INCOMPLETE)
Created			:{Author : S.Suzuki[1998.Nov.6]}
***************************************************************************/
enum SetCompleteType SetControlOutContents(ControlType* addLPtr,BuffType*	memoryLPtr) {

	/*	in case of existing data from Host	*/
	if (memoryLPtr->AccessDataType.ReadType.startPtr != memoryLPtr->AccessDataType.ReadType.endPtr) {
		/*	change data	*/
		for (;((memoryLPtr->AccessDataType.ReadType.startPtr != memoryLPtr->AccessDataType.ReadType.endPtr) && (addLPtr->beginPtr != addLPtr->endPtr));
		addLPtr->beginPtr++,memoryLPtr->AccessDataType.ReadType.startPtr++) {
			*addLPtr->beginPtr = *memoryLPtr->AccessDataType.ReadType.startPtr;
		}
	}
	return COMPLETE;
}



/***************************************************************************
Function Name	:SetUsbModule(unsigned long ,unsigned char )
Working			:Intializing USB Module
Return Value	:void
Modified		:{Author : T.Ishikawa[2001.Nov.28]}
Modified		:{Author : T.Ishikawa[2001.Nov.14]}
Created			:{Author : T.Ishikawa[2000.Jun.23]}
***************************************************************************/
void	SetUsbModule(unsigned long interruptBitStreamLVar ,unsigned char epInfoNumberLVar) {

	RUN_USB_MODULE_2
	
	F_CLEAR_PLLREADY
	
	/*	Set USB Information Register	*/
	SET_USB_EPINFO
	
	/*	set USB interrupt and DMA	*/
	SET_USB_INTERRUPT
	
	/*	get interrupt enable flag	*/
	GET_INTERRUPT_ENABLE
	
	SET_USB_INTERRUPT_SELECT
}



/***************************************************************************
Function Name	:ActBusReset(unsigned long ,unsigned char )
Working			:Clear FIFO in USB Bus Reset
Return Value	:void
Modified		:{Author : T.Ishikawa[2001.Aug.09]}
Modified		:{Author : T.Ishikawa[2001.Jan.10]}
Created			:{Author : T.Ishikawa[2000.Jun.23]}
***************************************************************************/
void	ActBusReset(unsigned long interruptBitStreamLVar ,unsigned char epInfoNumberLVar) {

	/*	clear interrupt flag	*/
	F_CLEAR_BUSRESET
	
	/*	clear all FIFO	*/
	CLEAR_ALL_FIFO
	
	/*	clear STALL	*/
	EP_STALL_ALL_OFF
}



/************************************************************************
Function Name	:ActBusVcc(unsigned long ,unsigned char )
Working			:Handling VBUS interrupt
Return Value	:void
Modified		:{Author : T.Ishikawa[2001.Nov.28]}
Modified		:{Author : T.Sekine[2001.Nov.09]}
Created			:{Author : T.Ishikawa[2000..]}
************************************************************************/
void	ActBusVcc(unsigned long interruptBitStreamLVar ,unsigned char EpInfoNumberLVar) {

	InterruptType	deviceSideLVar;					/*	For stored present value of interrupt flag resisters	*/
	
	F_CLEAR_BUSVCC									/*	Clear VBUSi flag	*/
	GET_INTERRUPT_REGISTER							/*	For renewal deviceSideLVar (Re-get the value of interrupt flag registers)	*/
	
	CHECK_CABLE_STATE
		CLEAR_ALL_FIFO								/*	Clear all FIFO	*/
		ENABLE_DPLUS_PULLUP							/*	Enable D+ Pullup	*/
		RUN_USB_MODULE_3							/*	Disable UDC core reset	*/
	}
	else {											/*	USB cable is disconnecteed	*/
		STOP_USB_MODULE_3							/*	Enable UDC core reset	*/
		DISABLE_DPLUS_PULLUP						/*	Disable D+ Pullup	*/
	}
}



/***************************************************************************
Function Name	:ConvRealn(unsigned char* ,unsigned char )
Working			:Reading data in specified address
Return Value	:unsigned long
Created			:{Author : T.Ishikawa[2001.Jan.10]}
***************************************************************************/
unsigned long	ConvRealn(unsigned char*	sourceLPtr ,unsigned char	counterVer) {

	unsigned char				counterLVer = 0;
	register unsigned long	workLVer = (unsigned char)*(sourceLPtr);

	counterVer -= 1;
	
	while (counterLVer < counterVer) {
		counterLVer++;
		workLVer <<= 8;
		++sourceLPtr;
		workLVer |= (unsigned char)*(sourceLPtr);
	}
	return workLVer;
}



/***************************************************************************
Function Name	:ConvReflexn(unsigned char* ,unsigned char )
Working			:Changing row of data in specified address
Return Value	:unsigned long
Created			:{Author : T.Ishikawa[2001.Jan.10]}
***************************************************************************/
unsigned long	ConvReflexn(unsigned char*	sourceLPtr ,unsigned char	counterVer) {

	register unsigned long	workLVer = 0;

	while (counterVer != 0) {
		counterVer--;
		workLVer <<= 8;
		workLVer |= (unsigned char)*(sourceLPtr + counterVer);
	}
	return workLVer;
}

⌨️ 快捷键说明

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