久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费
標題:
關于STM32F102/103的USB模塊和USB庫函數
[打印本頁]
作者:
dqkld
時間:
2018-11-14 08:39
標題:
關于STM32F102/103的USB模塊和USB庫函數
STM32 USB模塊詳解,供大家學習。
今天
有空,開貼講講,怎樣配合 ST 提供的庫函數理解 STM32F102/103 的
U
S
B
模塊,以及 怎么調用這些庫函數來實現基本的
U
S
B
通信。
題目很大,先只講講最簡單的應用。
1
關于
51
2
字節的
P
a
c
k
e
t
B
u
f
f
e
r
在 STM32F103 的
U
S
B
模塊中有一個 RAM 區,稱為 Packet Buffer,共有 512 字節。
U
S
B
模塊中有個 Buffer Description Table,這個 Table 位于 512 字節的 Packet Buffer
中,可以在 Packet Buffer 的任意位置。
U
S
B
模塊提供一個寄存器
U
S
B
_BTABLE 來設置 Buffer Description Table 在 Packet
B
uffer 的偏移地址。
在庫函數中,Define 了這個偏移地址:
usb_conf.h:
#define BTABLE_ADDRESS (0x00)
這意味著 Buffer Description Table 位于 Packet Buffer 的首地址。
在 Buffer Description Table 中的,是所用到的端點的緩存區地址寄存器和緩存區長度寄存器 。 所有用到的端點的這兩個寄存器都位于這個 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 字節。
好了,
關于這個 Packet Buffer 講解完畢。
要做一個
U
S
B
應用,第一步就是要根據應用合理的分配好這個 Packet Buffer。 出個題目給大家做做
假設,需要使用端點 0 的 IN,OUT 傳輸,端點長度為 8 字節,端點 1 的 IN 傳輸,長度為 16
字節。端點 2 的 OUT 傳輸,長度為 64 字節。端點 2 的 IN 傳輸,長度為 64 字節。
該怎么分配這個 Packet Buffer?
2
使用
S
TM
3
2
F
1
0
2
/
10
3
U
S
B
函數庫
進行
U
S
B
通信
第一步: 根據應用的需求,定義使用到的端點數量
usb_conf.h
#define EP_NUM (3)
以上意
味著應用需要使用到 EP0,EP1 和 EP2
第二步: 初始化每個使用到的端點
usb_prop.c
SetEPType(ENDP2, EP_INTERRUPT);
定義端點 2 為中斷端點
SetEPTxAddr(ENDP2, ENDP2_TXADDR);
如果需要進行 EP2 IN 通信,需要定義端點 2 的發送緩存區的地址,也就是在 Packet Buffer
中的偏移地址
SetEPRxAddr(ENDP2, ENDP2_RXADDR);
如果需要進行 EP2 OUT 通信,需要定義端點 2 的接收緩存區在 Packet Buffer 中的偏移地址
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
以上三句可以在應用代碼的任意位置調用,一旦調用,即使能了
一次
U
S
B
IN 通信。
U
S
B
設備將在收到主機的 IN TOKEN 后,自動發送緩存區中的數據到主機,并在發送完畢 后產生 EP2_IN_Callback 中斷,同時將端點 2 的發送狀態自動改為NAK。
如果需要再次進行數據傳送,需要再次調用以上的三句函數。 對于 OUT 端點的使能:
S
etEPRxValid(ENDP2);
設置端點 2 的接收狀態為 VALID。
以上的這句函數即使能了端點 2 的 OUT 通信,可以在任意位置調用。 一旦調用,即使能了
一次
OUT 通信。
U
S
B
設備將以 ACK 來響應主機隨后的 OUT 通信,并
在接收數據完畢后,產生 EP2_OUT_Callback 中斷,同時自動將端點的接收狀態改為 NAK。
在 EP2_OUT_Callback 中斷函數中調用
U
S
B
_SIL_Read(EP2_OUT, Receive_Buffer);
可以將端點 2 接收緩存區中收到的數據拷貝到用戶數據區。
完整的pdf格式文檔51黑下載地址:
STM32_USB模塊講解.pdf
(345.42 KB, 下載次數: 91)
2018-11-14 08:38 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
歡迎光臨 (http://m.zg4o1577.cn/bbs/)
Powered by Discuz! X3.1
主站蜘蛛池模板:
亚洲视频精品
|
四虎影院网站
|
亚洲精品免费观看
|
av在线中文
|
亚洲天堂网址
|
日韩福利视频
|
国产寡妇亲子伦一区二区三区四区
|
亚洲无人区一线二线三线
|
欧美日韩在线免费观看
|
九九国产精品视频
|
a级片毛片
|
亚洲欧美日韩成人
|
亚洲三级视频
|
欧美第一页
|
成人激情视频
|
欧美激情一区
|
久久久久久久久国产精品
|
男女插插插视频
|
四虎在线观看
|
在线播放日韩
|
亚洲高清视频在线
|
成人91视频
|
久久久精品在线观看
|
一区二区不卡视频
|
亚洲国产成人精品女人久久久
|
亚洲国产天堂
|
中国一级黄色录像
|
免费国产视频
|
国产3p视频
|
女同一区二区
|
国产精品三级视频
|
欧美综合激情
|
欧美精品久久99
|
96在线视频
|
亚洲在线免费
|
国产视频一区二区在线观看
|
亚洲区视频
|
午夜一区
|
91丨porny丨成人蝌蚪
|
四虎官网
|
日韩欧美高清
|