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

📄 isr.c

📁 是关于pdiusbd12完整固件程序代码
💻 C
字号:
	#include <stdio.h>
	#include <string.h>

	#include <reg51.h>                /* special function register declarations   */

	#include "epphal.h"
	#include "d12ci.h"
	#include "mainloop.h"
	#include "usb100.h"

	extern void bus_reset(void);

	extern void ep0_txdone(void);
	extern void ep0_rxdone(void);

	extern void ep1_txdone(void);
	extern void ep1_rxdone(void);

	extern void main_txdone(void);
	extern void main_rxdone(void);

	extern void dma_eot(void);

	/*
	//*************************************************************************
	//  Public static data
	//*************************************************************************
	*/

	EPPFLAGS bEPPflags;

	/* Control endpoint TX/RX buffers */
	extern CONTROL_XFER ControlData;

	/* ISR static vars */
	unsigned char idata GenEpBuf[EP1_PACKET_SIZE];
	unsigned char idata EpBuf[EP2_PACKET_SIZE];
	IO_REQUEST idata ioRequest;
	unsigned char ioSize, ioCount;
	unsigned long ClockTicks = 0;

	extern BOOL bNoRAM;

	//定时器0中断处理
	timer_isr() interrupt 1
	{
		DISABLE;
		ClockTicks++;
		bEPPflags.bits.timer = 1;
		ENABLE;
	}

	//USB中断处理
	usb_isr() interrupt 0
	{
		DISABLE;
		fn_usb_isr();
		ENABLE;
	}

	//USB中断服务子程序
	void fn_usb_isr()
	{
		unsigned int i_st;

		bEPPflags.bits.in_isr = 1;

		i_st = D12_ReadInterruptRegister();//读取中断寄存器

		if(i_st != 0) {
			if(i_st & D12_INT_BUSRESET) {
				bus_reset();//USB总线服务
				bEPPflags.bits.bus_reset = 1;
			}

			if(i_st & D12_INT_EOT)
				dma_eot();//DMA传输结束

			if(i_st & D12_INT_SUSPENDCHANGE)
				bEPPflags.bits.suspend = 1;//挂起改变

			if(i_st & D12_INT_ENDP0IN)
				ep0_txdone();//端点0IN中断
			if(i_st & D12_INT_ENDP0OUT)
				ep0_rxdone();//端点0OUT中断
			if(i_st & D12_INT_ENDP1IN)
				ep1_txdone();//端点1IN中断
			if(i_st & D12_INT_ENDP1OUT)
				ep1_rxdone();//端点1OUT中断
			if(i_st & D12_INT_ENDP2IN)
				main_txdone();//端点2IN中断
			if(i_st & D12_INT_ENDP2OUT)
				main_rxdone();//端点2OUT中断
		}

		bEPPflags.bits.in_isr = 0;
	}

	//总线复位处理子程序
	void bus_reset(void)
	{
	}

	//端点0OUT中断
	void ep0_rxdone(void)
	{
		unsigned char ep_last, i;

		ep_last = D12_ReadLastTransactionStatus(0); //清中断标志

		if (ep_last & D12_SETUPPACKET) {
			//接收到SETUP包
			ControlData.wLength = 0;
			ControlData.wCount = 0;

			if( D12_ReadEndpoint(0, sizeof(ControlData.DeviceRequest),
				(unsigned char *)(&(ControlData.DeviceRequest))) != sizeof(DEVICE_REQUEST) ) {
				//SETUP包出错,返回
				D12_SetEndpointStatus(0, 1);
				D12_SetEndpointStatus(1, 1);
				bEPPflags.bits.control_state = USB_IDLE;
				return;
			}

			ControlData.DeviceRequest.wValue = SWAP(ControlData.DeviceRequest.wValue);
			ControlData.DeviceRequest.wIndex = SWAP(ControlData.DeviceRequest.wIndex);
			ControlData.DeviceRequest.wLength = SWAP(ControlData.DeviceRequest.wLength);

			//对控制端点的输入/输出进行应答
			D12_AcknowledgeEndpoint(0);
			D12_AcknowledgeEndpoint(1);

			ControlData.wLength = ControlData.DeviceRequest.wLength;
			ControlData.wCount = 0;

			if (ControlData.DeviceRequest.bmRequestType & (unsigned char)USB_ENDPOINT_DIRECTION_MASK) {
				//从主机传输数据
				bEPPflags.bits.setup_packet = 1;
				bEPPflags.bits.control_state = USB_TRANSMIT;		/* get command */
			}
			else {
				if (ControlData.DeviceRequest.wLength == 0) {
					bEPPflags.bits.setup_packet = 1;
					bEPPflags.bits.control_state = USB_IDLE;		/* set command */
				}
				else {
					if(ControlData.DeviceRequest.wLength > MAX_CONTROLDATA_SIZE) {
						//接收数据长度为0
						bEPPflags.bits.control_state = USB_IDLE;
						D12_SetEndpointStatus(0, 1);
						D12_SetEndpointStatus(1, 1);
					}
					else {
						bEPPflags.bits.control_state = USB_RECEIVE;	//设置接收状态
					}
				} // set command with data
			} // else set command
		} // if setup packet

		else if (bEPPflags.bits.control_state == USB_RECEIVE) {
			//接收数据
			i =	D12_ReadEndpoint(0, EP0_PACKET_SIZE,
				ControlData.dataBuffer + ControlData.wCount);
			ControlData.wCount += i;
			if( i != EP0_PACKET_SIZE || ControlData.wCount >= ControlData.wLength) {
				//数据接收完毕
				bEPPflags.bits.setup_packet = 1;
				bEPPflags.bits.control_state = USB_IDLE;
			}
		}
		else {
			bEPPflags.bits.control_state = USB_IDLE;//进入等待状态
		}
	}

	//端点0IN处理
	void ep0_txdone(void)
	{
		short i = ControlData.wLength - ControlData.wCount;
		D12_ReadLastTransactionStatus(1); //清中断标志位
		if (bEPPflags.bits.control_state != USB_TRANSMIT) 
			return;//非发送状态,返回

		if( i >= EP0_PACKET_SIZE) {
			//剩下数据大于16字节,发送16字节
			D12_WriteEndpoint(1, EP0_PACKET_SIZE, ControlData.pData + ControlData.wCount);
			ControlData.wCount += EP0_PACKET_SIZE;
			bEPPflags.bits.control_state = USB_TRANSMIT;
		}
		else if( i != 0) {
			//发送剩下数据
			D12_WriteEndpoint(1, i, ControlData.pData + ControlData.wCount);
			ControlData.wCount += i;
			bEPPflags.bits.control_state = USB_IDLE;
		}
		else if (i == 0){
			D12_WriteEndpoint(1, 0, 0); //发送完毕,发送0字节
			bEPPflags.bits.control_state = USB_IDLE;
		}
	}

	//DMA结束处理
	void dma_eot(void)
	{
	}

	//端点1OUT处理
	void ep1_txdone(void)
	{
		D12_ReadLastTransactionStatus(3); //清中断标志位
	}

	//端点1IN处理
	void ep1_rxdone(void)
	{
		unsigned char len;

		D12_ReadLastTransactionStatus(2); //清中断标志位
		len = D12_ReadEndpoint(2, sizeof(GenEpBuf), GenEpBuf);//读取数据
		if(len != 0)
			bEPPflags.bits.ep1_rxdone = 1;//标志接收到数据
	}

	//主端点OUT控制
	void main_txdone(void)
	{
	//	unsigned char len,epstatus;

		D12_ReadLastTransactionStatus(5); //清中断标志位
	}

	//主端点IN控制
	void main_rxdone(void)
	{
		unsigned char len,epstatus;

		D12_ReadLastTransactionStatus(4); //清中断标志位

		//接收数据
		len = D12_ReadEndpoint(4, 64, EpBuf);
		epstatus=D12_ReadEndpointStatus(4);
		epstatus &= 0x60;
		if (epstatus == 0x60)
			len = D12_ReadEndpoint(4, 64, EpBuf);//读取双缓冲区数据
	}


⌨️ 快捷键说明

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