在許多的PC的USB應用中,越來越多的需要使用低功耗功能,PC可結合USB提供一定的供電能力,使得外設在1.5W以內,可以不用其他單獨的外部供電;更巧妙的是PC可以進入Sleep,驅使USB外設也進入Suspend狀態,達到只提供2.5mA的供電需求,以達到低功耗的目的。靈動微電子推出的MM32F0270系列,支持多種靈活的低功耗模式,支持Suspend模式的USB Device模塊。USB外設支持 USB掛起 /恢復操作,可以通過停止MCU時鐘來實現降低功耗。
當USB設備處于掛起狀態時,它仍然為其D+或D-及上拉電阻器供電,以保持空閑狀態并保持其內部狀態,包括地址和配置。當它被USB總線上的恢復信號喚醒時,它不需要經歷重新枚舉過程。
USB總線上的恢復信號可以由主機和設備發送。遠程喚醒功能使USB設備能夠喚醒掛起的主機;例如,將鼠標連接到筆記本電腦時,您可以通過單擊鼠標來喚醒已經進入睡眠狀態的筆記本電腦(PC端需要配置為支持遠程喚醒)。遠程喚醒功能在枚舉階段在配置描述符中報告,并且可以使用標準 USB 請求啟用(或禁用)。
本文介紹了如何使用 MM32F0270的USB來實現通過接收USB的D+/D-信號在實現Suspend/Resume的狀態轉換。
1、MM32F0270 USB的簡要介紹
符合 USB 2.0全速設備的技術規范;
支持全速模式(12M)
包含四個獨立的通用端點和一個控制傳輸端點用于中斷傳輸和批量傳輸
控制、批量 、 中斷傳輸 最大可傳輸 64字節的包
CRC生成 /校驗, NRZI編碼 /解碼和位填充
支持 USB掛起 /恢復操作
支持 DMA傳輸
圖1 USB的功能框圖
2、USB的功能特性
2.1、MM32的USB具有以下特性
USB模塊可以為PC主機和微控制器提供一種符合USB規范的通信連接,用于兩者所實現的功能之間的連接。PC主機和微控制器之間通過數據緩沖區完成數據傳輸,USB模塊與PC主機通信,根據USB規范完成對令牌分組的檢測,對數據發送/接收和握手分組的處理。由硬件完成對包括CRC的生成和校驗等整個傳輸的格式。每一個端點都有一個64字節緩沖區描述塊,且該緩沖區是在USB模塊內部,不能直接被CPU訪問的。一個有效的功能/端點的令牌分組被USB模塊識別,當端點已配置完成后發生相關的數據傳輸。USB模塊與專用數據緩沖區的數據交換通過內部寄存器完成。在所有的數據傳輸完成后,根據需要的傳輸方向,發送或接收適當的握手分組。
數據傳輸完成時,USB模塊會觸發端點相關的中斷,通過讀取狀態寄存器或利用不同的中斷處理程序,可以確定:
主機請求的傳輸類型
哪個端點需要得到服務
正在進行的是哪種類型的服務
端點的應答
傳輸是否完成
USB模塊在不工作時,可以通過配置USB_POWER寄存器使 USB模塊處于SUSPEND模式(低功耗模式)。USB模塊在低功耗模式下,USB時鐘會減慢或停止且USB模塊不產生靜態電流功耗。USB模塊在低功耗模式下,可以通過USB線上數據傳輸將其喚醒,也可以通過軟件直接將其喚醒。或者通過將特定的中斷輸入源連接到喚醒引腳上,使系統立即恢復正常的時鐘,可以直接啟動或停止時鐘系統。
2.2、MM32F0270 USB用于掛起和恢復的USB總線狀態
USB 規范定義了與 USB 總線上的信號電壓相對應的總線狀態。
下圖為連接到D+的1.5 kΩ上拉電阻的全速總線。
MM32F0270系列芯片內置1.5K上拉電阻。
下面介紹USB 總線如何定義掛起、恢復和空閑狀態的總線狀態。
設備的掛起
在USB系統中,正常狀態下PC,Hub或Root Hub會一直周期性地發送SOF包(Start Of Frame,全速USB每1ms發送一個,高速USB則是125μs發送一個)。根據USB協議,如果USB線上一直處于空閑(Idle)狀態超過3ms,設備應該把它當作一個掛起(Suspended)信號,要求設備在10ms內進入掛起狀態,并把設備所需的電流大小降到規定的值;對于low-power設備,要求是500μA,而對于high-power或支持遠程喚醒(remote wakeup)功能的設備是2.5mA。在掛起狀態中,設備必須繼續向數據項D+/D-的上拉電阻提供電壓以維持Idle狀態。
設備的喚醒
設備處于掛起狀態時,任何總線上的活動(非空閑信號)都可以把設備喚醒/恢復,從而退出低功耗模式。同樣,設備也可以換醒host,比如電腦待機時通過USB鍵盤來換醒主機,這種功能稱之為“遠程喚醒”(remote wakeup),不在本文的討論范圍內。
因為設備掛起時處于全速信號,在當host需要把將設備退出suspend狀態時,需要先發送一個持續時間超過20ms的Fulll Speed K狀態。設備看到K狀態結束的1.3us內醒過來,而host需要在3ms內發送SOF信號以維持正常的高速信號模式,否則設備又將進入suspend。如下圖所示:
下面是USB的數據狀態與信號的說明:
數據 J 和 K 狀態Data J and K states
對于全速總線段,J 狀態與差分 1 相同,即 D+ 為邏輯高電平時和 D- 為邏輯低電平,而 K 狀態與差分 0 相同,即當 D+ 為邏輯低電平且D- 是邏輯高電平。
空閑狀態Idle state
在空閑狀態下,對于全速總線段,D+ 比 D- 的電平高。
掛起狀態Suspend signal
由于當USB總線處于空閑狀態超過3 ms時進入掛起狀態,因此掛起狀態與空閑狀態相同或與全速總線段中的J狀態相同。
恢復信號Resume signal
當設備處于掛起狀態時,設備端口上的數據K狀態表示從掛起狀態恢復。這意味著恢復信號是全速段中從數據J狀態到數據K狀態的變化。
2.3、MM32F0270 USB支持從Suspend模式下喚醒
MM32F0270 可通過EXTI線 18連接到 USB總線掛起中斷實現USB從掛起狀態喚醒。
需要使用喚醒時,需要使能相應的USB中斷外,還需配置EXTI 18以使能相關的功能。
相關的寄存器與控制狀態位的控制與查詢,可以參考MM32F0270的用戶手冊。
3、USB進入Suspend與Res ume的軟硬件設計
3.1、在庫函數版本的樣例中可以通過如下順序初始化USB
a.配置系統時鐘為48MHz或96Mhz,使能GPIOA時鐘,使能USB時鐘
void USB_ClockConfig(void) { USB_HSI48M_Config(); Set_CRS(); // The calibration of vibration // Select USBCLK source // RCC_USBCLKConfig(RCC_USBCLKSource_PLLCLK_Div2); //if SYSCLK is 96MHz // Enable USB clock RCC_APB1PeriphClockCmd(RCC_APB1ENR_USB, ENABLE); }
b.配置USB D+和D-所需用到的GPIO引腳,使用GPIO_Configuration函數
void GPIO_Configuration(void) { GPIO_InitTypeDef GPIO_InitStruct; GPIO_StructInit( GPIO_InitStruct); RCC_AHBPeriphClockCmd(RCC_AHBENR_GPIOA, ENABLE); // USB_DISCONNECT used as USB pull-up GPIO_InitStruct.GPIO_Pin = USB_DISCONNECT_PIN; GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStruct.GPIO_Mode = GPIO_Mode_FLOATING; GPIO_Init(USB_DISCONNECT, GPIO_InitStruct); }
c.配置USB的中斷,調用USB_NVIC_Config函數
void USB_NVIC_Config(void) { NVIC_InitTypeDef NVIC_InitStruct; NVIC_InitStruct.NVIC_IRQChannel = USB_IRQn; NVIC_InitStruct.NVIC_IRQChannelPriority = 0; NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE; NVIC_Init( NVIC_InitStruct); }
d.設置USB的時鐘,調用USB_ClockConfig
void USB_ClockConfig(void) { USB_HSI48M_Config(); Set_CRS(); // The calibration of vibration // Select USBCLK source // RCC_USBCLKConfig(RCC_USBCLKSource_PLLCLK_Div2); // Enable USB clock RCC_APB1PeriphClockCmd(RCC_APB1ENR_USB, ENABLE); }
e.設置USB 初始化
void USB_Init(void) { pInformation = Device_Info; pInformation->ControlState = 2; pProperty = Device_Property; pUser_Standard_Requests = User_Standard_Requests; // Initialize devices one by one pProperty->Init(); }
f.設定USB對應喚醒的EXTI參數
void USB1_WKUP_Init(void) { EXTI_InitTypeDef EXTI_InitStructure; EXTI_InitStructure.EXTI_Line = EXTI_Line18; EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; EXTI_InitStructure.EXTI_LineCmd = ENABLE; EXTI_Init( EXTI_InitStructure); }
g.中斷相應處理函數
void USB_Istr(void) { __IO u16 wIstr; wIstr = _GetUSB_INT_STA(); //USB->INT_STATE = wIstr; // fSuspendEnabled = 0; if(wIstr USB_INT_STATE_RSTF) { _ClrUSB_INT_STA(USB_INT_STATE_RSTF) ; Device_Property.Reset(); } //… EXTI_ClearITPendingBit(EXTI_Line22); }
3.2、實現main Demo功能的主要函數代碼
s32 main(void) { GPIO_Configuration(); USB_NVIC_Config(); USB_ClockConfig(); USB_Init(); while(1) { if(bDeviceState == CONFIGURED) { if(!(_GetUSB_CTRL1() EP1_CTRL_TRANEN)) { UserToPMABufferCopy(gTableData, ENDP1, BUFF_SIZE); _SetUSB_CTRL1(EP1_CTRL_TRANEN | BUFF_SIZE) ; //Loop IN transmission } } } }
配置好初始化USB收發的初始化操作后,PC端會發現USB HID枚舉成功;此時PC端進入待機模式,
MCU的USB收到Suspend的命令后,執行:
void Suspend(void) { if(bDeviceState == CONFIGURED) { //Frequency the bus clock 512 USB->POWER = ~USB_POWER_SUSP; bDeviceState = SUSPENDED; fSuspendEnabled = true; RCC->CFGR = ~RCC_CFGR_HPRE; RCC->CFGR |= RCC_CFGR_HPRE_DIV512; RCC->CR = ~(0x1f << 26); RCC_USBCLKConfig(RCC_USBCLKSource_PLLCLK_Div4); UART_DeInit(UART1); } }
USB喚醒機制
USB設備進入掛起狀態之后,將由Resume信號進行喚醒。Resume信號可以由USB主機發起,也可以由USB設備本身觸發,但是只有USB主機可以結束Resume信號。
主機在掛起設備后可通過翻轉數據線上的極性并保持20ms來喚醒設備,并以低速EOP信號結尾。
如果設備支持遠程喚醒,設備可向主機發起遠程喚醒請求,前提是設備已進入idle狀態至少5ms,設備會驅動總線進入K狀態,如下圖,K狀態必須維持1ms-15ms之內,此信號會在1ms內被主機接管,主機會繼續驅動喚醒信號直到20ms,并以低速EOP信號結尾。
主機復位設備或者設備對自己強行復位,設備也會從掛起狀態切換到默認狀態。
MM32F0270 設備被喚醒后,如果喚醒中斷使能(比如使用PA0的EXTI0),則會進入喚醒中斷,退出低功耗模式,然后清除USB_POWER寄存器的SUSPEND位,退出強制掛起操作。
操作上體現為PC Host主機同按主機KeyBoard或鼠標按鍵實現退出睡眠狀態,從而喚醒MM32F0270的掛起狀態。
通過上述的步驟,簡單的演示了MM32F0270的USB 接收數據,通過數據幀中的Start Bit喚醒MCU的功能。
Demo程序可登錄MindMotion的官網下載MM32F0270 lib_Samples
工程路徑如下:
~ MM32F0270_SamplesLibSamplesUSB
來源:靈動MM32MCU
-
mcu
+關注
關注
146文章
17318瀏覽量
352649 -
usb
+關注
關注
60文章
7980瀏覽量
266095 -
總線
+關注
關注
10文章
2903瀏覽量
88395 -
低功耗
+關注
關注
10文章
2418瀏覽量
103896
發布評論請先 登錄
相關推薦
評論