今天有空,开贴讲讲,怎样配合ST 提供的库函数理解STM32F103 的USB模块,以及怎么调用这些库函数来实现基本的USB通信。题目很大,先只讲讲最简单的应用。

1 关于512字节的Packet Buffer

在STM32F103的USB模块中有一个RAM 区,称为Packet Buffer,共有512字节。

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

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

在库函数中,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 讲解完毕。
要做一个USB应用,第一步就是要根据应用合理的分配好这个Packet Buffer。

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

第一步:
根据应用的需求,定义使用到的端点数量
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

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

USB设备将在收到主机的IN TOKEN 后,自动发送缓存区中的数据到主机,并在发送完毕后产生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 接收缓存区中收到的数据拷贝到用户数据区。

详细资料下载见一下链接:

STM32 USB模块讲解,详细讲解USB库通信过程(二)相关推荐

  1. 使用STM32的USB模块中后对USB缓冲区的认识

    最近在使用STM32的USB模块开发个项目,还以为挺简单,结果搞了快两天才把USB的包缓冲区的访问搞定,在此做个小总结吧. STM32的USB模块包缓冲区有512B,但是在STM32的参考手册中的存储 ...

  2. nginx配置文件nginx.conf详细讲解(3)

    上一节我们介绍了nginx.conf的配置文件的3个模块内容,分别是main,events,stream(请自行脑图我画的图–对就是猪脸的那个).本节我们进行http模块的详细讲解.那在讲解之前我们在 ...

  3. STM32 之六 USB IP(USB模块)、官方驱动版本 详解

    模块分类   在 STM32 众多系列的 MCU 中,USB模块并不是相同的,官方称呼为USB IP 不同.总的来说可以分文两大类:USB IP.OTG IP.这两种 IP又可以进行更进一步的细分,如 ...

  4. 基于STM32的CAN转USB模块的PCB设计

    1. 项目的文件结构 设计PCB项目时,文件结构主要分为四个模块 第一个文件夹用来存放设计PCB时用到芯片的数据手册. 第二个文件夹用来存放设计PCB时用到的参考设计,包括所用芯片最小系统电路图,各种 ...

  5. C语言答案解析,C语言题库带详细讲解答案解析.doc

    C语言题库带详细讲解答案解析.doc 下载提示(请认真阅读)1.请仔细阅读文档,确保文档完整性,对于不预览.不比对内容而直接下载带来的问题本站不予受理. 2.下载的文档,不会出现我们的网址水印. 3. ...

  6. STM32 SPI通信协议详细讲解—小白入门

    文章目录 (一)SPI协议简介 (二)SPI物理层 (三)SPI协议层 3.1.SPI基本通信过程 3.2.通信的起始和终止信号 3.3.数据有效性 3.4.CPOL/CPHA及通信模式 (四)STM ...

  7. 高通平台开发系列讲解(USB篇)Linux Android USB软件架构

    文章目录 一.高通平台USB软件架构 二.USB 设备侧软件组成 2.1.OTG driver 2.2.Device controller driver 2.3.Gadget framework 2. ...

  8. stm32f103利用HC06进行蓝牙通信,在7针的OLED屏幕上显示,带数据更新功能(带超详细讲解)

    stm32f103利用HC06进行蓝牙通信,在7针的OLED屏幕上显示,带数据更新功能(带超详细讲解) 首先看看效果吧 手机端发送一个数据在OLED屏幕上显示 其实蓝牙通信就是个蓝牙转串口的过程,手机 ...

  9. 【正点原子STM32连载】 第六十章 USB鼠标键盘(Host)实验 摘自【正点原子】MiniPro STM32H750 开发指南_V1.1

    1)实验平台:正点原子MiniPro H750开发板 2)平台购买地址:https://detail.tmall.com/item.htm?id=677017430560 3)全套实验源码+手册+视频 ...

最新文章

  1. FreeBSD控制台分辨率调整
  2. linux系统UDP的socket通信编程
  3. 字符串逆序(信息学奥赛一本通-T1162)
  4. RFID能否让实体零售业度过“寒冬”?
  5. 为啥计算机课要带u盘,电脑课上,student 关掉以后会不会被老师发现,同时电脑机上,老师不知干了什么,U盘没法使用,求解...
  6. 记Windows下二进制文件查看器
  7. SecureCRT安装及破解
  8. pinyin4j获取汉字正确的全拼和简拼(解决多音字问题)
  9. 结构体别名typedef struct LNode{}LNode,*Linklist疑惑解答
  10. codeforces 831A Unimodal Array
  11. 软件测试方法_边界值分析法
  12. C语言实现输出九九乘法表
  13. 澳国立计算机录取分数,澳洲国立大学最近录取分数线及注意事项
  14. html5游戏编程核心技术与实战目录
  15. 软件工程概论期末复习笔记
  16. Java串口通信读写串口导致程序崩溃问题
  17. 三大运营商5G套餐出炉:有什么区别呢?
  18. HTTP必须知道的几种状态码
  19. mc服务器怎么修改祭坛的概率,邪术祭坛 (Eldritch Altar)
  20. RuntimeError: non-empty 3D or 4D input tensor expected but got ndim: 4

热门文章

  1. Windows10中添加或删除开机自启动项目
  2. Xcode 截取手机屏幕并保存在mac上
  3. redhat利用rpm包安装gcc
  4. 【愚公系列】2021年12月 Python教学课程 01-全方位解读Python
  5. chapter 9 pix2pix模型与自动上色技术
  6. 商店购物 (shopping.c/cpp/pas)
  7. 2000/XP/2003操作系统常见问题集锦
  8. tkinter 实现倒计时(1小时)
  9. Axure教程:转盘抽奖交互原型
  10. Delphi字符串扫盲