久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 7441|回復(fù): 0
收起左側(cè)

STM32F103 USB 端點(diǎn)調(diào)整話題

[復(fù)制鏈接]
ID:98618 發(fā)表于 2015-12-8 03:07 | 顯示全部樓層 |閱讀模式
前言

理解 STM32F103 上 USB 模塊的端點(diǎn)資源,靈活在應(yīng)用中的配置。

問題

某客戶使用 STM32F103 的 USB 模塊做設(shè)備時和上位機(jī) PC 連接時碰到一個問題:PC 端驅(qū)動已經(jīng)固定好,是對下位機(jī) USB 設(shè)備上的地址編號為 0x0A 和 0x0B 的兩個端點(diǎn)通信,從 0x0A 端點(diǎn)讀取數(shù)據(jù),向 0x0B 端點(diǎn)寫數(shù)據(jù)。而 STM32F103 的 USB 模塊只有 8 個雙向端點(diǎn),能否支持這樣的尋址。

1. 問題調(diào)研

我們先來看看 STM32F103 上的 USB 端點(diǎn)資源。從 STM32F103 參考手冊(RM0008)可知,一共有 8 個雙向端點(diǎn),對應(yīng) 8個寄存器來控制其屬性和表征其狀態(tài)。如下圖,可知每一對端點(diǎn)必須配置成相同 的端點(diǎn)地址,這個地址位域是 4 位,取值從 0x0 到 0x0F 范圍。


和以下摘錄的 USB 規(guī)范符合:


客戶使用的是 STSW-STM32121(STM32F10x, STM32L1xx and STM32F3xx 全速 USB 設(shè)備庫), 那么應(yīng)該修改哪些代碼呢?

2. 問題分析

首先,USB 設(shè)備通過端點(diǎn)描述符向主機(jī) PC 報告它所使用的端點(diǎn)有哪些:每個端點(diǎn)的地址(即 USB 規(guī) 范里,以及參考手冊的寄存器中規(guī)定的那 4 位地址域)、傳輸方向、傳輸類型、最大包長等。以 STSW-STM32121 庫中的 Mass_Storage 例程為例,需要把<usb_desc.c>中的端點(diǎn)描述符做如下修改: 0x0A 地址的端點(diǎn)作為 IN端點(diǎn)(PC 從它讀取數(shù)據(jù)),0x0B 地址的端點(diǎn)作為 OUT 端點(diǎn)(PC 向它寫數(shù) 據(jù))。

const uint8_t MASS_ConfigDescriptor[MASS_SIZ_CONFIG_DESC] =

{ 。。。。。。

/* 18 */

0x07, /*Endpoint descriptor length = 7*/

0x05, /*Endpoint descriptor type */

0x8A, //0x81, /*Endpoint address (IN, address 1) */

0x02, /*Bulk endpoint type */

0x40, /*Maximum packet size (64 bytes) */

0x00,

0x00, /*Polling interval in milliseconds */

/* 25 */

0x07, /*Endpoint descriptor length = 7 */

0x05, /*Endpoint descriptor type */

0x0B, //0x02, /*Endpoint address (OUT, address 2) */

0x02, /*Bulk endpoint type */

0x40, /*Maximum packet size (64 bytes) */

0x00,

0x00 /*Polling interval in milliseconds*/

/*32*/

};

接下來就是考慮使用 STM32F103 USB 模塊提供的 8 個雙向端點(diǎn)的哪個端點(diǎn)了。我們剛才從參考手冊 關(guān)于寄存器描述的截圖中看到,每一對端點(diǎn)具有相同的地址。在庫函數(shù)里,對端點(diǎn)寄存器的地址位域 的操作在這里:


這個函數(shù)的名稱是“設(shè)置(USB)設(shè)備地址”,但是其中除了最后一句是在設(shè)置 USB 設(shè)備的地址,前面 的 for 循環(huán)是在設(shè)置該設(shè)備內(nèi)的端點(diǎn)地址。


從以上綠色標(biāo)注的代碼段可以看到,庫代碼固定給 1 號端點(diǎn)”0x01”這個地址,2 號端點(diǎn)”0x02”這個地址, 以此類推。這里的”1 號”、”2 號”指的是端點(diǎn)的編號,對應(yīng)的就是之前提到的 8 個寄存器的編號,即下圖 中的 n=0~7。n 在這里就是端點(diǎn)的編號。


