初涉USB,初學(xué)者USB入門(mén)總結(2) 設備固件程序
uchar test[100];//100長(cháng)度的變量,記錄過(guò)程
uchar conters=0;//記錄計數值,
/*------------------------------------------------------------
高校電子聯(lián)盟--肖繼達
QQ:258347765
-------------------------------------------------------------*/
void EXT_int(void)//USB中斷響應函數
{
/*------------------------------------------------------------
Check interrupt status register to know interrupt
source.
------------------------------------------------------------*/
if(USB_BUSRESET_ASS_INT())
{/* USB bus reset */
/*for USB Rev.1.1
After USB bus reset released, 10msec recoverly time we have.
Follwing request must be processed normally.
*/
CLR_BUS_RESET_STATE();/* USB bus reset status clear */
/*------------------------------------------------------------
Endpoint0 setting
------------------------------------------------------------*/
/* Tx/Rx payload size setting */
/* Rx payload is fixed as 8-byte or 32-byte, therefor the
setting has no meaninig */
SET_PAYLOAD_EPn(EP0RX, device_deor.bMaxPacketSize0);
SET_PAYLOAD_EPn(EP0TX, device_deor.bMaxPacketSize0);
/* Stall bit, the value undefined after reset, cleared */
CLR_STALL_EPn(EP0);
/*------------------------------------------------------------
Misceronous status variable initialization
------------------------------------------------------------*/
usb_status.configuration = NULL;
usb_status.remote_wakeup = 0;
usb_status.address = 0;
usb_status.dvcstate = DEFAULT_STATE;/* Device state :DEFAULT */
usb_status.stall_req = 0;
#ifdef Debug
test[conters]=!;
conters++;
#endif
/*------------------------------------------------------------
Callback to application layer
------------------------------------------------------------*/
(*usb_status.callback)();
}
else if (SUSPENDED_INT())
{/* suspended state */
/* for USB Rev.1.1
Transit to suspended state after detect the USB line has kept idle over 3msec.
After resume detected, end suspend state in 3msec to be able to respond
the host request.
*/
CLR_SUSPENDED_STATE();
#ifdef Debug
test[conters]=@;
conters++;
#endif
}
else if(AWAKE_INT())
{/* Deveice awake state */
/* AWAKE procedure */
CLR_AWAKE_STATE();/* Request clear */
#ifdef Debug
test[conters]=#;
conters++;
#endif
}
else if(USB_BUSRESET_DES_INT())
{/* USB bus reset deassert */
/* Procedure for USB bus reset de-assert */
CLR_BUS_RESET_DES_STATE();/* Request clear */
#ifdef Debug
test[conters]=$;
conters++;
#endif
}
else if(SOF_INT())
{/* SOF interrupt status */
CLR_B_SOF_STATE();
#ifdef Debug
test[conters]=%;
conters++;
#endif
/* SOF interrupt status clear */
}/* SOF interrupt status */
if(SETUP_RDY_INT())
{/* setup ready */
#ifdef Debug
test[conters]=^;
conters++;
#endif
read_Device_Requests();
}
else if(EP1_PKTRDY_INT())
{/* EP1 packet ready */
read_FIFO(EP1);
}
else if(EP2_PKTRDY_INT())
{/* EP2 packet ready */
write_FIFO(EP2);
}
else if(EP0_RXPKTRDY_INT())
{/* EP0 receive packet ready */
read_FIFO(EP0RX);
}
else if(EP0_TXPKTRDY_INT())
{/* EP0 transmit packet ready */
write_FIFO(EP0TX);
}
}
計錄的結果在變量查看中顯示如下:
首先我解釋一下,這段程序是我在做USB設備時(shí)的中斷函數。主控(就是你往里面寫(xiě)固件程序的那個(gè)東西)會(huì )在要求設備進(jìn)行操作時(shí),產(chǎn)生一個(gè)相應的中斷(我們可以用中斷的方式,也可以用查詢(xún)的方式,中斷的方式的好處就是主機有需要操作的都會(huì )叫你,而用查詢(xún)你必須不斷的問(wèn)主機“有事么”,這里采用中斷方式),比如主機給設備設置地址,主機會(huì )通過(guò)固定的通道(point0)發(fā)送一個(gè)‘設定地址’包,設備主控接到包后會(huì )產(chǎn)生中斷,并且把響應的狀態(tài)保存在相應的寄存器中,我們只要在中斷程序判斷各個(gè)寄存器就能完成主機的任務(wù)。
程序中藍色字是中斷類(lèi)型的判斷,其對應的宏定義就不列出來(lái)了。如果是這個(gè)中斷就會(huì )執行相應的中斷操作。并且一次中斷只有一種中斷類(lèi)型,我們在每個(gè)中斷響應中加一段紅色字的程序,是為了保存每次中斷的狀態(tài),比如剛插上設備,來(lái)了一次BUSRESET總線(xiàn)復位中斷,就會(huì )進(jìn)入相應的中斷操作,完了后記錄狀態(tài)test[conters]=!; conters++;意思是進(jìn)入了這個(gè)中斷就在這一組數的當前位置設成!,并且位置記錄的變量加一,以便下一次記錄到下一個(gè)位置。這樣USB的過(guò)程我們就記錄了下來(lái),
下面看一下記錄結果(其中的數字和字母是響應標準請求時(shí)的程序產(chǎn)生的這里不羅列程序了)。
評論