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

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 6201|回復(fù): 4
打印 上一主題 下一主題
收起左側(cè)

STM32 USB模塊講解

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:136005 發(fā)表于 2019-2-23 10:37 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
天有空,開貼講講,怎樣配合 ST提供的庫(kù)函數(shù)理解 STM32F102/103的USB模塊,以及怎么調(diào)用這些庫(kù)函數(shù)來(lái)實(shí)現(xiàn)基本的USB通信。
題目很大,先只講講最簡(jiǎn)單的應(yīng)用。

1
關(guān)于512字節(jié)的Packet Buffer
在STM32F103的USB模塊中有一個(gè)RAM區(qū),稱為PacketBuffer,共有512字節(jié)。
SB模塊中有個(gè)BufferDescriptionTable,這個(gè)Table位于512字節(jié)的PacketBuffer中,可以在PacketBuffer的任意位置。
USB模塊提供一個(gè)寄存器USB_BTABLE來(lái)設(shè)置BufferDescriptionTable在Packet

uffer的偏移地址。
在庫(kù)函數(shù)中, Define了這個(gè)偏移地址:
usb_conf.h:
#defineBTABLE_ADDRESS (0x00)
這意味著 Buffer Description Table位于 Packet Buffer的首地址


Buffer DescriptionTable中的,是所用到的端點(diǎn)的緩存區(qū)地址寄存器和緩存區(qū)長(zhǎng)度寄存器。所有用到的端點(diǎn)的這兩個(gè)寄存器都位于這個(gè)Table中。
如上所說(shuō), 由于這個(gè) Table位于 Packet Buffer的首地址。 所以端點(diǎn) 0的發(fā)送緩沖區(qū)地址寄存器就位于 Packet Buffer的首地址, 緊接的是端點(diǎn)0發(fā)送緩沖區(qū)長(zhǎng)度寄存器, 接著的是端點(diǎn)0接收緩存區(qū)的地址寄存器, 跟著是端點(diǎn)0的接收緩存區(qū)的長(zhǎng)度寄存器, 等等等等, 一直到最后一個(gè)端點(diǎn)8的接收緩存區(qū)的長(zhǎng)度寄存器。
每個(gè)端點(diǎn)的一個(gè)方向有 2個(gè)寄存器, 共8個(gè)端點(diǎn) 16個(gè)方向, 一共32個(gè)寄存器, 每個(gè)寄存器為4個(gè)字節(jié),所以這個(gè) Table一共占有128字節(jié)
端點(diǎn) 0發(fā)送緩存區(qū)的地址寄存器中的值,是端點(diǎn) 0發(fā)送緩存區(qū)在 Packet Buffer中的偏移地址。而端點(diǎn) 0接收緩存區(qū)的地址寄存器中的值, 是端點(diǎn) 0接收緩存區(qū)在Packet Buffer中的偏移地址。
如前所說(shuō), Buffer Description Table從理論上占有 128個(gè)字節(jié)。但對(duì)于具體的應(yīng)用,不是每個(gè)應(yīng)用都會(huì)用到 8個(gè)端點(diǎn)的 16個(gè)方向的。所以,對(duì)于那些沒(méi)有用到的端點(diǎn)寄存器,我們可以不考慮為他們預(yù)留位置。
在ST提供的例程中,通常這么定義
define BTABLE_ADDRESS (0x00)
/* EP0 */
/* rx/tx buffer base address */
#define ENDP0_RXADDR (0x18)
#define ENDP0_TXADDR (0x58)
這 3句定義,意味著:
1, 端點(diǎn) 0的接收緩存區(qū)位于 Packet Buffer的 0x18地址。
2, 端點(diǎn) 0的發(fā)送緩存區(qū)位于 Packet Buffer的 0x58地址。
3, Buffer Description Table 位于 Packet Buffer的前 24字節(jié)。 24個(gè)字節(jié)意味著
應(yīng)用需要使用6個(gè)寄存器,即 3個(gè)端點(diǎn)。
4, 端點(diǎn) 0的接收緩存區(qū)長(zhǎng)度為64字節(jié)
了,關(guān)于這個(gè)PacketBuffer講解完畢。
要做一個(gè)USB應(yīng)用,第一步就是要根據(jù)應(yīng)用合理的分配好這個(gè)PacketBuffer。
出個(gè)題目給大家做做
假設(shè), 需要使用端點(diǎn)0的IN,OUT傳輸, 端點(diǎn)長(zhǎng)度為8字節(jié), 端點(diǎn)1的IN傳輸, 長(zhǎng)度為16字節(jié)。端點(diǎn)2的OUT傳輸,長(zhǎng)度為64字節(jié)。端點(diǎn)2的IN傳輸,長(zhǎng)度為64字節(jié)。
該怎么分配這個(gè)PacketBuffer?
2 使用STM32F102/103USB函數(shù)庫(kù) 進(jìn)行USB通信
第一步:
根據(jù)應(yīng)用的需求,定義使用到的端點(diǎn)數(shù)量
usb_conf.h
#define EP_NUM(3)
上意味著應(yīng)用需要使用到EP0, EP1和EP2
第二步:
初始化每個(gè)使用到的端點(diǎn)
usb_prop.c
SetEPType(ENDP2,EP_INTERRUPT);
定義端點(diǎn)2為中斷端點(diǎn)
SetEPTxAddr(ENDP2,ENDP2_TXADDR);
如果需要進(jìn)行EP2IN通信,需要定義端點(diǎn) 2的發(fā)送緩存區(qū)的地址,也就是在PacketBuffer
中的偏移地址
SetEPRxAddr(ENDP2,ENDP2_RXADDR);
如果需要進(jìn)行EP2OUT通信,需要定義端點(diǎn)2的接收緩存區(qū)在PacketBuffer中的偏移地址
SetEPRxStatus(ENDP2,EP_RX_NAK);
設(shè)置端點(diǎn)2的接收狀態(tài)為NAK,設(shè)備將以NAK來(lái)響應(yīng)主機(jī)發(fā)起的所有OUT通信。
SetEPTxStatus(ENDP2,EP_TX_NAK);
設(shè)置端點(diǎn)2的發(fā)送狀態(tài)為NAK,設(shè)備將以NAK來(lái)響應(yīng)主機(jī)發(fā)起的所有IN通信。
第三步:
使能端點(diǎn)的通信
對(duì)于IN端點(diǎn)的使能:
UserToPMABufferCopy(Send_Buffer,ENDP2_TXADDR,8);
拷貝用戶數(shù)據(jù)到端點(diǎn)2的發(fā)送緩存區(qū)
SetEPTxCount(ENDP2,8);
設(shè)置端點(diǎn)2發(fā)送數(shù)據(jù)長(zhǎng)度
SetEPTxValid(ENDP2);
設(shè)置端點(diǎn)2的發(fā)送狀態(tài)為VALID
以上三句可以在應(yīng)用代碼的任意位置調(diào)用,一旦調(diào)用,即使能了一次USBIN通信。
USB設(shè)備將在收到主機(jī)的 INTOKEN后,自動(dòng)發(fā)送緩存區(qū)中的數(shù)據(jù)到主機(jī),并在發(fā)送完畢
后產(chǎn)生EP2_IN_Callback中斷,同時(shí)將端點(diǎn)2的發(fā)送狀態(tài)自動(dòng)改為NAK。
如果需要再次進(jìn)行數(shù)據(jù)傳送,需要再次調(diào)用以上的三句函數(shù)。
對(duì)于OUT端點(diǎn)的使能:
SetEPRxValid(ENDP2);
設(shè)置端點(diǎn)2的接收狀態(tài)為VALID。
以上的這句函數(shù)即使能了端點(diǎn)2的OUT通信,可以在任意位置調(diào)用。
一旦調(diào)用,即使能了一次OUT通信。 USB設(shè)備將以 ACK來(lái)響應(yīng)主機(jī)隨后的OUT通信,并
在接收數(shù)據(jù)完畢后, 產(chǎn)生EP2_OUT_Callback中斷, 同時(shí)自動(dòng)將端點(diǎn)的接收狀態(tài)改為NAK。
在EP2_OUT_Callback中斷函數(shù)中調(diào)用
USB_SIL_Read(EP2_OUT,Receive_Buffer);
可以將端點(diǎn)2接收緩存區(qū)中收到的數(shù)據(jù)拷貝到用戶數(shù)據(jù)區(qū)

