在許多的PC的USB應(yīng)用中,越來越多的需要使用低功耗功能,PC可結(jié)合USB提供一定的供電能力,使得外設(shè)在1.5W以內(nèi),可以不用其他單獨(dú)的外部供電;更巧妙的是PC可以進(jìn)入Sleep,驅(qū)使USB外設(shè)也進(jìn)入Suspend狀態(tài),達(dá)到只提供2.5mA的供電需求,以達(dá)到低功耗的目的。靈動(dòng)微電子推出的MM32F0270系列,支持多種靈活的低功耗模式,支持Suspend模式的USB Device模塊。USB外設(shè)支持 USB掛起 /恢復(fù)操作,可以通過停止MCU時(shí)鐘來實(shí)現(xiàn)降低功耗。
當(dāng)USB設(shè)備處于掛起狀態(tài)時(shí),它仍然為其D+或D-及上拉電阻器供電,以保持空閑狀態(tài)并保持其內(nèi)部狀態(tài),包括地址和配置。當(dāng)它被USB總線上的恢復(fù)信號(hào)喚醒時(shí),它不需要經(jīng)歷重新枚舉過程。
USB總線上的恢復(fù)信號(hào)可以由主機(jī)和設(shè)備發(fā)送。遠(yuǎn)程喚醒功能使USB設(shè)備能夠喚醒掛起的主機(jī);例如,將鼠標(biāo)連接到筆記本電腦時(shí),您可以通過單擊鼠標(biāo)來喚醒已經(jīng)進(jìn)入睡眠狀態(tài)的筆記本電腦(PC端需要配置為支持遠(yuǎn)程喚醒)。遠(yuǎn)程喚醒功能在枚舉階段在配置描述符中報(bào)告,并且可以使用標(biāo)準(zhǔn) USB 請(qǐng)求啟用(或禁用)。
本文介紹了如何使用 MM32F0270的USB來實(shí)現(xiàn)通過接收USB的D+/D-信號(hào)在實(shí)現(xiàn)Suspend/Resume的狀態(tài)轉(zhuǎn)換。
1、MM32F0270 USB的簡(jiǎn)要介紹
符合 USB 2.0全速設(shè)備的技術(shù)規(guī)范;
支持全速模式(12M)
包含四個(gè)獨(dú)立的通用端點(diǎn)和一個(gè)控制傳輸端點(diǎn)用于中斷傳輸和批量傳輸
控制、批量 、 中斷傳輸 最大可傳輸 64字節(jié)的包
CRC生成 /校驗(yàn), NRZI編碼 /解碼和位填充
支持 USB掛起 /恢復(fù)操作
支持 DMA傳輸
圖1 USB的功能框圖
2、USB的功能特性
2.1、MM32的USB具有以下特性
USB模塊可以為PC主機(jī)和微控制器提供一種符合USB規(guī)范的通信連接,用于兩者所實(shí)現(xiàn)的功能之間的連接。PC主機(jī)和微控制器之間通過數(shù)據(jù)緩沖區(qū)完成數(shù)據(jù)傳輸,USB模塊與PC主機(jī)通信,根據(jù)USB規(guī)范完成對(duì)令牌分組的檢測(cè),對(duì)數(shù)據(jù)發(fā)送/接收和握手分組的處理。由硬件完成對(duì)包括CRC的生成和校驗(yàn)等整個(gè)傳輸?shù)母袷?。每一個(gè)端點(diǎn)都有一個(gè)64字節(jié)緩沖區(qū)描述塊,且該緩沖區(qū)是在USB模塊內(nèi)部,不能直接被CPU訪問的。一個(gè)有效的功能/端點(diǎn)的令牌分組被USB模塊識(shí)別,當(dāng)端點(diǎn)已配置完成后發(fā)生相關(guān)的數(shù)據(jù)傳輸。USB模塊與專用數(shù)據(jù)緩沖區(qū)的數(shù)據(jù)交換通過內(nèi)部寄存器完成。在所有的數(shù)據(jù)傳輸完成后,根據(jù)需要的傳輸方向,發(fā)送或接收適當(dāng)?shù)奈帐址纸M。
數(shù)據(jù)傳輸完成時(shí),USB模塊會(huì)觸發(fā)端點(diǎn)相關(guān)的中斷,通過讀取狀態(tài)寄存器或利用不同的中斷處理程序,可以確定:
主機(jī)請(qǐng)求的傳輸類型
哪個(gè)端點(diǎn)需要得到服務(wù)
正在進(jìn)行的是哪種類型的服務(wù)
端點(diǎn)的應(yīng)答
傳輸是否完成
USB模塊在不工作時(shí),可以通過配置USB_POWER寄存器使 USB模塊處于SUSPEND模式(低功耗模式)。USB模塊在低功耗模式下,USB時(shí)鐘會(huì)減慢或停止且USB模塊不產(chǎn)生靜態(tài)電流功耗。USB模塊在低功耗模式下,可以通過USB線上數(shù)據(jù)傳輸將其喚醒,也可以通過軟件直接將其喚醒?;蛘咄ㄟ^將特定的中斷輸入源連接到喚醒引腳上,使系統(tǒng)立即恢復(fù)正常的時(shí)鐘,可以直接啟動(dòng)或停止時(shí)鐘系統(tǒng)。
2.2、MM32F0270 USB用于掛起和恢復(fù)的USB總線狀態(tài)
USB 規(guī)范定義了與 USB 總線上的信號(hào)電壓相對(duì)應(yīng)的總線狀態(tài)。
下圖為連接到D+的1.5 kΩ上拉電阻的全速總線。
MM32F0270系列芯片內(nèi)置1.5K上拉電阻。
下面介紹USB 總線如何定義掛起、恢復(fù)和空閑狀態(tài)的總線狀態(tài)。
設(shè)備的掛起
在USB系統(tǒng)中,正常狀態(tài)下PC,Hub或Root Hub會(huì)一直周期性地發(fā)送SOF包(Start Of Frame,全速USB每1ms發(fā)送一個(gè),高速USB則是125μs發(fā)送一個(gè))。根據(jù)USB協(xié)議,如果USB線上一直處于空閑(Idle)狀態(tài)超過3ms,設(shè)備應(yīng)該把它當(dāng)作一個(gè)掛起(Suspended)信號(hào),要求設(shè)備在10ms內(nèi)進(jìn)入掛起狀態(tài),并把設(shè)備所需的電流大小降到規(guī)定的值;對(duì)于low-power設(shè)備,要求是500μA,而對(duì)于high-power或支持遠(yuǎn)程喚醒(remote wakeup)功能的設(shè)備是2.5mA。在掛起狀態(tài)中,設(shè)備必須繼續(xù)向數(shù)據(jù)項(xiàng)D+/D-的上拉電阻提供電壓以維持Idle狀態(tài)。
設(shè)備的喚醒
設(shè)備處于掛起狀態(tài)時(shí),任何總線上的活動(dòng)(非空閑信號(hào))都可以把設(shè)備喚醒/恢復(fù),從而退出低功耗模式。同樣,設(shè)備也可以換醒host,比如電腦待機(jī)時(shí)通過USB鍵盤來換醒主機(jī),這種功能稱之為“遠(yuǎn)程喚醒”(remote wakeup),不在本文的討論范圍內(nèi)。
因?yàn)樵O(shè)備掛起時(shí)處于全速信號(hào),在當(dāng)host需要把將設(shè)備退出suspend狀態(tài)時(shí),需要先發(fā)送一個(gè)持續(xù)時(shí)間超過20ms的Fulll Speed K狀態(tài)。設(shè)備看到K狀態(tài)結(jié)束的1.3us內(nèi)醒過來,而host需要在3ms內(nèi)發(fā)送SOF信號(hào)以維持正常的高速信號(hào)模式,否則設(shè)備又將進(jìn)入suspend。如下圖所示:
下面是USB的數(shù)據(jù)狀態(tài)與信號(hào)的說明:
數(shù)據(jù) J 和 K 狀態(tài)Data J and K states
對(duì)于全速總線段,J 狀態(tài)與差分 1 相同,即 D+ 為邏輯高電平時(shí)和 D- 為邏輯低電平,而 K 狀態(tài)與差分 0 相同,即當(dāng) D+ 為邏輯低電平且D- 是邏輯高電平。
空閑狀態(tài)Idle state
在空閑狀態(tài)下,對(duì)于全速總線段,D+ 比 D- 的電平高。
掛起狀態(tài)Suspend signal
由于當(dāng)USB總線處于空閑狀態(tài)超過3 ms時(shí)進(jìn)入掛起狀態(tài),因此掛起狀態(tài)與空閑狀態(tài)相同或與全速總線段中的J狀態(tài)相同。
恢復(fù)信號(hào)Resume signal
當(dāng)設(shè)備處于掛起狀態(tài)時(shí),設(shè)備端口上的數(shù)據(jù)K狀態(tài)表示從掛起狀態(tài)恢復(fù)。這意味著恢復(fù)信號(hào)是全速段中從數(shù)據(jù)J狀態(tài)到數(shù)據(jù)K狀態(tài)的變化。
2.3、MM32F0270 USB支持從Suspend模式下喚醒
MM32F0270 可通過EXTI線 18連接到 USB總線掛起中斷實(shí)現(xiàn)USB從掛起狀態(tài)喚醒。
需要使用喚醒時(shí),需要使能相應(yīng)的USB中斷外,還需配置EXTI 18以使能相關(guān)的功能。
相關(guān)的寄存器與控制狀態(tài)位的控制與查詢,可以參考MM32F0270的用戶手冊(cè)。
3、USB進(jìn)入Suspend與Res ume的軟硬件設(shè)計(jì)
3.1、在庫(kù)函數(shù)版本的樣例中可以通過如下順序初始化USB
a.配置系統(tǒng)時(shí)鐘為48MHz或96Mhz,使能GPIOA時(shí)鐘,使能USB時(shí)鐘
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函數(shù)
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的中斷,調(diào)用USB_NVIC_Config函數(shù)
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.設(shè)置USB的時(shí)鐘,調(diào)用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.設(shè)置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.設(shè)定USB對(duì)應(yīng)喚醒的EXTI參數(shù)
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.中斷相應(yīng)處理函數(shù)
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、實(shí)現(xiàn)main Demo功能的主要函數(shù)代碼
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收發(fā)的初始化操作后,PC端會(huì)發(fā)現(xiàn)USB HID枚舉成功;此時(shí)PC端進(jìn)入待機(jī)模式,
MCU的USB收到Suspend的命令后,執(zhí)行:
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喚醒機(jī)制
USB設(shè)備進(jìn)入掛起狀態(tài)之后,將由Resume信號(hào)進(jìn)行喚醒。Resume信號(hào)可以由USB主機(jī)發(fā)起,也可以由USB設(shè)備本身觸發(fā),但是只有USB主機(jī)可以結(jié)束Resume信號(hào)。
主機(jī)在掛起設(shè)備后可通過翻轉(zhuǎn)數(shù)據(jù)線上的極性并保持20ms來喚醒設(shè)備,并以低速EOP信號(hào)結(jié)尾。
如果設(shè)備支持遠(yuǎn)程喚醒,設(shè)備可向主機(jī)發(fā)起遠(yuǎn)程喚醒請(qǐng)求,前提是設(shè)備已進(jìn)入idle狀態(tài)至少5ms,設(shè)備會(huì)驅(qū)動(dòng)總線進(jìn)入K狀態(tài),如下圖,K狀態(tài)必須維持1ms-15ms之內(nèi),此信號(hào)會(huì)在1ms內(nèi)被主機(jī)接管,主機(jī)會(huì)繼續(xù)驅(qū)動(dòng)喚醒信號(hào)直到20ms,并以低速EOP信號(hào)結(jié)尾。
主機(jī)復(fù)位設(shè)備或者設(shè)備對(duì)自己強(qiáng)行復(fù)位,設(shè)備也會(huì)從掛起狀態(tài)切換到默認(rèn)狀態(tài)。
MM32F0270 設(shè)備被喚醒后,如果喚醒中斷使能(比如使用PA0的EXTI0),則會(huì)進(jìn)入喚醒中斷,退出低功耗模式,然后清除USB_POWER寄存器的SUSPEND位,退出強(qiáng)制掛起操作。
操作上體現(xiàn)為PC Host主機(jī)同按主機(jī)KeyBoard或鼠標(biāo)按鍵實(shí)現(xiàn)退出睡眠狀態(tài),從而喚醒MM32F0270的掛起狀態(tài)。
通過上述的步驟,簡(jiǎn)單的演示了MM32F0270的USB 接收數(shù)據(jù),通過數(shù)據(jù)幀中的Start Bit喚醒MCU的功能。
Demo程序可登錄MindMotion的官網(wǎng)下載MM32F0270 lib_Samples
工程路徑如下:
~ MM32F0270_SamplesLibSamplesUSB
來源:靈動(dòng)MM32MCU
-
mcu
+關(guān)注
關(guān)注
146文章
17171瀏覽量
351458 -
usb
+關(guān)注
關(guān)注
60文章
7950瀏覽量
264897 -
總線
+關(guān)注
關(guān)注
10文章
2888瀏覽量
88137 -
低功耗
+關(guān)注
關(guān)注
10文章
2407瀏覽量
103754
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論