📄 int.c
字号:
#include <reg51.h>
#include <string.h>
#include "macro.h"
#include "varmain.h"
#include "varint.h"
void P_InterruptInt0(void) interrupt 0 //调用D12中断服务子程序
{
unsigned int W_Reg;
SETBIT(B_D12_Lb,INT_ISR);
W_Reg = D12_ReadInterruptRegister();
if(W_Reg != 0)
{
if(W_Reg & D12_INT_BUSRESET) bus_reset();
if(W_Reg & D12_INT_EOT) dma_eot();
if(W_Reg & D12_INT_SUSPENDCHANGE) supend_change();
if(W_Reg & D12_INT_ENDP0IN) ep0_txdone();
if(W_Reg & D12_INT_ENDP0OUT) ep0_rxdone();
if(W_Reg & D12_INT_ENDP1IN) ep1_txdone();
if(W_Reg & D12_INT_ENDP1OUT) ep1_rxdone();
if(W_Reg & D12_INT_ENDP2IN) ep2_txdone();
if(W_Reg & D12_INT_ENDP2OUT) ep2_rxdone();
}
CLRBIT(B_D12_Lb,INT_ISR);
}
//总线复位中断服务子程序
void bus_reset(void)
{
//可添加用户代码(进行检测到总线复位的操作)
}
//DMA操作结束中断服务子程序
void dma_eot(void)
{
//可添加用户代码(进行检测DMA操作结束的操作)
}
//设备挂起改变
void supend_change(void)
{
}
//端点1输出中断操作
void ep1_txdone(void)
{
D12_ReadLastTransactionStatus(3);//复位中断寄存器
//可添加用户代码(进行检测端点号3IN令牌的操作)
}
//端点1输入中断操作
void ep1_rxdone(void)
{
unsigned char len;
D12_ReadLastTransactionStatus(2);//复位中断寄存器
len = D12_ReadEndpoint(2, sizeof(B_BufRdEnd1), &B_BufRdEnd1[0]);//读取端点1接收数据
if (len != 0) SETBIT(B_CommFlg,B_ReceEP1);//标志端点1接收到数据
}
//端点2输出中断操作
void ep2_txdone(void)
{
D12_ReadLastTransactionStatus(5);//复位中断寄存器
//可添加用户代码(进行检测端点号5IN令牌的操作)
}
//端点2输入中断操作
void ep2_rxdone(void)
{
unsigned char len;
D12_ReadLastTransactionStatus(4);//复位中断寄存器
len = D12_ReadEndpoint(4, sizeof(B_BufRdEnd2), &B_BufRdEnd2[0]);//读取端点2接收数据
if (len != 0) SETBIT(B_CommFlg,B_ReceEP2);//标志端点2接收到数据
}
void ep0_rxdone(void)
{
unsigned char ep_last, i;
ep_last = D12_ReadLastTransactionStatus(0); // Clear interrupt flag
if (ep_last & D12_SETUPPACKET) //是一个建立包
{
ControlData.wLength = 0;
ControlData.wCount = 0;
i = D12_ReadEndpoint(0,sizeof(ControlData.DeviceRequest),(unsigned char *)(&ControlData.DeviceRequest));
if(i != sizeof(DEVICE_REQUEST))
{
D12_SetEndpointStatus(0, 1);
D12_SetEndpointStatus(1, 1);
B_Conrol_Stat = USB_IDLE;
return;
}
// Acknowledge setup here to unlock in/out endp
D12_AcknowledgeEndpoint(0);
D12_AcknowledgeEndpoint(1);
ControlData.wLength = ControlData.DeviceRequest.wLength;
ControlData.wCount = 0;
if (ControlData.DeviceRequest.bmRequestType & USB_ENDPOINT_DIRECTION_MASK)
{
SETBIT(B_D12_Lb,SETUP);
B_Conrol_Stat = USB_TRANSMIT; /* get command */
}
else
{
if (ControlData.DeviceRequest.wLength == 0)
{
SETBIT(B_D12_Lb,SETUP); /* set command */
B_Conrol_Stat = USB_IDLE;
}
else
{
if(ControlData.DeviceRequest.wLength > MAX_CONTROLDATA_SIZE) //有问题:应该是EP0_PACKET_SIZE
{
B_Conrol_Stat = USB_IDLE;
D12_SetEndpointStatus(0, 1);
D12_SetEndpointStatus(1, 1);
}
else
B_Conrol_Stat = USB_RECEIVE;
}
}
}
else if(B_Conrol_Stat == 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)
{
SETBIT(B_D12_Lb,SETUP);
B_Conrol_Stat = USB_IDLE;
}
}
else
B_Conrol_Stat = USB_IDLE;
}
void ep0_txdone(void)
{
short i = ControlData.wLength - ControlData.wCount;
D12_ReadLastTransactionStatus(1); // Clear interrupt flag
if (B_Conrol_Stat != USB_TRANSMIT)
{
single_transmit(0, 0);
return;
}
if( i >= EP0_PACKET_SIZE)
{
D12_WriteEndpoint(1, EP0_PACKET_SIZE, ControlData.pData + ControlData.wCount);
ControlData.wCount += EP0_PACKET_SIZE;
B_Conrol_Stat = USB_TRANSMIT;
}
else if( i != 0)
{
D12_WriteEndpoint(1, i, ControlData.pData + ControlData.wCount);
ControlData.wCount += i;
B_Conrol_Stat = USB_IDLE;
}
else if (i == 0)
{
D12_WriteEndpoint(1, 0, 0); // Send zero packet at the end ???
B_Conrol_Stat = USB_IDLE;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -