STM32 USB協議和代碼分析



一 前言:

usb接口是一個非常重要的通信接口,它的協議是有些復雜的。作為一個工程師,對usb協議和代碼進行分析,是一個必備的素質和技能。
最近一個項目用到了USB存儲接口,花了不少時間把項目做完之后,還是有不少心得體會的。這里做一個梳理和總結,希望能給人乘涼。


二 硬件接口

 usb的硬件連線非常簡單,GND,DP,DN和VCC,一般是GND和VCC可以復用的。


三 USB協議的描述符

  這個函數完成描述符的掛載
if (USBD_Init(&hUsbDeviceFS, &FS_Desc, DEVICE_FS) != USBD_OK)
這個結構體是對描述符的定義:比如,制造商,產品描述,id號什么的個性化的東西都可以在這里做修改。
USBD_DescriptorsTypeDef FS_Desc =
{
USBD_FS_DeviceDescriptor
, USBD_FS_LangIDStrDescriptor
, USBD_FS_ManufacturerStrDescriptor
, USBD_FS_ProductStrDescriptor
, USBD_FS_SerialStrDescriptor
, USBD_FS_ConfigStrDescriptor
, USBD_FS_InterfaceStrDescriptor
#if (USBD_LPM_ENABLED == 1)
, USBD_FS_USR_BOSDescriptor
#endif /* (USBD_LPM_ENABLED == 1) */
};

四 usb協議的事件類型

   這個函數是注冊usb的事件類型:

USBD_StatusTypeDef USBD_RegisterClass(USBD_HandleTypeDef *pdev, USBD_ClassTypeDef *pclass)

  該結構體完成usb的事件的枚舉和定義,可以看出,該事件主要是對usb的文件系統做了定義,並不是所有的都做了定義的。

USBD_ClassTypeDef USBD_MSC =
{
USBD_MSC_Init,
USBD_MSC_DeInit,
USBD_MSC_Setup,
NULL, /*EP0_TxSent*/
NULL, /*EP0_RxReady*/
USBD_MSC_DataIn,
USBD_MSC_DataOut,
NULL, /*SOF */
NULL,
NULL,
USBD_MSC_GetHSCfgDesc,
USBD_MSC_GetFSCfgDesc,
USBD_MSC_GetOtherSpeedCfgDesc,
USBD_MSC_GetDeviceQualifierDescriptor,
};


五 usb存儲事件類型

usb存儲接口是一個常用的信息。針對需要USB存儲的接口的設備,這需要注冊的。

if (USBD_MSC_RegisterStorage(&hUsbDeviceFS, &USBD_Storage_Interface_fops_FS) != USBD_OK)

這幾個事件非常清晰的描述了usb讀寫文件的一些常用信息,比如,獲取文件系統的大小,讀文件,寫文件等。

USBD_StorageTypeDef USBD_Storage_Interface_fops_FS =
{
STORAGE_Init_FS,
STORAGE_GetCapacity_FS,
STORAGE_IsReady_FS,
STORAGE_IsWriteProtected_FS,
STORAGE_Read_FS,
STORAGE_Write_FS,
STORAGE_GetMaxLun_FS,
(int8_t *)STORAGE_Inquirydata_FS
};

隨便找一個里面的函數來看一下,可以看出,該函數的功能是明確的,就是一個單純的文件寫。

/**
* @brief .
* @param lun: .
* @retval USBD_OK if all operations are OK else USBD_FAIL
*/
int8_t STORAGE_Write_FS(uint8_t lun, uint8_t *buf, uint32_t blk_addr, uint16_t blk_len)
{
/* USER CODE BEGIN 7 */
SD_disk_write(0, buf, blk_addr, blk_len);
return (USBD_OK);
/* USER CODE END 7 */
}


六 延申問題

1 usb的定制化內容在哪兒?

 

   想讓你的usb設備與眾不同,能顯示一些個性化的信息,描述符是關鍵,對描述符的修改和定義,是一個個性化定制的重要方面。

2 usb的兼容性問題解決思路有哪些?

    usb會經常碰到兼容性問題,怎么解決兼容性i問題,這個最好的辦法就是找一個usb抓包卡,把好的壞的一對比,馬上就能定位出原因了。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM