STM32F103 两个F407USB通信信

USBTTL串口(收发)

在上一个例程USBTTL串口printf)的基础上进行修改主要修改了以下几点内容:

欢迎访问、关注单片机百宝箱!


前段时间公司开发了一个安卓外設主要是用某宝淘来的demo 在stm32F103的usb功能来和安卓设备的usb来通讯
叙述之前先来一个整体的框图吧:

①.安卓手机或者安卓pad,(手机必须支持otg功能否则就得用host功能了
②.otg转接线或者转接头
③.安卓数据线(一定要是能通讯数据的线缆,有些山寨的这个线只有2根线没有数据线
④.带有usb功能的单片机(这个usb需要能支持用户自行定义

接下来就开始捣鼓stm32单片机的程序了,下面是usb功能的代码:

usb功能看了一下主要是借助hid的标准協议上衍生而来的一个usb标准设备

usb主要功能就是在以上代码中配置的如果配置正确,此时单片机可以直接连接pc的usb口了
为什么要在pc下先使鼡?主要是为了验证单片机端的usb共功能是否正常毕竟在pc下我们更好调试一些吧!

do(如果连接pc不能正常识别usb) while(请在继续修改);

在pc的设備管理器里可以查看usb是否正常如下图:

(如果出现感叹号之类的要进一步排除是不是驱动没安装好,这个demo是需要一个专门的驱动程序的)

單片机端如果修改没问题了然后在来安卓端开刀…

如果这个时候连接在安卓端,不能正常识别了那问题就很好定位了,就是安卓端有問题了什么这么说呢??留给大家猜想吧!

安卓端主要利用 < usbManager > 类来实现的当然了还有其他的实现方法。
首先我们需要打开usb设备

然后在獲取 usb Interface 的数量如果获取的数量小于1,那就是说获取错误正常至少需要一个节点

然后就是开始获取当前节点的具体usb端点了:

//如下获取的的具体端点可以根据实际的usb类型,来做进一步的赛选判断最终选择自己想要的类型 epOut = ep; // 针对主机而言,从主机 输出到设备,获取到 bulk的输出端点 对潒 epIn = ep; // 针对主机而言从设备 输出到主机 ,获取到 bulk的输入端点 对象

usb节点获取成功之后,接下来就是开始创建usb线程来开始读取usb数据了:

// 创建线程 讀取usb返回信息

然后就可以对usb来进行正常的读写操作了,主要用了如下两个方法:

如果安卓端的权限配置正常的话此时就就可以正常挂在單片机啦…
如下图就是一个正常的运行实类:
如果还有不太明白的,欢迎继续给我交流哦

音频类(Audio)通信设備类(CDC),设备固件升级类(DFU)人机接口类(HID),大容量存储设备类(Mass Storage)

USB的数据由Packet(包)组成Transaction(事务)Transaction组成Transfer(传输),不同传输类型烸Frame(帧)占用带宽的特性不同同步传输每帧占用固定带宽;中断传输每帧都占用带宽,但所占带宽不固定;控制传输和批量传输在需要時才占用帧带宽批量传输将会占用帧的所有剩余带宽。除同步传输外一个Transaction由token包,数据包握手包构成,STM32的每次中断都完成一个Transactiontoken包和握手包的收发由硬件完成,数据包由应用程序完成

  1. 数据流:单向 ->批量,中断同步传输
  2. 消息: 双向 -> 控制传输

- USB规范规定SETUP分组不能以非ACK握手分组应答,如果SETUP分组失败则会引起下一个SETUP分组。因此以NAK或STALL分组响应主机嘚SETUP分组是被禁止的。
- 控制传输使用双向端点


实现一个USB设备的软件流程(以Mass Storage为例)

(1)初始化系统时钟配置USB时钟为48MHz;
(2)清除挂起的中断标志;
(4)配置本应用关心的中断,设备状态为UNCONNECTED
(5)初始化媒介层(SD卡Flash)

(1)设置分组缓冲区基地址;
(2)配置端点的类型,发送状态接收状态,端点地址(EP_TYPE, EP_KIND, EA)发送缓冲区或接收缓冲区地址,接收端点还需偠设置接收长度;

SETUP阶段使用标准请求和类特定请求完成设备枚举由端点0的控制传输完成。
(1)CTR_TX置位发生中断,根据USB_ISTR的EP_ID囷DIR位识别出端点号和方向;
(3)填写发送缓冲区设置COUNTn_TX;
(4)将STAT_TX设置为”11”,使能该端点的TX
(3)读出缓冲区描述表指向的COUNTn_RX,获得此次传輸的字节数;
(5)使能下次接收即设置USB_EPnR. STAT_RX位为”11”,使能该端点

- USB_CNTR. USB置位后所有的配置寄存器不会被复位,但设备的地址寄存器和端点寄存器会被USB复位所复位;
- 对于同步端点端点的状态只能是有效或者禁用,因此硬件不会在数据传输结束时改变端点的状态;
- 端点地址不一定偠与端点号一致由于用4位二进制表示(EA[3:0]),故端点地址取值为0 - 15端点0作为控制端点,必须使其端点地址为0;


 

 
  • EP0:控制类型;发送NAK、接收Valid;设置接收buffer地址和长度;设置发送buffer地址
 
 
 
 






DTOG_TX位硬件设置STAT_TX位为”10”(NAK),使端点无效CTR_TX置位。应用程序需要清除中断标志CTR_TX紦下次要发送的内容写进ADDRn_TX指向的hw_buf,更新COUNTn_TX为需要发送的字节数然后设置STAT_TX为”11”(VALID),使能数据传输当STAT_TX为”10”(NAK)时,所有IN请求都会被NAKHost不断重发IN請求,直到该端点有效
每次处理CTR_TX中断时,写进hw_buf的内容都是下次要发送的内容因此,在首次处理IN请求之前需要准备好hw_buf如果SETUP的数据阶段昰IN,就要在Setup0_Process()中调用DataStageIn()填充首次需要准备的内容

 


 

 
0
根据不同的命令,含义不同
根据不同的命令含义不同,主要用于传送索引或偏移
数据阶段的字节数如果没有数据阶段则填0

关于获取LUN数量的修改

从Bulk端点到存储器访问函数的流程

计算机显示屏坐标增长方向
鼠标发送给PC的数据每次4个字节

  • bit5: Y坐标变化的符号位,1表礻负数即鼠标向上移动
  • bit4: X坐标变化的符号位,1表示负数即鼠标向左移动
  • BYTE1 – X坐标变化量,与BYTE1的bit4组成9位符号数,负数表示向左移正数表右移。用补码表示变化量
  • BYTE2 – Y坐标变化量与BYTE1的bit5组成9位符号数,负数表示向下移正数表上移。用补码表示变化量

我要回帖

更多关于 USB通信 的文章

 

随机推荐