📄 isr.c
字号:
#include "d12.h"
#include "D12CI.H"
#include "uart.h"
#include "mytype.h"
#define SWAP(x) ((((uint16)(x))<<8)|(((uint16)(x))>>8))
EPPFLAGS bEPPflags;
/* Control endpoint TX/RX buffers */
extern CONTROL_XFER ControlData;
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);
unsigned char idata GenEpBuf[EP1_PACKET_SIZE];
unsigned char idata EpBuf[EP2_PACKET_SIZE];
//中断服务程序
void fn_usb_isr()
{
uint16 i_st;
Prints("IO");
bEPPflags.bits.in_isr=1;
i_st=D12_ReadInterruptRegister(); //读中断寄存器
if(i_st!=0)
{
Prints("\r\ni_st=");
PrintShortIntHex(i_st); //输出
if(i_st&D12_INT_BUSRESET)
{
bEPPflags.bits.bus_reset=1;
Prints("\r\n总线复位");
}
if(i_st&D12_INT_EOT)
dma_eot(); //DMA传输结束
if(i_st&D12_INT_SUSPENDCHANGE)
{
bEPPflags.bits.suspend=1;
D12_SetEndpointEnable(1);
Prints("\r\n总线挂起");
}
if(i_st&D12_INT_ENDP0IN)
ep0_txdone();
if(i_st&D12_INT_ENDP0OUT)
ep0_rxdone();
if(i_st&D12_INT_ENDP1IN)
ep1_txdone();
if(i_st&D12_INT_ENDP1OUT)
ep1_rxdone();
if(i_st&D12_INT_ENDP2IN)
main_txdone();
if(i_st&D12_INT_ENDP2OUT)
main_rxdone();
}
bEPPflags.bits.in_isr=0;
}
//端点0OUT中断
void ep0_rxdone(void)
{
uint8 ep_last,i;
ep_last=D12_ReadLastTransactionStatus(0);
Prints("\r\neplast=");
PrintShortIntHex(ep_last);
if(ep_last&D12_SETUPPACKET)
{
ControlData.wLength=0;
ControlData.wCount=0;
Prints("\nEP0OUT");
if(D12_ReadEndpoint(0,sizeof(ControlData.DeviceRequest),(uint8 *)(&(ControlData.DeviceRequest)))!=sizeof(DEVICE_REQUEST))
{
Prints("\nEP0OUTRETURN");
D12_SetEndpointStatus(0,1);
D12_SetEndpointStatus(1,1);
bEPPflags.bits.control_state=USB_IDLE;//空闲
return ;
}
ControlData.DeviceRequest.wValue=SWAP(ControlData.DeviceRequest.wValue);
ControlData.DeviceRequest.wLength=SWAP(ControlData.DeviceRequest.wLength);
ControlData.DeviceRequest.wIndex=SWAP(ControlData.DeviceRequest.wIndex);
Prints("\r\nbmRequestType=");
PrintShortIntHex(ControlData.DeviceRequest.bmRequestType);
Prints("bRequest=");
PrintShortIntHex(ControlData.DeviceRequest.bRequest);
Prints("wValue=");
PrintShortIntHex(ControlData.DeviceRequest.wValue);
Prints("wIndex=");
PrintShortIntHex(ControlData.DeviceRequest.wIndex);
Prints("wLength");
PrintShortIntHex(ControlData.DeviceRequest.wLength);
D12_AcknowledgeEndpoint(0);
D12_AcknowledgeEndpoint(1);
ControlData.wLength=ControlData.DeviceRequest.wLength;
ControlData.wCount=0;
if(ControlData.DeviceRequest.bmRequestType&(uint8)USB_ENDPOINT_DIRECTION_MASK)
{ //从设备传输数据 IN
bEPPflags.bits.setup_packet=1;
bEPPflags.bits.control_state=USB_TRANSMIT;
Prints("\r\n从设备传输数据进主机");
}
else //从主机到设备的数据OUT
{
if(ControlData.DeviceRequest.wLength==0) //该请求没有数据阶段则设置为空闲,不需要再接收数据
{
bEPPflags.bits.setup_packet=1;
bEPPflags.bits.control_state=USB_IDLE;
Prints("\r\n从主机传数据到设备");
}
else
{
if(ControlData.DeviceRequest.wLength>MAX_CONTROLDATA_SIZE) //接收数据的长度出错
{
bEPPflags.bits.control_state=USB_IDLE;
D12_SetEndpointStatus(0,1);
D12_SetEndpointStatus(1,1);
Prints("\R\N接收数据的长度出错");
}
else
{
bEPPflags.bits.control_state=USB_RECEIVE; //带数据的请求,且长度没错,则要接收数据
Prints("\r\n带数据的请求,且长度没错");
}
}
}
}
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)
{
uint16 i=ControlData.wLength-ControlData.wCount;
Prints("\r\nwLength=");
PrintShortIntHex(ControlData.wLength);
Prints("\r\nwCount=");
PrintShortIntHex(ControlData.wCount);
Prints("\r\ni=");
PrintShortIntHex(i);
D12_ReadLastTransactionStatus(1);
if(bEPPflags.bits.control_state!=USB_TRANSMIT) //非发送状态返回
return ;
if(i>=EP0_PACKET_SIZE)
{
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);
bEPPflags.bits.control_state=USB_IDLE;////发送完毕
}
}
void dma_eot(void)
{
}
//端点1IN
void ep1_txdone(void)
{
D12_ReadLastTransactionStatus(3);
}
//OUT
void ep1_rxtone(void)
{
uint8 len;
D12_ReadLastTransactionStatus(2);
len=D12_ReadEndpoint(2,sizeof(GenEpBuf),GenEpBuf); //读取数据
if(len!=0)
bEPPflags.bits.ep1_rxdone=1;
}
//主端点IN
void main_txdone(void)
{
D12_ReadLastTransactionStatus(5);
}
//主OUT
/*void main_rxdone(void)
{
uint8 len,epstatus;
D12_ReadLastTransactionStatus(4);
epstatus=D12_ReadEndpointStatus(4);
epstatus&=0x60;
len=D12_ReadEndpoint(4,64,EpBuf);
if(epstatus==0x60)
len==D12_ReadEndpoint(4,64,EpBuf);
len = D12_ReadEndpoint(4, 64, EpBuf);
epstatus=D12_ReadEndpointStatus(4);
epstatus &= 0x60;
if (epstatus == 0x60)
len = D12_ReadEndpoint(4, 64, EpBuf);//读取双缓冲区数据
}*/
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 + -