那么在這個應(yīng)用中,需要用到地址為 0x0A 和 0x0B 的兩個端點(diǎn),但是端點(diǎn)編號最多只能到 7,因此需 要修改庫代碼中關(guān)于端點(diǎn)地址設(shè)置的地方如下:這里,我們使用編號為 1和 2 的兩個端點(diǎn)。

為啥不用編號 0?因?yàn)榫幪?0 默認(rèn)給雙向 0 端點(diǎn),即用于控制傳輸?shù)?0 端點(diǎn)。

為啥用 2 個編號?因?yàn)檫@里需要 2 個不同的端點(diǎn)地址,必須用 2 個編號。一個編號對應(yīng)的 2 個 端點(diǎn)必須共享同樣的端點(diǎn)地址。



既然這里指定了使用編號 1 和編號 2 的端點(diǎn),那么需要在<usb_conf.h>中設(shè)置這兩個端點(diǎn)的硬件收發(fā)緩沖區(qū)地址


當(dāng)然如果你很任性,一定要使用編號為 6和 7 的端點(diǎn),也可以,那么代碼就如下修改:

void SetDeviceAddress(uint8_t Val)

{

/* set address in every used endpoint */

_SetEPAddress((uint8_t)0, (uint8_t)0);

_SetEPAddress((uint8_t)6, (uint8_t)0x0A);

_SetEPAddress((uint8_t)7, (uint8_t)0x0B);

_SetDADDR(Val | DADDR_EF); /* set device address and enable function */

}

相應(yīng)地,需要在<usb_conf.h>中指明編號為 6 和 7 的這兩個端點(diǎn)的硬件收發(fā)緩沖區(qū)地址。那么如法炮 制做如下修改,就可以了嗎?就可以了嗎?

/* EP0 */

/* rx/tx buffer base address */

#define ENDP0_RXADDR (0x18)

#define ENDP0_TXADDR (0x58)

/* 6 號端點(diǎn),IN 端點(diǎn),發(fā)送緩沖區(qū)如下 */

#define ENDP6_TXADDR (0x98)

/* 7 號端點(diǎn),OUT 端點(diǎn),接收緩沖區(qū)如下 */

#define ENDP7_RXADDR (0xD8)

答案是否定的!以下的代碼才 OK。欲知詳情,請參考下《STM32F103 上 USB 模塊的包緩沖區(qū)詳解》或相關(guān)應(yīng)用文字。

/* EP0 */

/* rx/tx buffer base address */

#define ENDP0_RXADDR (0x40)

#define ENDP0_TXADDR (0x80)

/* 6 號端點(diǎn),IN 端點(diǎn),發(fā)送緩沖區(qū)如下 */

#define ENDP6_TXADDR (0xC0)

/* 7 號端點(diǎn),OUT 端點(diǎn),接收緩沖區(qū)如下 */

#define ENDP7_RXADDR (0x100)



【本文摘于ST MCU官網(wǎng),供分享交流】

回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 久色成人| 国产又粗又大又长 | 天天色天天干天天 | 亚洲精品字幕 | 成人精品在线视频 | 中国美女乱淫免费看视频 | 久久久久久久影院 | 国产美女免费 | 91美女视频 | 韩国av一区二区 | 成人免费动漫 | 久久久久精 | 国产青青草 | 黄色一级片网站 | 日本国产视频 | 欧美成人精品欧美一级私黄 | 久久精品小视频 | 久久综合伊人 | 国产真实乱人偷精品 | 国产激情小视频 | 免费黄色av | 国产成人免费在线视频 | 中文字幕一区二区三区四区 | 国产精品二区一区二区aⅴ污介绍 | 欧美一区免费 | 精品欧美黑人一区二区三区 | 成av人片一区二区三区久久 | 日本久久精品视频 | 欧美成人精品一区 | 日本在线免费观看 | 色婷婷基地 | 91欧美大片 | 国产做受入口竹菊 | 黄色福利视频 | 欧美久久久久久久 | 99福利视频 | 日韩成人中文字幕 | 又黄又爽又刺激的视频 | 国产一区二区网站 | 国产成人精品一区二区三区视频 | 最新国产精品视频 |