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