EFM8 USB Library使用笔记
一 官方介紹連接
http://devtools.silabs.com/studio/doc/EFM8/software/Lib/group___efm8__usb.html#details
二. 個(gè)人理解
USB Hardware 部分
具體的USB MCU的型號(hào)
EFM8 USB0 Peripheral Driver
在EFM8的庫(kù)文件中,有對(duì)應(yīng)芯片的peripheral 庫(kù)中有對(duì)應(yīng)的USB_0.c/usb_0.h 可以直接使用。
EFM8 USB Library
用戶程序需要包含 efm8_usb.h
用戶需要?jiǎng)?chuàng)建 usbconfig.h, 這里建議直接copy例程的文件,然后修改。
用戶程序 和EFM8 USB Library的接口, 有兩個(gè)部分, USB API 和 Call back function
開(kāi)始調(diào)用方法, usb API 函數(shù)
USBD_Init( USBD_Init_TypeDef)
用戶程序需要調(diào)用USBD_Init() 函數(shù) 來(lái)注冊(cè)u(píng)sb設(shè)備, usb設(shè)備的信息需要通過(guò)USBD_Init_TypeDef結(jié)構(gòu)體變量傳給usb_init函數(shù)。
USBD_Init_TypeDef 的 成員:
USB_DeviceDescriptor_TypeDef deviceDescriptor
USB_ConfigurationDescriptor_TypeDef configDescriptor
USB_StringTable_TypeDef stringDescriptors
uint8_t numberOfStrings;
deviceDescriptor 指向USB設(shè)備的設(shè)備描述符
configDescriptor 指向USB設(shè)備的配置描述符
stringDescriptors 指向USB設(shè)備的字符描述符表, 包括多個(gè)字符串描述符
numberOfStrings 定義有多少個(gè)字符串
call back 函數(shù)
Library 函數(shù)僅僅處理標(biāo)準(zhǔn)的USB命令, Class 命令需要由call back函數(shù)處理。
USBD_XferCompleteCb(): 當(dāng)Package接收或者發(fā)送結(jié)束后調(diào)用,USBD_Write和USBD_Read可以通過(guò)參數(shù) true or false 來(lái)決定要不要調(diào)用USBD_XferCompleteCb
USBD_SetupCmdCb():當(dāng)usb總線上有reset 信號(hào)時(shí)調(diào)用。
USBD_SofCb() : 當(dāng)SOF中斷時(shí)調(diào)用,SOF每1ms發(fā)送一次,可以阻止USB進(jìn)入suspend 模式,同時(shí)Frame number可以用來(lái)同步Host和Device。 也可以用作1ms的定時(shí)發(fā)送數(shù)據(jù)
USBD_DeviceStateChangeCb() 當(dāng)USB的狀態(tài)發(fā)生改變時(shí)調(diào)用,這個(gè)函數(shù)可以用來(lái)實(shí)現(xiàn)檢測(cè)suspend,當(dāng)suspend發(fā)生時(shí),進(jìn)入省電模式。 也可以在進(jìn)入configuration模式后,調(diào)用USBD_Read來(lái)讀出configuration模式
USBD_IsSelfPoweredCb() USB協(xié)議棧查詢Power狀態(tài)時(shí)調(diào)用
USBD_SetupCmdCb() 當(dāng)setup command 收到時(shí)調(diào)用,用來(lái)擴(kuò)展或者重載standard request。 或者處理Class or vendor defined 命令。
USBD_Read(), USBD_Write() API 函數(shù)
初始化一個(gè)讀或者寫(xiě)的transfer,當(dāng)USBhost正在發(fā)起讀或者寫(xiě)的動(dòng)作后,USBD_XferCompleteCb會(huì)被調(diào)用
USBD_AbortTransfer(), USBD_AbortAllTransfers()
終止由 USBD_Read USBD_Write 初始化但沒(méi)有真正完成的Transfer , 為新的Transfer做好準(zhǔn)備。
USBD_Connect(), USBD_Disconnect()
使能 or 去使 D+/- 上的Pull-up 電阻, 重新開(kāi)始枚舉, 最好間隔1秒
USBD_EpIsBusy()
檢測(cè) Endpoint是不是busy
5 USBD_StallEp(), USBD_UnStallEp()
stall / unstall 端點(diǎn),在 u盤(pán)的應(yīng)用中使用廣泛
USBD_Stop() 關(guān)閉USB D+/- 上的上拉電阻, 應(yīng)用程序需要重新調(diào)用USBD_Init來(lái)打開(kāi)USB
USBD_Suspend() USB進(jìn)入suspend 模式, usb 庫(kù)函數(shù)可以經(jīng)過(guò)配置,自動(dòng)進(jìn)入suspend模式, 由喚醒信號(hào)自動(dòng)喚醒。
USBD_RemoteWakeup() 經(jīng)配置,自動(dòng)喚醒Host
USBD_GetUsbState() 返回當(dāng)前USB的狀態(tài)USBD_State_TypeDef
USBD_Run() Polling 模式下,在主循環(huán)中調(diào)用, 中斷模式下不需要。
中斷模式下,API和Call back函數(shù)均有中斷函數(shù)調(diào)用, C51沒(méi)有重入函數(shù),如果需要在其他地方調(diào)用API函數(shù)時(shí),需要關(guān)閉中斷。
總結(jié)
以上是生活随笔為你收集整理的EFM8 USB Library使用笔记的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 数据库设计的六个阶段详解
- 下一篇: fcpx插件:stupid raisin