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

📄 isr.c

📁 AVR单片机控制的PDIUSBD12原程序
💻 C
字号:
//**********************************
//中断服务程序isr.c
//编译环境WINAVRGCC
//2007-01-9
//Hjxiang
//**********************************
//标准C头文件
#include <stdint.h>
#include <stdlib.h>
//AVR头文件
#include <avr/io.h>
#include <avr/signal.h>
#include <avr/delay.h>
//自定义头文件
#include "usb.h"
#include "d12ic.h"
#include "isr.h"

//中断服务程序
void fn_usb_isr(void)
{
	unsigned int i_st;
	cli();
	bEPPflags.bits.in_isr = 1;
	i_st=D12_ReadInterruptRegister();
//	put_c(i_st);
	if(i_st != 0)
	{
		if(i_st & D12_INT_BUSREST)		//0x40
			bEPPflags.bits.bus_reset=1;
		if(i_st & D12_INT_EOT)
			dma_eot();
		if(i_st & D12_INT_SUSPENDCHANGE)	//0x80
			bEPPflags.bits.suspend=1;
		if(i_st & D12_INT_ENDP0IN)		//0x02
			ep0_txdone();
		if(i_st & D12_INT_ENDP0OUT)		//0x01
			ep0_rxdone();
		if(i_st & D12_INT_ENDP1IN)		//0x08
			ep1_txdone();
		if(i_st & D12_INT_ENDP1OUT)		//0x04
			ep1_rxdone();
		if(i_st & D12_INT_ENDP2IN)		//0x20
			main_txdone();
		if(i_st & D12_INT_ENDP2OUT)		//0x10
			main_rxdone();
		
	}
	bEPPflags.bits.in_isr = 0;
	sei();
}
//端点0OUT中断
void ep0_rxdone(void)
{
	unsigned char ep_last,i,ep_last1;
	ep_last=D12_ReadLastTransactionStatus(0);
//	put_c(ep_last);
	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包出错
//			put_c(0x31);
			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;
//			put_c(bEPPflags.bits.setup_packet);
			bEPPflags.bits.control_state = USB_TRANSMIT;	//设置状态
		}
		else
		{
			if(ControlData.DeviceRequest.wLength ==0)
			{
				bEPPflags.bits.setup_packet = 1;
				bEPPflags.bits.control_state = USB_IDLE;	//设置状态
			}
			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 setuppacket
	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)
{
	unsigned char j;
	short i=ControlData.wLength-ControlData.wCount;
	j=D12_ReadLastTransactionStatus(1);			//清中断标志位
//	put_c(j);
	if(bEPPflags.bits.control_state != USB_TRANSMIT)
		return;								//非发送状态,返回
	if(i>=EP0_PACKET_SIZE)
	{											//剩下数据大于16B,发送16B
		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);		//发送完毕,发送0B
				bEPPflags.bits.control_state = USB_IDLE;
			}
		}
	}	
}
//MDA结束处理
void dma_eot(void)
{
//	LED();
}
//端点1IN处理
void ep1_txdone(void)
{
	unsigned char j;
	j=D12_ReadLastTransactionStatus(3);			//清中断标志位
//	LED();
}
//端点1OUT处理
void ep1_rxdone(void)
{
	unsigned char len,j;
	j=D12_ReadLastTransactionStatus(2);			//清中断标志位
	len=D12_ReadEndpoint(2,sizeof(GenEpBuf),GenEpBuf);//读取数据
	if(len != 0)
		bEPPflags.bits.ep1_rxdone=1;			//标志接收到数据
//	LED();
}
//主端点IN控制
void main_txdone(void)
{
	unsigned char j;
	j=D12_ReadLastTransactionStatus(5);			//清中断标志位	
//	LED();
}
//主端点OUT控制
void main_rxdone(void)
{
	unsigned char len,epstatus,j;
	j=D12_ReadLastTransactionStatus(4);			//清中断标志位
	epstatus=D12_ReadEndpointStatus(4);			//读取缓冲区状态
	epstatus &=0x60;
	//接收数据
	len=D12_ReadEndpoint(4,64,EpBuf);
	if(epstatus==0x60)
		len=D12_ReadEndpoint(4,64,EpBuf);		//读取双缓冲区数据
//	LED();
}

⌨️ 快捷键说明

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