📄 isr.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 + -