評(píng)分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏3 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:479654 發(fā)表于 2019-2-23 15:04 | 只看該作者
和U盤通訊是一樣的嗎
回復(fù)

使用道具 舉報(bào)

板凳
ID:49877 發(fā)表于 2019-2-23 16:03 | 只看該作者
學(xué)習(xí)、收藏了
回復(fù)

使用道具 舉報(bào)

地板
ID:136005 發(fā)表于 2020-10-27 11:31 | 只看該作者
白菜19 發(fā)表于 2019-2-23 15:04
和U盤通訊是一樣的嗎

U盤的通訊 是USB四大通信中的一種應(yīng)用 屬于MSD 大容量存儲(chǔ),通訊的模式屬于批量 傳輸,官方有開源的代碼,移植很方便
回復(fù)

使用道具 舉報(bào)

5#
ID:169559 發(fā)表于 2020-10-30 17:32 | 只看該作者
樓主能講講  USB_CDC_host  嗎?
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 欧美激情在线播放 | av在线成人 | 国产一级一级毛片 | 国产69精品久久99不卡免费版 | 99视频免费在线观看 | 亚洲国产高清高潮精品美女 | 欧美国产日韩在线观看 | 日韩有码一区 | 日本精品久久久久 | 欧美黄色片| 狠狠色狠狠色综合系列 | 又黄又爽的网站 | 欧美激情综合网 | 一区二区视频在线 | 精品久久国产 | 亚洲一二三区在线观看 | 久久久久国产 | 久久久欧洲| 羞羞视频在线网站观看 | 久久久成人动漫 | 国产中文一区二区三区 | 国产重口老太伦 | 国产美女视频黄a视频免费 国产精品福利视频 | 欧产日产国产精品视频 | 亚洲欧美日韩一区二区 | 91激情电影| 99这里只有精品 | 看特级黄色片 | 中文字幕在线网 | 干干干日日日 | 精品国产乱码久久久久久丨区2区 | 99精品99| 在线观看成人小视频 | 日韩成人精品一区二区三区 | 国产成人99久久亚洲综合精品 | 午夜精品影院 | 国产第一区二区 | 操亚洲 | 91文字幕巨乱亚洲香蕉 | aaaa一级毛片 | 一级片在线播放 |