📄 usb_isr.c
字号:
#include "usb_isr.h"
//-------------------------------------------------------------------------*
//函数:USB_StatusChgISR--挂起,复位中断函数 *
//功能:清除相应的标志位 *
//-------------------------------------------------------------------------*
#pragma CODE_SEG DEFAULT
#pragma TRAP_PROC
void USB_StatusChgISR(void)
{
// 检测是否是挂起(Suspend)状态改变
if(mCheckBit(USSC, UMSR1))
{
UMSR1 = (1 << USSC);
}
else
{
// 检测是否是复位(Suspend)状态改变
if(mCheckBit(URSC, UMSR1))
{
// 判断总线是否检测到复位状态
if(mCheckBit(URD, UMSR1))
{
#ifdef DEBUG
SCISendString("reset ISR\r\n");
#endif
// 察看设备是作为全速还是是高速设备运行
while (mCheckBit(URD, UMSR1));
if (mCheckBit(FULLSPD, UMSR1))
{
gUSBFullSpeed = 1;
#ifdef DEBUG
SCISendString("Full Speed\r\n");
#endif
}
else
{
gUSBFullSpeed = 0;
#ifdef DEBUG
SCISendString("High Speed\r\n");
#endif
}
// 重新初始化
USB_ModuleInit();
USB_InitBulkOnlyTransport();
}
// 清复位状态
UMSR1 = (1 << URSC);
}
}
}
//-------------------------------------------------------------------------*
//函数:USB_StartFrameISR *
//功能:USB起始帧中断处理 *
//-------------------------------------------------------------------------*
#pragma CODE_SEG DEFAULT
#pragma TRAP_PROC
/*USB起始帧中断处理*/
void USB_StartFrameISR(void)
{
if(mCheckBit(SOF, UMSR1)) //SOF已被检测
{
#ifdef DEBUG
SCISendString("SOF detect ISR\r\n");
#endif
UMSR1 = (1<<SOF);
mSetBit(USSCIE, UIMR); // 事务被确认, 使能USSC中断
mClearBit(SOFIE, UIMR); // 关SOF中断
}
}
//USB的Setup中断处理程序
#pragma CODE_SEG DEFAULT
#pragma TRAP_PROC
void USB_SetupISR(void)
{
#ifdef DEBUG
SCISendString("SETUP Paket ISR\r\t");
#endif
if(mCheckBit(SETOVR, UMSR1)) // 判断SETUP命令是否运行超时
{
UMSR1 = (1<<SETOVR); // 清除该位
USB_DecodeSETUP(&USTB); // 调用解析SETUP包子程序
}
else
{
if(mCheckBit(SETUP, UMSR1)) // 判断SETUP命令是否被检测到
{
UMSR1 = (1<<SETUP);
USB_DecodeSETUP(&USTB); // 调用解析SETUP包子程序
}
}
}
//-------------------------------------------------------------------------*
//函数:USB_SetConfigISR *
//功能:USB SET_CONFIGURATION中断处理 *
//-------------------------------------------------------------------------*
#pragma CODE_SEG DEFAULT
#pragma TRAP_PROC
void USB_SetConfigISR(void)
{
if(mCheckBit(SETECR, UCCSR)) // 判断是否是设置端点配置请求
{
#ifdef DEBUG
SCISendString("Set Config ISR\r\n");
#endif
if (mCheckBit(CFGVALID, UCCSR)) {
// 判断是否配置有效
mSetBit(DONEECRU, UCCSR); // 设置端点配置更新
return;
};
if (mCheckBit(INTFVALID, UCCSR)) {
// 判断是否接口有效
mSetBit(DONEECRU, UCCSR); // 设置接口更新
return;
}
}
}
//-------------------------------------------------------------------------*
//函数:USB_EP0INISR *
//功能:端点0 IN中断 *
//-------------------------------------------------------------------------*
#pragma TRAP_PROC
void USB_EP0INISR(void)
{
UINT8 size = UEPCSR0 & 0x007f;
// 判断是否是端点0的IN包检测
if(mCheckBit(TFRC, UEPCSR0))
{
#ifdef DEBUG
SCISendString("POINT1 IN ISR Begin\r\n");
SCISendString("POINT1 In size:");
SCISendOneByte(size + 48);
SCISendString("\r\n");
SCISendString("Data is:");
SCISendNByte((UINT8 *)&UEPLB0 ,size);
SCISendString("\r\n");
SCISendString("POINT1 IN ISR End\r\n");
#endif
UEPCSR0 = 0x3000; // 清除DVALID位, 清除TFRC位
}
PORTA |= (1<<1);
}
//-------------------------------------------------------------------------*
//函数:USB_EP0OUTISR *
//功能:端点0 OUT中断 *
//-------------------------------------------------------------------------*
#pragma TRAP_PROC
void USB_EP0OUTISR(void)
{
UINT8 size = UEPCSR1 & 0x007f;
// 判断是否是端点0的OUT包检测
if(mCheckBit(TFRC, UEPCSR1))
{
#ifdef DEBUG
SCISendString("POINT1 OUT ISR Begin\r\n");
SCISendString("POINT1 OUT size:");
SCISendOneByte(size + 48);
SCISendString("");
SCISendString("Data is:");
SCISendNByte((UINT8 *)&UEPLB1 ,size);
SCISendString("\r\n");
SCISendString("POINT1 OUT ISR End\r\n");
#endif
UEPCSR1 = 0x3000; // 清除DVALID位, 清除TFRC位
}
PORTA |= (1<<0);
}
/*端点2中断处理函数*/
#pragma TRAP_PROC
void USB_PhyEP2ISR(void)
{
UINT8 size = UEPCSR2 & 0x007f;
// 判断是否是端点2包检测
if(mCheckBit(TFRC, UEPCSR2))
{
#ifdef DEBUG
SCISendString("POINT2 IN ISR begin\r\n");
SCISendString("POINT2 IN ISR end\r\n");
#endif
UEPCSR2 = 0x3000;
}
}
/*
void ProcessData(UINT8 *buf, UINT8 size)
{
PCOMMAND pcmd = (PCOMMAND)buf;
//如是新的命令请求,则拷贝到缓冲区
if( pcmd->type == CMD_LIGHT || pcmd->type == CMD_MESSAGE ||
pcmd->type == CMD_GET_LIGHT_STAT)
{
USB_Move2LocalBuffer(buf, (UINT8*)&g_cmd, size);
g_bDo = TRUE;
SCISendString("Option 1\r\n");
}
SCISendOneByte(g_bDo);
SCISendString("ProcessData end\r\n");
}
*/
//-------------------------------------------------------------------------*
//函数:USB_PhyEP3ISR *
//功能:端点3中断处理程序 *
//-------------------------------------------------------------------------*
#pragma TRAP_PROC
void USB_PhyEP3ISR(void)
{
UINT8 size = UEPCSR3 & 0x007f;
//判断是否是端点3包检测
if(mCheckBit(TFRC, UEPCSR3))
{
#ifdef DEBUG
SCISendString("POINT3 OUT ISR begin\r\n");
SCISendNByte((UINT8*)USB_SetBufferPtr(PHY3),size);
SCISendString("\r\n");
//ProcessData((UINT8 *)&UEPLB1, size);
SCISendString("POINT3 OUT ISR End\r\n");
#endif
UEPCSR3 = 0x3000;
}
}
//-------------------------------------------------------------------------*
//函数:Excute_Action--挂起,复位中断函数 *
//功能:端点4 in中断 *
//-------------------------------------------------------------------------*
//#define QC1DR_H *(volatile UINT8*)(0x0200+0x02)
static void Excute_Action()
{
UINT16 *pbuf;
UINT16 i ;
SCISendString("Excute_Action begin\r\n");
/*if(g_cmd.type == CMD_LIGHT)
{
SCISendOneByte(g_cmd.pbuf[0]);
Light(g_cmd.pbuf[0]);
SCISendString("light\r\n");
}
if( (g_cmd.type == CMD_GET_LIGHT_STAT) || (g_cmd.type == CMD_MESSAGE))
{
USB_Move2QUE3(g_cmd.pbuf, g_cmd.size);
pbuf = (UINT16 *)g_cmd.pbuf;
USBMS_SetPhyEP5Int(g_cmd.size);
i = (QC3EP - QC3BP);
SCISendNByte((UINT8 *)&i, 2);
SCISendString("\r\nMessage or Get lighet state\r\n");
} */
USB_Move2QUE3(gdata, gsize);
USBMS_SetPhyEP5Int(gsize);
SCISendString("Excute_Action End\r\n");
}
//-------------------------------------------------------------------------*
//函数:USB_PhyEP4ISR *
//功能:端点4 out中断 *
//-------------------------------------------------------------------------*
#pragma TRAP_PROC
void USB_PhyEP4ISR(void)
{
UINT16 size = UEPCSR4A & 0x07FF;
UINT16 i = 0;
UINT16 *pbuf = (UINT16 *)&gdata;
gsize = size;
/*判断是不是收到了数据*/
//if(UEPCSR4A & UEPCSR4A_TFRC4A_MASK)
if(mCheckBit(TFRC, UEPCSR4A))
{
#ifdef DEBUG
SCISendString("POINT4 OUT ISR begin\r\n");
#endif
/*如果短数据,复位标志,短数据说明是最后一个包*/
//if(UEPCSR4B & UEPCSR4B_SPKT_MASK)
if(mCheckBit(SPKT,UEPCSR4B))
{
//UEPCSR4B |= UEPCSR4B_SPKT_MASK;
mSetBit(SPKT,UEPCSR4B);
}
//读取缓冲区的数据
//测试通道1是否为空
while(!(QC1SR & QC1SR_Q1ESF_MASK) )
{
//pbuf[i] = QC1DR;
pbuf[i] = QC1DR;
i += 1;
}
#ifdef DEBUG
SCISendString("\r\n");
//SCISendNByte((UINT8*)&g_cmd, size);
#endif
Excute_Action();
UEPCSR4A = 0x3800;
UEPCSR4B = 0x0000;
#ifdef DEBUG
SCISendString("POINT4 OUT ISR End\r\n");
#endif
}
}
//-------------------------------------------------------------------------*
//函数:USB_PhyEP5ISR *
//功能:端点5 In中断 *
//-------------------------------------------------------------------------*
#pragma TRAP_PROC
void USB_PhyEP5ISR(void)
{
UINT16 size = UEPCSR5A & 0x07FF;
SCISendString("POINT5 In ISR begin\r\n");
//if(UEPCSR5A & UEPCSR5A_TFRC5A_MASK)
//如果transfer结束
if(mCheckBit(TFRC, UEPCSR5A))
{
//如果不是规定的格式数据,则不发送
//规定下次发送,如果不是设备有数据把标志位置位,那么不会发送
//UEPCSR5A = 0x7800;
do
UEPCSR5A |= (1<<SNAK)+(1<<TFRC)+(1<<USBTCIE); // Enable NAK, clear TFRC
while (!( mCheckBit(SNAK,UEPCSR5A) && mCheckBit(USBTCIE,UEPCSR5A)) );
}
SCISendString("POINT5 Out ISR begin\r\n");
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -