📄 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);//define INT_ISR 0 //1:表示处于中断程序中
W_Reg = D12_ReadInterruptRegister();
if(W_Reg != 0)
{
if(W_Reg & D12_INT_BUSRESET) bus_reset();// define D12_INT_BUSRESET 0x40
if(W_Reg & D12_INT_EOT) dma_eot();//define D12_INT_EOT 0x0100
if(W_Reg & D12_INT_SUSPENDCHANGE) supend_change();//define D12_INT_SUSPENDCHANGE 0x80
if(W_Reg & D12_INT_ENDP0IN) ep0_txdone();//define D12_INT_ENDP0IN 0x02
if(W_Reg & D12_INT_ENDP0OUT) ep0_rxdone();//define D12_INT_ENDP0OUT 0x01
if(W_Reg & D12_INT_ENDP1IN) ep1_txdone();//define D12_INT_ENDP1IN 0x08
if(W_Reg & D12_INT_ENDP1OUT) ep1_rxdone();//define D12_INT_ENDP1OUT 0x04
if(W_Reg & D12_INT_ENDP2IN) ep2_txdone();//define D12_INT_ENDP2IN 0x20
if(W_Reg & D12_INT_ENDP2OUT) ep2_rxdone();//define D12_INT_ENDP2OUT 0x10
}
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) //是一个建立包 define D12_SETUPPACKET 0x20
{
ControlData.wLength = 0;
ControlData.wCount = 0;
i = D12_ReadEndpoint(0,sizeof(ControlData.DeviceRequest),(unsigned char *)(&ControlData.DeviceRequest));
if(i != sizeof(DEVICE_REQUEST))//not done read
{
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) //0x80
{
SETBIT(B_D12_Lb,SETUP);//if is 0x80,B_D12_Lb 2th bit set 1
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 MAX_CONTROLDATA_SIZE=8
{
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); //send done must be transmit 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 + -