📄 d12isr.c
字号:
//#pragma SYMBOLS
#include"stdio.h"
#include"X52.H"
#include"HAL.H"
#include"D12CI.H"
#include"MAIN.H"
#include"usb100.H"
//#include"absacc.h"
/****************************************************************************
* this program mainly handles interrupt generated by pdiusbd12.It retrieves *
* data from pdiusbd12's internal FIFO to CPU memory and set up the proper *
* event flags to inform main loop program for processing. *
*****************************************************************************/
unsigned long ClockTicks = 0;
unsigned char xdata MainEpBuf[256];
unsigned char idata dd[4];
unsigned int k;
unsigned char idata GenEpBuf[EP1_PACKET_SIZE];
unsigned char idata EpBuf[EP2_PACKET_SIZE];
//extern unsigned char idata GenEpBuf[EP1_PACKET_SIZE];
//extern unsigned char idata EpBuf[EP2_PACKET_SIZE];
//extern unsigned char D12_WriteBuffer(unsigned char endp ,unsigned char *buf,unsigned char len);
unsigned char ioSize, ioCount;
IO_REQUEST idata ioRequest;
BOOL bNoRAM;
//extern DATA_SAMPLE();
//extern unsigned char adc_sam();
//extern void D12_SetEndpointStatus(unsigned char bEndp ,unsigned char bStalled) reentrant;
//extern unsigned char D12_ReadBuffer(unsigned char endp, unsigned char * buf,unsigned char len);
//extern unsigned char D12_WriteBuffer(unsigned char endp, unsigned char * buf,unsigned char len)reentrant;
extern EPPFLAGS bEPPflags;
extern CONTROL_XFER ControlData;
//void adc_das();
void fn_usb_isr();
void bus_reset(void);
void ep0_rxdone(void);
void ep1_rxdone(void);
void ep0_txdone(void);
void ep1_txdone(void);
void main_txdone(void);
void main_rxdone(void);
void dma_eot(void);
timer_isr() interrupt 1
{
DISABLE;
//ClockTicks++;
bEPPflags.bits.timer = 1;
ENABLE;
}
/* adc_das() interrupt 1
{
UCHAR idata result;
result=adc_sam();
}*/
//UCHAR i;
/*void data_sam(void) interrupt 0
{
UCHAR tmp;
unsigned char i=8; //ADC0809有八个模拟输入通道
XBYTE[ADC]=i;
WRITE=0; //启动A/D转换
//while(i && READ==0 && EOC==0);
while(i>=1 && READ==0 ); //等待八个通道A/D转换完毕
tmp=XBYTE[ADC]; //读A/D转换结果
i--;
XBYTE[ADCdata+i]=tmp; //结果存入数据缓冲区
XBYTE[ADC]=i; //启动下一个模拟通道的A/D转换
}*/
/*timer0() interrupt 1
{
DISABLE;
bEPPflags.bits.suspend= 1; //清除挂起改变标志
ENABLE;
}*/
usb_isr() interrupt 0
{
DISABLE;
fn_usb_isr();
ENABLE;
}
void dma_eot(void)
{
//if(bEPPflags.bits.dma_state==DMA_PENDING)
// bEPPflags.bits.setup_dma=1;
//else
// bEPPflags.bits.dma_state=DMA_IDLE;
}
void bus_reset(void)
{
}
void fn_usb_isr()
{
unsigned int i_st;
bEPPflags.bits.in_isr = 1;
i_st = D12_ReadInterruptRegister();
if(i_st != 0)
{
if(i_st & D12_INT_BUSRESET)
{
bus_reset();
bEPPflags.bits.bus_reset = 1;
}
// else
// {
if(i_st & D12_INT_EOT)
{
dma_eot();
}
if(i_st & D12_INT_SUSPENDCHANGE)
{
bEPPflags.bits.suspend = 1;
}
if(i_st & D12_INT_ENDP0OUT)//0x01
{
ep0_rxdone();
}
if(i_st & D12_INT_ENDP0IN)//0x02
{
ep0_txdone();
}
if(i_st & D12_INT_ENDP1IN)
{ //bEPPflags.bits.ep1_transmit=1;
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();
}
// }
}//end of i_st
bEPPflags.bits.in_isr = 0;
}//end of fn_usb_isr
//控制输出(control out function)
void ep0_rxdone(void)
{
unsigned char ep_last, i;
//last = D12_ReadEndpointStatus(0) ;
ep_last = D12_ReadLastTransactionStatus(0); // Clear interrupt flag
if (ep_last & D12_SETUPPACKET)
//if (last & 0x04)
{
ControlData.wLength = 0;
ControlData.wCount = 0;
//判断端点是否满,如是,则取出
if( D12_ReadBuffer(0,(unsigned char *)(&(ControlData.DeviceRequest)),sizeof(ControlData.DeviceRequest)) != sizeof(DEVICE_REQUEST))
{
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);
// Acknowledge setup here to unlock in/out endp
//向控制输出端点发送应答建立命令以重新使能下一个建立阶段
D12_AcknowledgeEndpoint(0);
D12_AcknowledgeEndpoint(1);
ControlData.wLength = ControlData.DeviceRequest.wLength;
ControlData.wCount = 0;
//需要证实控制传输是控制读还是写,如果是读:
//如果控制传输是一个控制读类型那就是说器件需要在下一个数据阶段向
//主机发回数据包.MCU需要设置一个标志以指示USB 设备现在正处于传输
//模式即准备在主机发送请求时发送数据
if (ControlData.DeviceRequest.bmRequestType & (unsigned char)USB_ENDPOINT_DIRECTION_MASK)
{
bEPPflags.bits.setup_packet = 1;
bEPPflags.bits.control_state = USB_TRANSMIT; /* get command *///设置状态
}
//如果是写
else
{
if (ControlData.DeviceRequest.wLength == 0)
{
bEPPflags.bits.setup_packet = 1;
bEPPflags.bits.control_state = USB_IDLE; /* set command */
}
else
{
if(ControlData.DeviceRequest.wLength > MAX_CONTROLDATA_SIZE)
{
bEPPflags.bits.control_state = USB_IDLE;
D12_SetEndpointStatus(0, 1);
D12_SetEndpointStatus(1, 1);
}
else
{
bEPPflags.bits.control_state = USB_RECEIVE; /* set command with OUT token */
}
} // set command with data
} // else set command
} // if setup packet
else if (bEPPflags.bits.control_state == USB_RECEIVE)
{//接受数据完毕
i =D12_ReadBuffer(0, ControlData.dataBuffer + ControlData.wCount,EP0_PACKET_SIZE);
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;//进入等待状态
}
}
//control in function
void ep0_txdone(void)
{
short i = ControlData.wLength - ControlData.wCount;
D12_ReadLastTransactionStatus(1); // Clear interrupt flag
if (bEPPflags.bits.control_state != USB_TRANSMIT)
{
return; //非发送状态,返回
}
//-------------------------
if( i >= EP0_PACKET_SIZE)
{//剩下数据大于16B,发送16B
//ControlData.pData=&ControlData.dataBuffer;
D12_WriteBuffer(1, ControlData.pData + ControlData.wCount,EP0_PACKET_SIZE);
ControlData.wCount += EP0_PACKET_SIZE;
bEPPflags.bits.control_state = USB_TRANSMIT;
}
else if( i != 0)
{// 发送剩下数据
D12_WriteBuffer(1,ControlData.pData + ControlData.wCount,i);
ControlData.wCount += i;
bEPPflags.bits.control_state = USB_IDLE;
}
else if (i == 0)
{
D12_WriteBuffer(1, 0, 0); // Send zero packet at the end ???
bEPPflags.bits.control_state = USB_IDLE;
}
}
//----------------------------------
void ep1_txdone(void)
{
D12_ReadLastTransactionStatus(3); /* Clear interrupt flag */
//dd[0]=0x01;
//dd[1]=0x12;
//dd[2]=0x13;
//dd[3]=0x11;
//for(k=0;k<10;k++)
//{ D12_WriteBuffer(3,dd,2);}
}
void ep1_rxdone(void)
{
unsigned char len;
D12_ReadLastTransactionStatus(2); /* Clear interrupt flag */
len = D12_ReadBuffer(2,GenEpBuf,sizeof(GenEpBuf));
if(len != 0)
bEPPflags.bits.ep1_rxdone = 1;
}
void main_txdone(void)
{
unsigned char len;
D12_ReadLastTransactionStatus(5); /* Clear interrupt flag */
len = ioSize - ioCount;
/*if(len == 0)
{
if(bEPPflags.bits.dma_state == DMA_PENDING)
bEPPflags.bits.setup_dma ++;
else
bEPPflags.bits.dma_state = DMA_IDLE;
}
else
{*/
if(len > 64)
len = 64;
if(bNoRAM)
len = D12_WriteBuffer(5, EpBuf+ ioCount , len);
else
len = D12_WriteBuffer(5, MainEpBuf+ ioCount ,len );
ioCount += len;
//}
}
void main_rxdone(void)
{
unsigned char len;
D12_ReadLastTransactionStatus(4); /* Clear interrupt flag */
if(bNoRAM)
len = D12_ReadBuffer(4, EpBuf + ioCount,64);
else
len = D12_ReadBuffer(4, MainEpBuf + ioCount,64 );
//ioCount += len;
/*if(ioCount >= ioSize)
{
if(bEPPflags.bits.dma_state == DMA_PENDING)
bEPPflags.bits.setup_dma ++;
else
bEPPflags.bits.dma_state = DMA_IDLE;
}*/
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -