8420|18

65

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

关于STM32F102/103的USB模块和USB库函数 [复制链接]

今天有空,开贴讲讲,怎样配合ST提供的库函数理解STM32F102/103的USB模块,以及怎么调用这些库函数来实现基本的USB通信。

题目很大,先只讲讲最简单的应用。
此帖出自stm32/stm8论坛

最新回复

同问,这个是怎么看出来的?  详情 回复 发表于 2012-11-15 09:10

赞赏

1

查看全部赞赏

点赞 关注
 

回复
举报

94

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
1 关于512字节的Packet Buffer

STM32F103USB模块中有一个RAM区,称为Packet Buffer,共有512字节。
1.JPG
此帖出自stm32/stm8论坛
 
 

回复

76

帖子

0

TA的资源

一粒金砂(初级)

板凳
 


USB模块中有个Buffer Description Table,这个Table位于512字节的Packet Buffer中,可以在Packet Buffer的任意位置。


USB模块提供一个寄存器USB_BTABLE来设置Buffer Description TablePacket Buffer的偏移地址。

在库函数中,Define了这个偏移地址:
usb_conf.h
#define BTABLE_ADDRESS  (0x00)

这意味着Buffer Description Table位于Packet Buffer的首地址。


2.JPG



此帖出自stm32/stm8论坛
 
 

回复

78

帖子

0

TA的资源

一粒金砂(初级)

4
 
在Buffer Description Table中的,是所用到的端点的缓存区地址寄存器和缓存区长度寄存器。所有用到的端点的这两个寄存器都位于这个Table中。

如上所说,由于这个Table位于Packet Buffer的首地址。所以端点0的发送缓冲区地址寄存器就位于Packet Buffer的首地址,紧接的是端点0发送缓冲区长度寄存器,接着的是端点0接收缓存区的地址寄存器,跟着是端点0的接收缓存区的长度寄存器,等等等等,一直到最后一个端点8的接收缓存区的长度寄存器。

每个端点的一个方向有2个寄存器,共8个端点16个方向,一共32个寄存器,每个寄存器为4个字节,所以这个Table一共占有128字节。

3.JPG
此帖出自stm32/stm8论坛
 
 
 

回复

56

帖子

0

TA的资源

一粒金砂(初级)

5
 


在端点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字节。

4.JPG






此帖出自stm32/stm8论坛
 
 
 

回复

72

帖子

0

TA的资源

一粒金砂(初级)

6
 
好了,关于这个Packet Buffer讲解完毕。

要做一个USB应用,第一步就是要根据应用合理的分配好这个Packet Buffer。


出个题目给大家做做

假设,需要使用端点0的IN,OUT传输,端点长度为8字节,端点1的IN传输,长度为16字节。端点2的OUT传输,长度为64字节。端点2的IN传输,长度为64字节。

该怎么分配这个Packet Buffer?
此帖出自stm32/stm8论坛
 
 
 

回复

70

帖子

0

TA的资源

一粒金砂(初级)

7
 
2 使用STM32F102/103 USB函数库 进行USB通信

第一步:
根据应用的需求,定义使用到的端点数量


usb_conf.h

#define EP_NUM (3)

以上意味着应用需要使用到EP0,EP1和EP2
此帖出自stm32/stm8论坛
 
 
 

回复

66

帖子

0

TA的资源

一粒金砂(初级)

8
 
第二步:
初始化每个使用到的端点

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通信。
此帖出自stm32/stm8论坛
 
 
 

回复

72

帖子

0

TA的资源

一粒金砂(初级)

9
 
第三步:
使能端点的通信

对于IN端点的使能:
UserToPMABufferCopy(Send_Buffer, ENDP2_TXADDR, 8);
拷贝用户数据到端点2的发送缓存区

SetEPTxCount(ENDP2, 8);
设置端点2发送数据长度

SetEPTxValid(ENDP2);
设置端点2的发送状态为VALID


以上三句可以在应用代码的任意位置调用,一旦调用,即使能了一次USB IN通信。

USB设备将在收到主机的IN TOKEN后,自动发送缓存区中的数据到主机,并在发送完毕后产生EP2_IN_Callback中断,同时将端点2的发送状态自动改为NAK。

如果需要再次进行数据传送,需要再次调用以上的三句函数。
此帖出自stm32/stm8论坛
 
 
 

回复

228

帖子

0

TA的资源

一粒金砂(中级)

10
 
对于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接收缓存区中收到的数据拷贝到用户数据区
此帖出自stm32/stm8论坛
 
 
 

回复

75

帖子

0

TA的资源

一粒金砂(初级)

11
 
                                 楼主堪称大师级人物啊!
此帖出自stm32/stm8论坛
 
 
 

回复

65

帖子

0

TA的资源

一粒金砂(初级)

12
 
                                 绝对精辟,容易理解! 楼主高人
此帖出自stm32/stm8论坛
 
 
 

回复

51

帖子

0

TA的资源

一粒金砂(初级)

13
 
#define ENDP0_RXADDR  (0x18)
#define ENDP0_TXADDR  (0x58)

是够可以这样理解: ENDP0_RXADDR 本身的地址 由 USB_BTABLE 的偏移量决定 ;这个地址上存放的数据0x18 ,也就是端点0 用来接收数据的缓冲区的地址,即:从0x18这个地址开始的一段地址空间上,存放的是端点 0 接收到的数据 ;
此帖出自stm32/stm8论坛
 
 
 

回复

80

帖子

0

TA的资源

一粒金砂(初级)

14
 
                                 顶LZ,希望LZ继续出教程
此帖出自stm32/stm8论坛
 
 
 

回复

71

帖子

0

TA的资源

一粒金砂(初级)

15
 
                                 mark
此帖出自stm32/stm8论坛
 
 
 

回复

73

帖子

0

TA的资源

一粒金砂(初级)

16
 
                                 图文并茂,讲的很形象
此帖出自stm32/stm8论坛
 
 
 

回复

83

帖子

0

TA的资源

一粒金砂(初级)

17
 
请问下,5楼里
3, Buffer Description Table 位于Packet Buffer的前24字节。24个字节意味着应用需要使用6个寄存器,即3个端点。
这个是怎么看出来的?
此帖出自stm32/stm8论坛

点评

同问,这个是怎么看出来的?  详情 回复 发表于 2012-11-15 09:10
 
 
 

回复

74

帖子

0

TA的资源

一粒金砂(初级)

18
 
                                 楼主应该去当老师
此帖出自stm32/stm8论坛
 
 
 

回复

3

帖子

0

TA的资源

一粒金砂(初级)

19
 

回复 17楼 自下而上 的帖子

同问,这个是怎么看出来的?
此帖出自stm32/stm8论坛
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/7 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表