USB是英文Universal Serial BUS(通用串行总线)的缩写,而其中文简称为“通用串行总线“,是一个外部总线标准,用于规范电脑与外部设备的连接和通讯。是应用在PC领域的接口技术。USB发展到现在已经有USB1.0/1.1/2.0/3.0等多个版本。目前用的最多的就是USB1.1和USB2.0,USB3.0目前已经开始普及。
CKS32F4xx系列自带的USB符合USB2.0规范。标准USB共四根线组成,除VCC/GND外,另外为D+和D-,这两根数据线采用的是差分电压的方式进行数据传输的。在USB主机上,D-和D+都是接了15K的电阻到地的,所以在没有设备接入的时候,D+、D-均是低电平。而在USB设备中,如果是高速设备,则会在D+上接一个1.5K的电阻到VCC,而如果是低速设备,则会在D-上接一个1.5K的电阻到VCC。这样当设备接入主机的时候,主机就可以判断是否有设备接入,并能判断设备是高速设备还是低速设备。 CKS32F4xx系列芯片自带有USB OTG FS(全速)和USB OTG HS(高速),其中HS需要外扩高速PHY芯片实现,我们本章节对USB OTG FS进行介绍。
USB OTG FS主要特性
CKS32F4xx系列的USB OTG FS是一款双角色设备(DRD)控制器,同时支持从机功能和主机功能,完全符合USB2.0规范的On-The-Go补充标准。此外,该控制器也可配置为“仅主机”模式或“仅从机”模式,完全符合USB2.0规范。在主机模式下,OTGFS支持全速(FS,12Mb/s)和低速(LS,1.5Mb/s)收发器,而从机模式下则仅支持全速(FS,12Mb/s)收发器。OTG FS同时支持HNP和SRP。CKS32F4xx系列的USB OTG FS主要特性可分为三类:通用特性、主机模式特性和从机模式特性。
- 通用特性 -
1、经USB-IF认证,符合通用串行总线规范第2.0版
2、集成全速PHY,且完全支持定义在标准规范OTG补充第1.3版中的OTG协议:
支持A-B器件识别(ID线)
支持主机协商协议(HNP)和会话请求协议(SRP)
允许主机关闭VBUS以在OTG应用中节省电池电量
支持通过内部比较器对VBUS电平采取监控
支持主机到从机的角色动态切换
3、可通过软件配置为以下角色:
具有SRP功能的USB FS从机(B器件)
具有SRP功能的USB FS/LS主机(A器件)
USB On-The-Go全速双角色设备
4、支持FS SOF和LS Keep-alive令牌
SOF脉冲可通过PAD输出
SOF脉冲从内部连接到定时器2(TIM2)
可配置的帧周期
可配置的帧结束中断
5、具有省电功能,例如在USB挂起期间停止系统、关闭数字模块时钟、对PHY和DFIFO电源加以管理
6、具有采用高级FIFO控制的1.25KB专用RAM
可将RAM空间划分为不同FIFO,以便灵活有效地使用RAM
每个FIFO可存储多个数据包
动态分配存储区
FIFO大小可配置为非2的幂次方值,以便连续使用存储单元
7、一帧之内可以无需要应用程序干预,以达到最大USB带宽
- 主机(Host)模式特性 -
1、通过外部电荷泵生成VBUS电压
2、多达8个主机通道(管道):每个通道都可以动态实现重新配置,可支持任何类型的USB传输
3、内置硬件调度器:
在周期性硬件队列中存储多达8个中断加同步传输请求
在非周期性硬件队列中存储多达8个控制加批量传输请求
4、管理一个共享RX FIFO、一个周期性TX FIFO和一个非周期性TX FIFO,以有效使用USB数据RAM
- 从机(Slave/Device)模式特性 -
1、1个双向控制端点0
2、3个IN端点(EP),可配置为支持批量传输、中断传输或同步传输
3、3个OUT端点(EP),可配置为支持批量传输、中断传输或同步传输
4、管理一个共享Rx FIFO和一个Tx-OUT FIFO,以高效使用USB数据RAM
5、管理多达4个专用Tx-IN FIFO(分别用于每个使能的IN EP),降低应用程序负荷支持软断开功能
图1 USB OTG FS框图
对于USB OTG FS功能模块,CKS32F4xx系列通过AHB总线访问(AHB频率必须大于14.2Mhz),其中48Mhz的USB时钟,是来自时钟树图里面的PLL48CK(和SDIO共用)。不过,我们提供了一套完整的 USB OTG驱动库(包括主机和设备),通过这个库可以很方便的实现所要的功能。
软件设计
图2 USB配置代码
配置时,我们重点要配置的就是USB_APP文件夹下面的代码。 usb_bsp.c提供了几个USB库需要用到的底层初始化函数,包括:IO设置、中断设置、VBUS配置以及延时函数等。USB Device(Slave)和USB Host共用这个.c文件。 usbd_usr.c提供用户应用层接口函数,即USB设备类的一些回调函数,当USB状态机处理完不同事务的时候,会调用这些回调函数,我们通过这些回调函数,就可以知道USB当前状态,比如:是否枚举成功、是否连接、是否断开等,根据这些状态,用户应用程序可以执行不同操作,完成特定功能。 要使用USB OTG FS,必须在编译器的全局宏定义里面,定义:USE_USB_OTG_FS 具体的USB库调用函数篇幅较大,不再详细描述,以下为main函数代码:
int main(void) { u32t; NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); delay_init(168); uart_init(115200); LED_GPIO_Init(); USBH_Init(&USB_OTG_Core_dev,USB_OTG_FS_CORE_ID,&USB_Host,&HID_cb,&USR_Callbacks); while(1) { USBH_Process(&USB_OTG_Core_dev, &USB_Host); if(bDeviceState==1)//Á¬½Ó½¨Á¢ÁË { if(USBH_Check_HIDCommDead(&USB_OTG_Core_dev,&HID_Machine)) { USBH_HID_Reconnect(); } }else { if(USBH_Check_EnumeDead(&USB_Host)) { USBH_HID_Reconnect(); } } t++; if(t==200000) { LED1=!LED1; t=0; } } }
全部0条评论
快来发表一下你的评论吧 !