STM8芯片應用注意事項
一、usb_desc.c文件
根據你程序使用的通信方式修改。usb_desc.h文件中定義要根據usb_desc.c文件中的數組的大??;ConfigDescriptor[SIZ_CONFIG_DESC]下添加需要處理的端點(diǎn);根據需要添加或刪除報告描述符(主要用于HID)和CDC接口描述符(主要用于實(shí)現USB轉串口)等。具體方法可以下載個(gè)“電腦圈圈”使用D12編寫(xiě)的例子。
二、Usb_conf.h文件:
1、修改需要處理那些中斷
CNTR_CTRM處理數據正確傳輸后控制,比如說(shuō)響應主機
CNTR_DOVRM/* DMA OVeR/underrun Mask */
CNTR_ERRM/* ERRor Mask */
CNTR_WKUPM 0/* WaKe UP Mask */
CNTR_SUSPM/* SUSPend Mask */
CNTR_RESETM主要處理USB復位后進(jìn)行一些初始化任務(wù)
CNTR_SOFM/* Start Of Frame Mask */
CNTR_ESOFM/* Expected Start Of Frame Mask */
如:
usb_conf.h中的#define IMR_MSK (CNTR_CTRM | CNTR_SOFM | CNTR_RESETM )是決定USB_CNTR寄存器中的那個(gè)USB相關(guān)中斷啟動(dòng)還是屏蔽。
2、根據需要增加端點(diǎn)緩存地址,要根據緩存區的地址修改,防止數據重疊
如下為根據每個(gè)緩沖區的大小為64字節修改:
#define ENDP1_TXADDR(0xC0)
#define ENDP1_RXADDR(0xD0)
#define ENDP2_TXADDR(0x100)
#define ENDP2_RXADDR(0x140)
#define ENDP3_TXADDR(0x180)
#define ENDP3_RXADDR(0x1C0)
3、修改/* CTR service routines */下的EPX_IN_Callback和EPX_OUT_Callback。注釋掉需要處理的函數。NOP_Process表示不處理。
三usb_prop.c文件
1、修改void XX_Reset(void)(如:void Joystick_Reset(void))
一般/* Initialize Endpoint 0 */的不用修改,如下為舉例說(shuō)明端點(diǎn)1的初始化,其他端口原理一樣。
SetEPType(ENDP1, EP_INTERRUPT);//設置端點(diǎn)1類(lèi)型
/*EP_BULK批量端點(diǎn)
EP_CONTROL控制端點(diǎn)
EP_ISOCHRNOUS同步端點(diǎn)
EP_INTERRUPT中斷端點(diǎn)*/
SetEPTxAddr(ENDP1, ENDP1_TXADDR); //設置端點(diǎn)1緩沖區基地址
SetEPTxCount(ENDP1, 64);//配置Tx緩沖計數器
SetEPRxStatus(ENDP1, EP_RX_DIS);// //設置端點(diǎn)接收關(guān)閉
SetEPTxStatus(ENDP1, EP_TX_NAK);// //設置端點(diǎn)1發(fā)送不應答
/*
#define EP_RX_DIS(0x0000) // EndPoint RX DISabled端點(diǎn)接收關(guān)閉
#define EP_RX_STALL(0x1000) // EndPoint RX STALLed端點(diǎn)接收延遲
#define EP_RX_NAK(0x2000) // EndPoint RX NAKed端點(diǎn)接收不應答
#define EP_RX_VALID(0x3000) // EndPoint RX VALID端點(diǎn)接收有效
#define EP_TX_DIS(0x0000) //EndPoint TX DISabled
#define EP_TX_STALL(0x0010) // EndPoint TX STALLed
#define EP_TX_NAK(0x0020) // EndPoint TX NAKed
#define EP_TX_VALID(0x0030) // EndPoint TX VALID */
2、刪除不相干的描述符等。
如自定義的USB設備就不需要以下結構體初始化:
ONE_DESCRIPTOR Joystick_Report_Descriptor
ONE_DESCRIPTOR Mouse_Hid_Descriptor
3、修改RESULT XX_Data_Setup(u8 RequestNo)的數據類(lèi)請求處理。
如Custom_HID例程修改為“自定義USB設備”例程時(shí)可以將以下代碼刪除
if ((RequestNo == GET_DESCRIPTOR)
&& (Type_Recipient == (STANDARD_REQUEST | INTERFACE_RECIPIENT))
&& (pInformation->USBwIndex0 == 0))
{
if (pInformation->USBwValue1 == REPORT_DESCRIPTOR)
{
CopyRoutine = Joystick_GetReportDescriptor;
}
else if (pInformation->USBwValue1 == HID_DESCRIPTOR_TYPE)
{
CopyRoutine = Joystick_GetHIDDescriptor;
}
}
4、刪除不相干的獲得描述符返回函數
如自定義的USB設備就不需要以下函數:
Joystick_GetReportDescriptor
Joystick_GetHIDDescriptor
四、usb_endp.c文件
1、增加之前定義的中斷數據處理函數
如:
void EP1_OUT_Callback(void)
{
這些寫(xiě)接收代碼
}
五、數據發(fā)送和接收,舉例說(shuō)明
1、數據接收
u8 DataLen;
DataLen = GetEPRxCount(ENDP1);
PMAToUserBufferCopy(TX1_buffer, ENDP1_RXADDR, DataLen);
SetEPRxValid(ENDP1);
USART1_Send(DataLen);
count_out = 1;
2、數據發(fā)送
UserToPMABufferCopy(InBuffer, GetEPTxAddr(ENDP1), 64);
SetEPTxCount(ENDP1, 64);
SetEPTxValid(ENDP1);
如果你發(fā)送數據較為頻繁,每次發(fā)送前應使用GetEPTxStatus(ENDP1)檢測上次發(fā)送是否完成。如果端點(diǎn)狀態(tài)處于EP_TX_VALID,說(shuō)明發(fā)送未結束,如果端點(diǎn)狀態(tài)處于EP_TX_NAK,說(shuō)明發(fā)送結束。
評論