📄 drv_usb_main.c
字号:
** 功能描述: 端点2 OUT(接收)处理处理函数
** 输 入: 无
** 输 出: 无
********************************************************************/
// 端点EP2的接收处理函数(收到OUT包) 数据输出
void ep2_rxdone(void)
{
D_UINT16 iReadLen;
D_UINT32 uiResiduePage;
/* bulk_state为空闲,表示收到CBW包,处理CBW包 */
if (bEPPflags.bits.bulk_state == BULK_IDLE)
{
Bulk_CBWHandler();
}
/* bulk_state为收到数据,处理Data Out */
else if (bEPPflags.bits.bulk_state == BULK_DATA_RECIEVE)
{
uiResiduePage = BLOCKSIZE -
Bulk_Control_w.LogicalBlockAddress % BLOCKSIZE;
if (Bulk_Control_w.BufCount + EP1_PACKET_SIZE
<= PAGESIZE * Bulk_Control_w.Transfer_Length
&& Bulk_Control_w.BufCount + EP1_PACKET_SIZE
<= PAGESIZE * uiResiduePage)
{
iReadLen = USB_ReadEndpoint(USB_ENDPOINT_TYPE_BULK,
EP1_PACKET_SIZE, DataBuf + Bulk_Control_w.BufCount);
Bulk_Control_w.BufCount += iReadLen;
/*******************************************************************
将DataBuf缓冲区上的数据写入U盘。
因为U盘写数据以PAGESIZE*BLOCKSIZE为单位,
每次写数据都要考虑写入起始地址以及边界问题。
第一次写入PAGESIZE * Bulk_Control_w.Transfer_Length 和
PAGESIZE*(BLOCKSIZE-(Bulk_Control_w.LogicalBlockAddress%BLOCKSIZE)))
两者之间的最小值。
如果还有剩余的数据,每次以PAGESIZE*BLOCKSIZE写入。
最后,Bulk_Control_w.Transfer_Length < BLOCKSIZE时,
将剩余数据PAGESIZE*Bulk_Control_w.Transfer_Length写入。
每次写入数据都要更新Bulk_Control_w.LogicalBlockAddress 和
Bulk_Control_w.Transfer_Length 。
*******************************************************************/
if (Bulk_Control_w.BufCount == PAGESIZE * uiResiduePage)
{
drv_sd_write(Bulk_Control_w.LogicalBlockAddress,
(D_INT32*)DataBuf, (D_UINT8)uiResiduePage);
Bulk_Control_w.LogicalBlockAddress += uiResiduePage;
Bulk_Control_w.Transfer_Length -= uiResiduePage;
}
else if (Bulk_Control_w.BufCount ==
PAGESIZE * Bulk_Control_w.Transfer_Length)
{
drv_sd_write(Bulk_Control_w.LogicalBlockAddress,
(D_INT32*)DataBuf, (D_UINT8)Bulk_Control_w.Transfer_Length);
Bulk_Control_w.LogicalBlockAddress +=
Bulk_Control_w.Transfer_Length;
Bulk_Control_w.Transfer_Length = 0;
}
/* 数据写入完毕,置usb状态BULK_IDLE,发送应答CSW */
if (Bulk_Control_w.Transfer_Length == 0)
{
bEPPflags.bits.bulk_state = BULK_IDLE;
Bulk_CSWHandler();
}
}
/* U盘从端点读数据每次读的长度都是64,
缓冲区中收到的数据长度Bulk_Control_w.BufCount不是64的整数倍,
说明读数据的过程中出现了异常情况*/
else
{
Bulk_ErrorHandler(CSW_FAIL,
Bulk_Block.cbw.dCBWDataTransferLength -
PAGESIZE * Bulk_Control_w.Transfer_Length);
bEPPflags.bits.bulk_state = BULK_IDLE;
Bulk_CSWHandler();
}
}
}
#if 0
void timer_interrupt(void) interrupt 1
{
DISABLE();
TL0 = 0XB0;
TH0 = 0X3C;
time_count++;
if(time_count == 10)
{
time_count = 0;
led_tem = led_tem ^ 1;
bEPPflags.bits.timer = 1;
}
ENABLE();
}
#endif
/***********************************************************************
** 函数名称: void Usb_Exception(void)
** 功能描述: USB中断服务程序
*************************************************************************/
/*
void Usb_Exception(void)
{
D_UINT8 i_st;
DISABLE(); //进入USB中断服务程序时关中断
bEPPflags.bits.in_isr = 1;
i_st = USB_ReadInterruptRegister(); //读取PDIUSBUSB中断寄存器值
if(i_st != 0) {
if(i_st & SC_TRANS_DONE_BIT)
trans_done();
if(i_st & SC_SUSPEND_INT_BIT)
USB_ClearInterruptRegister(SC_SUSPEND_INT_BIT); //挂起改变标志置1
if(i_st & SC_RESUME_INT_BIT)
USB_ClearInterruptRegister(SC_RESUME_INT_BIT);
if(i_st & SC_RESET_EVENT_BIT)
USB_ClearInterruptRegister(SC_RESET_EVENT_BIT);
if(i_st & SC_SOF_RECEIVED_BIT)
USB_ClearInterruptRegister(SC_SOF_RECEIVED_BIT);
if(i_st & SC_NAK_SENT_INT_BIT)
USB_ClearInterruptRegister(SC_NAK_SENT_INT_BIT);
if(i_st & USB_INT_BUSRESET)
bEPPflags.bits.bus_reset = 1; //USB总线复位标志
if(i_st & USB_INT_EOT)
dma_eot(); //DMA传输技术处理
if(i_st & USB_INT_SUSPENDCHANGE)
bEPPflags.bits.suspend = 1; //挂起改变标志置1
if(i_st & USB_INT_ENDP0IN)
ep0_txdone(); //控制端点发送数据处理
if(i_st & USB_INT_ENDP0OUT)
ep0_rxdone(); //控制端点接收数据处理
if(i_st & USB_INT_ENDP1IN)
ep1_txdone(); //端点 1发送数据处理
if(i_st & USB_INT_ENDP1OUT)
ep1_rxdone(); //端点 1接收数据处理
if(i_st & USB_INT_ENDP2IN)
ep2_txdone(); //端点 2发送数据处理
if(i_st & USB_INT_ENDP2OUT)
ep2_rxdone(); //端点 2接收数据处理
}
bEPPflags.bits.in_isr = 0;
ENABLE(); //退出USB中断服务程序时开中断
}*/
#if 0
/************************************************************
** 函数名称: disconnect_USB()
** 功能描述: 断开USB总线
************************************************************/
void disconnect_USB(void)
{
// Initialize USB configuration
USB_SetMode(USB_NOLAZYCLOCK, USB_SETTOONE | USB_CLOCK_12M);
} //SoftConnect 断开
/************************************************************
** 函数名称: connect_USB()
** 功能描述: 连接USB总线
************************************************************/
void connect_USB(void)
{
// Initialize USB configuration
USB_SetDMA(0x00);
USB_SetMode(USB_NOLAZYCLOCK|USB_SOFTCONNECT, USB_SETTOONE | USB_CLOCK_12M);
} //SoftConnect 连接上,并设置为无LazyClock,模式为非同步模式
/************************************************************
** 函数名称: reconnect_USB()
** 功能描述: 重新连接USB总线
************************************************************/
void reconnect_USB(void)
{
D_UINT16 clk_cnt;
disconnect_USB(); //断开芯片与USB总线连接
for (clk_cnt = 0;clk_cnt<= 0x9000;clk_cnt++); //延时interrupt 0处理
connect_USB(); //连接到USB总线
}
/************************************************************
** 函数名称: Get_USB_FirmwareVer()
** 功能描述: 重新连接USB总线
** 输 入: 无
** 输 出: 16bit整数,如0x0500表示USB固件软件版本号为5.00
************************************************************/
D_UINT16 Get_USB_FirmwareVer(void)
{
return 0x0100; //USB固件软件版本号为5.00
}
#endif
/*******************************************************************
** 函数名称: usbserve()
** 功能描述: USB事件处理函数
** 输 入: 无
** 输 出: 无
********************************************************************/
void usbserve(void)
{
if (bEPPflags.bits.trans_done){ //Setup包处理
DISABLE();
bEPPflags.bits.trans_done = 0;
//control_handler();
trans_done(); //调用请求处理子程序
ENABLE();
}//if setup_packet
if (bEPPflags.bits.bus_reset) { //USB总线复位处理
DISABLE();
bEPPflags.bits.bus_reset = 0;
ENABLE();
usb_busreset();
} // if bus reset
if (bEPPflags.bits.suspend) { //USB挂起改变处理
DISABLE();
bEPPflags.bits.suspend= 0;
ENABLE();
usb_suspend();
} // if suspend change
//在此添加其它usb事件处理代码
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -