📄 d12int.c
字号:
/*
;*************************************************************************************************************
;* 江西师范大学物理通讯电子学院
;*
;* 创 新 中 心
;*
;*--------------------------------------------- 文件信息 -----------------------------------------------------
;* 文件名称 : D12Int.c
;* 文件功能 : PDIUSBD12的中断服务函数实现.
;* 补充说明 :
;*-------------------------------------------- 最新版本信息 --------------------------------------------------
;* 修改作者 : zhouhong
;* 修改日期 : 2006-11-14
;* 版本声明 : V1.0.0
;*-------------------------------------------- 历史版本信息 --------------------------------------------------
;* 文件作者 :
;* 创建日期 :
;* 版本声明 :
;*-----------------------------------------------------------------------------------------------------------
;*************************************************************************************************************
;*/
#ifndef _D12Int_c_
#define _D12Int_c_
#include "..\INC\D12Config.h"
#include "..\INC\USBecd.h"
#include "..\INC\Descriptor.h"
#include "..\INC\D12Int.h"
#include "..\..\Uart_driver\inc\Uart_driver.h"
INT8U * usb_send_ptr; //USB 发送的数据的指针
INT16U usb_send_remain; //USB还没有发送的数据个数
INT8U usbSendDescNoEnd; //USB 发送描述符没有结束1:表示没有,0:结束
INT8U Ep2OutBuf[EP2_PACKET_SIZE]; //USB端口2的接收与发送的数据缓冲区
INT8U usb_RxTx_size; //USB端口2的接收与发送的数据长度
INT8U boolEp2Tx=0; //USB端口2的发送开关量.
/*
*************************************************************************************************************
* PDIUSBD12 中断服务函数
*************************************************************************************************************
*/
INT8U (*StandardDeviceRequest[])(USB_DEVICE_REQUEST *sDeviceRequest) = {
USB_Get_Status,
USB_Clear_Feature,
USB_Reserved,
USB_Set_Feature,
USB_Reserved,
USB_Set_Address,
USB_Get_Descriptor,
USB_Reserved,
USB_Get_Configuration,
USB_Set_Configuration,
USB_Get_Interface,
USB_Set_Interface,
USB_Reserved,
USB_Reserved,
USB_Reserved,
USB_Reserved
};
void INT_FLAG D12_Exception(void)
{
INT16U i_st;
#if USB_INT
USB_CLR_INTD12(); //清除中断标志
#endif
i_st=D12_ReadInterruptRegister(); //读取PDIUSBD12中断寄存器的值
if(i_st!=0)
{
#if USB_DEBUG
printf("\nUSB Interrupt %d ",i_st);
#endif
if(i_st & USB_INT_CONTROL_OUT) //控制端点输出
{
#if USB_DEBUG
printf("D12_Ep0_RxIntProc()");
#endif
D12_Ep0_RxIntProc();
}
if(i_st & USB_INT_CONTROL_IN) //控制端点输入
{
#if USB_DEBUG
printf("D12_Ep1_TxIntProc()");
#endif
D12_Ep1_TxIntProc();
}
if(i_st & USB_INT_ENDPOINT1_OUT) //端点1输出
{
#if USB_DEBUG
printf("D12_Ep2_RxIntProc()");
#endif
D12_Ep2_RxIntProc();
}
if(i_st & USB_INT_ENDPOINT1_IN) //端点1输入
{
#if USB_DEBUG
printf("D12_Ep3_TxIntProc()");
#endif
D12_Ep3_TxIntProc();
}
if(i_st & USB_INT_ENDPOINT2_OUT) //端点2输出
{
#if USB_DEBUG
printf("D12_Ep4_RxIntProc()");
#endif
D12_Ep4_RxIntProc();
}
if(i_st & USB_INT_ENDPOINT2_IN) //端点2输入
{
#if USB_DEBUG
printf("D12_Ep5_TxIntProc()");
#endif
D12_Ep5_TxIntProc();
}
if(i_st & USB_INT_BUS_RESET) //总线复位处理
{
#if USB_DEBUG
printf("D12_BusRstIntProc()");
#endif
D12_BusRstIntProc();
}
if(i_st & USB_INT_SUSPEND_CHANGE) //挂起改变
{
#if USB_DEBUG
printf("D12_SuspChgIntProc()");
#endif
D12_SuspChgIntProc();
}
if(i_st & USB_INT_EOT) //DMA EOT
{
#if USB_DEBUG
printf("D12_DMAEotIntProc()");
#endif
D12_DMAEotIntProc();
}
}
}
/*
*************************************************************************************************************
- 函数名称 : Usb_Send_Desc(void)
- 函数说明 : 用来发送描述符数据函数.
- 输入参数 : 无
- 输出参数 : 无
*************************************************************************************************************
*/
void Usb_Send_Desc(void)
{
#if USB_DEBUG
INT8U i;
#endif
usbSendDescNoEnd= (usb_send_remain>=EP0_PACKET_SIZE); //判断是否下次还要发送数据
D12_WriteEndpoint(USB_ENDPOINT_CONTROL_IN,
(usb_send_remain>EP0_PACKET_SIZE)?EP0_PACKET_SIZE:usb_send_remain,usb_send_ptr);
//调试时使用
//-------------------------------------------------------------------------------------------
#if USB_DEBUG
printf("\n@"); //输出发送到主机的描述符数据
for(i=0; i<((usb_send_remain>EP0_PACKET_SIZE) ? EP0_PACKET_SIZE: usb_send_remain); i++)
printf("%x,", *(INT8U*)(usb_send_ptr+i));
#endif
//-------------------------------------------------------------------------------------------
usb_send_remain -= EP0_PACKET_SIZE;
usb_send_ptr+= EP0_PACKET_SIZE;
}
/*
*************************************************************************************************************
- 函数名称 : D12_Ep0_RxIntProc(void)
- 函数说明 : PDIUSBD12 控制端点接收数据中断处理
- 输入参数 : 无
- 输出参数 : 无
*************************************************************************************************************
*/
void D12_Ep0_RxIntProc(void)
{
USB_DEVICE_REQUEST sDeviceRequest; //外部设备请求包
INT8U setupPkt[sizeof(USB_DEVICE_DESCRIPTOR)]; //SETUP包接收缓冲区
INT8U ep_last;
#if USB_DEBUG //在调试的情况下
INT8U i;
#endif
usbSendDescNoEnd = 0; //结束
//清除中断标志,且读出最后处理状态寄存器
ep_last=D12_ReadLastTransactionStatus(USB_ENDPOINT_CONTROL_OUT);
if(ep_last & USB_XACTION_STATUS_SETUP_PACKET) //是设备信息包
if(D12_ReadEndpoint(USB_ENDPOINT_CONTROL_OUT, sizeof(USB_DEVICE_REQUEST), setupPkt)
==sizeof(USB_DEVICE_REQUEST))
{
D12_AcknowledgeEndpoint(USB_ENDPOINT_CONTROL_OUT); //对控制端点0进行建立包应答
D12_AcknowledgeEndpoint(USB_ENDPOINT_CONTROL_IN); //对控制端点1进行建立包应答
//调试时使用
//-------------------------------------------------------------------------------
#if USB_DEBUG
printf("\n*");
for(i=0; i<8; i++) //输出SetuP 包的数据
printf("%x,", setupPkt[i]);
printf("*");
#endif
//-------------------------------------------------------------------------------
/****************************以下语句是在小端方式下完成*********************************/
//建立设备请求包sDeviceRequest
sDeviceRequest.bmRequestType=setupPkt[0];
sDeviceRequest.bRequest=setupPkt[1];
sDeviceRequest.wValue=setupPkt[3]*256+setupPkt[2];
sDeviceRequest.wIndex=setupPkt[5]*256+setupPkt[4];
sDeviceRequest.wLength=setupPkt[7]*256+setupPkt[6];
/***************************************************************************************/
StandardDeviceRequest[sDeviceRequest.bRequest & 0xf](&sDeviceRequest);
return;
}
D12_SetEndpointStatus(USB_ENDPOINT_CONTROL_OUT, USB_SET_ENDPOINT_STALL);
D12_SetEndpointStatus(USB_ENDPOINT_CONTROL_IN, USB_SET_ENDPOINT_STALL);
}
/*
*************************************************************************************************************
- 函数名称 : D12_Ep1_TxIntProc(void)
- 函数说明 : PDIUSBD12 控制端点发送数据中断处理
- 输入参数 : 无
- 输出参数 : 无
*************************************************************************************************************
*/
void D12_Ep1_TxIntProc(void)
{
INT8U ep_last;
//读取最后处理状态寄存器
ep_last=D12_ReadLastTransactionStatus(USB_ENDPOINT_CONTROL_IN); //清除中断标志位
if(usbSendDescNoEnd) //若没有结束则在发
Usb_Send_Desc();
}
extern void ShowLed(INT8U );
/*
*************************************************************************************************************
- 函数名称 : D12_Ep2_RxIntProc(void)
- 函数说明 : PDIUSBD12 端点1接 收数据中断处理
- 输入参数 : 无
- 输出参数 : 无
*************************************************************************************************************
*/
void D12_Ep2_RxIntProc(void)
{
INT8U size;
INT8U Ep2OutBuf[EP2_PACKET_SIZE];
//读取最后处理状态寄存器
D12_ReadLastTransactionStatus(USB_ENDPOINT_COMMAND_OUT);
size = D12_ReadEndpoint(USB_ENDPOINT_COMMAND_OUT, EP1_PACKET_SIZE, Ep2OutBuf);
if((size==6) && (*(int *)Ep2OutBuf==0x12345678))
{
#if USB_DEBUG //调试时输出
printf("接收到数据 %x,%x",Ep2OutBuf[4],Ep2OutBuf[5]);
#endif
ShowLed((Ep2OutBuf[4])>>1);
}
//D12_SetEndpointStatus(USB_ENDPOINT_COMMAND_OUT, USB_SET_ENDPOINT_STALL);
}
/*
*************************************************************************************************************
- 函数名称 : D12_Ep3_TxIntProc(void)
- 函数说明 : PDIUSBD12 端点1发送数据中断处理
- 输入参数 : 无
- 输出参数 : 无
*************************************************************************************************************
*/
void D12_Ep3_TxIntProc(void)
{
D12_ReadLastTransactionStatus(USB_ENDPOINT_ACK_IN); //清除中断标志位
D12_SetEndpointStatus(USB_ENDPOINT_ACK_IN , USB_SET_ENDPOINT_STALL);
}
/*
*************************************************************************************************************
- 函数名称 : D12_Ep4_RxIntProc(void)
- 函数说明 : PDIUSBD12主输出端点接收数据中断处理
- 输入参数 : 无
- 输出参数 : 无
*************************************************************************************************************
*/
void D12_Ep4_RxIntProc(void)
{
INT8U i;
//读取最后处理状态寄存器
D12_ReadLastTransactionStatus(USB_ENDPOINT_BULK_OUT);
usb_RxTx_size=D12_ReadEndpoint(USB_ENDPOINT_BULK_OUT, EP2_PACKET_SIZE,Ep2OutBuf);
/*#if USB_DEBUG
printf("接收到数据为:");
for(i=0;i<size;i++)
printf("%02x ",Ep2OutBuf[i]);
printf(" %x",(*(int *)Ep2OutBuf));
#endif
if((size==6) && (*(int *)Ep2OutBuf==0x78563412))
{
ShowLed((Ep2OutBuf[4])>>1);
}*/
printf("\n接收到数据为:\n");
for(i=0;i<usb_RxTx_size;i++)
printf("%c",(INT8)Ep2OutBuf[i]);
}
/*
*************************************************************************************************************
- 函数名称 : D12_Ep5_TxIntProc(void)
- 函数说明 : PDIUSBD12 主输入端点发送数据中断处理
- 输入参数 : 无
- 输出参数 : 无
*************************************************************************************************************
*/
void D12_Ep5_TxIntProc(void)
{
INT8U i;
D12_ReadLastTransactionStatus(USB_ENDPOINT_BULK_IN);
if(!boolEp2Tx) //还没有发送数据.0:没有发送数据,0xff表示:发送数据后的自己产生的中断非外部读数据中断
{
printf("\n发送数据到主机的数据为:\n");
for(i=0;i<usb_RxTx_size;i++)
printf("%c",(INT8)Ep2OutBuf[i]);
D12_WriteEndpoint(USB_ENDPOINT_BULK_IN,usb_RxTx_size, Ep2OutBuf);
}
boolEp2Tx=~boolEp2Tx;
}
/*
*************************************************************************************************************
- 函数名称 : D12_BusRstProc()
- 函数说明 : PDIUSBD12 总线复位中断处理
- 输入参数 : 无
- 输出参数 : 无
*************************************************************************************************************
*/
void D12_BusRstIntProc(void)
{
}
/*
*************************************************************************************************************
- 函数名称 : D12_SuspChgProc(void)
- 函数说明 : PDIUSBD12 挂起改变中断处理
- 输入参数 : 无
- 输出参数 : 无
*************************************************************************************************************
*/
void D12_SuspChgIntProc(void)
{
}
/*
*************************************************************************************************************
- 函数名称 : D12_DMAEotIntProc(void)
- 函数说明 : PDIUSBD12 DMA 操作完成中断处理
- 输入参数 : 无
- 输出参数 : 无
*************************************************************************************************************
*/
void D12_DMAEotIntProc(void)
{
}
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -