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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 6344|回復: 4
打印 上一主題 下一主題
收起左側

STM32 USB模塊講解

[復制鏈接]
跳轉到指定樓層
樓主
ID:136005 發表于 2019-2-23 10:37 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
天有空,開貼講講,怎樣配合 ST提供的庫函數理解 STM32F102/103的USB模塊,以及怎么調用這些庫函數來實現基本的USB通信。
題目很大,先只講講最簡單的應用。

1
關于512字節的Packet Buffer
在STM32F103的USB模塊中有一個RAM區,稱為PacketBuffer,共有512字節。
SB模塊中有個BufferDescriptionTable,這個Table位于512字節的PacketBuffer中,可以在PacketBuffer的任意位置。
USB模塊提供一個寄存器USB_BTABLE來設置BufferDescriptionTable在Packet

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


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

評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

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

使用道具 舉報

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

使用道具 舉報

板凳
ID:49877 發表于 2019-2-23 16:03 | 只看該作者
學習、收藏了
回復

使用道具 舉報

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

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

使用道具 舉報

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

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: www国产亚洲精品久久网站 | 蜜桃视频一区二区 | 中文字幕在线免费播放 | 亚洲天堂免费 | 青青草视频污 | 欧美一级免费看 | 日本色综合 | 国产精品久久视频 | 欧美日韩中文字幕在线 | 日日夜夜干 | 成人扒开伸进免费观看 | 日本国产在线观看 | 国产精品天美传媒入口 | 91麻豆精品视频 | 伊人成人在线 | 日韩成人精品视频 | 欧美日韩国 | 黄色片小视频 | 婷婷激情六月 | 久久精品一区二区三区四区 | 免费在线观看毛片 | 国产在线一区二区 | 三级在线观看视频 | 91亚色视频 | 日韩福利在线 | 香蕉视频在线观看网站 | 日韩中文字幕视频 | 91成人精品一区在线播放 | 中文字幕免费视频 | 欧美日韩亚洲一区二区 | 日韩欧美一区二区在线观看 | 97在线视频免费观看 | 亚洲国产精品久久久久久久 | 中文字幕丰满人伦在线 | 狠狠干天天干 | 九九久久精品视频 | 国产视频成人 | 天天躁日日躁狠狠躁 | 国产一级网站 | 日韩精品不卡 | 日本不卡在线 |