打印

关于STM32F102/103的USB模块和USB库函数

[复制链接]
45278|163
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
vigia|  楼主 | 2010-11-26 16:12 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
今天有空,开贴讲讲,怎样配合ST提供的库函数理解STM32F102/103的USB模块,以及怎么调用这些库函数来实现基本的USB通信。

题目很大,先只讲讲最简单的应用。
沙发
vigia|  楼主 | 2010-11-26 16:15 | 只看该作者
1 关于512字节的Packet Buffer

STM32F103USB模块中有一个RAM区,称为Packet Buffer,共有512字节。

使用特权

评论回复
板凳
vigia|  楼主 | 2010-11-26 16:18 | 只看该作者
本帖最后由 vigia 于 2010-11-29 10:13 编辑

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的首地址。






使用特权

评论回复
地板
vigia|  楼主 | 2010-11-26 16:24 | 只看该作者
在Buffer Description Table中的,是所用到的端点的缓存区地址寄存器和缓存区长度寄存器。所有用到的端点的这两个寄存器都位于这个Table中。

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

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

使用特权

评论回复
5
vigia|  楼主 | 2010-11-26 16:32 | 只看该作者
本帖最后由 vigia 于 2010-11-26 16:34 编辑

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








使用特权

评论回复
6
vigia|  楼主 | 2010-11-26 16:37 | 只看该作者
好了,关于这个Packet Buffer讲解完毕。

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


出个题目给大家做做

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

该怎么分配这个Packet Buffer?:lol:lol:lol

使用特权

评论回复
7
vigia|  楼主 | 2010-11-29 10:36 | 只看该作者
2 使用STM32F102/103 USB函数库 进行USB通信

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


usb_conf.h

#define EP_NUM (3)

以上意味着应用需要使用到EP0,EP1和EP2

使用特权

评论回复
8
vigia|  楼主 | 2010-11-29 10:41 | 只看该作者
第二步:
初始化每个使用到的端点

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通信。

使用特权

评论回复
9
vigia|  楼主 | 2010-11-29 10:48 | 只看该作者
第三步:
使能端点的通信

对于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。

如果需要再次进行数据传送,需要再次调用以上的三句函数。

使用特权

评论回复
10
vigia|  楼主 | 2010-11-29 10:53 | 只看该作者
对于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接收缓存区中收到的数据拷贝到用户数据区

使用特权

评论回复
11
simple_head| | 2010-11-29 20:07 | 只看该作者
楼主堪称大师级人物啊!

使用特权

评论回复
12
yinguangwei| | 2010-12-3 10:41 | 只看该作者
绝对精辟,容易理解! 楼主高人

使用特权

评论回复
13
yinguangwei| | 2010-12-3 11:28 | 只看该作者
#define ENDP0_RXADDR  (0x18)
#define ENDP0_TXADDR  (0x58)

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

使用特权

评论回复
14
rex994997787| | 2010-12-4 21:00 | 只看该作者
顶LZ,希望LZ继续出教程

使用特权

评论回复
15
say_sth_freely| | 2010-12-5 11:15 | 只看该作者
mark

使用特权

评论回复
16
火箭球迷| | 2010-12-6 17:15 | 只看该作者
图文并茂,讲的很形象:lol

使用特权

评论回复
17
rex994997787| | 2011-3-10 16:24 | 只看该作者
请问下,5楼里
3, Buffer Description Table 位于Packet Buffer的前24字节。24个字节意味着应用需要使用6个寄存器,即3个端点。
这个是怎么看出来的?

使用特权

评论回复
18
txcy| | 2011-3-10 18:26 | 只看该作者
楼主应该去当老师:lol

使用特权

评论回复
19
tongxingzhengw| | 2011-3-23 09:19 | 只看该作者
看了收获很大,楼主继续啊

使用特权

评论回复
20
eng588| | 2011-3-23 09:26 | 只看该作者
mark

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

19

主题

652

帖子

7

粉丝