【LPC55 系列】LPC55S69 开发之 USB Keyboard 介绍说明

关键字 :NXPLPC55S69

一、了解学习 USB 基本知识

          1、USB 是什么冬瓜?

               USB 就是 Universal Serial Bus 的缩写,中文翻译是通用串行总线,它的出现就是为了通用规范大多数数据的接口,例如 PC 上的鼠标、键盘、U 盘接口等等。USB 发展历经几代,从 USB 1.0 到现在 USB 3.2 ,有兴趣了解的可以上网查找资料,这里不做具体描述,
               这里刚开始使用的是 USB 1.1 和 USB 2.0 。

               这里不做细节的讲述,主要是从大的方面来了解 USB 的使用

         2、PC 端怎么识别 USB

               HOST 通过枚举从设备读取一些信息,根据这些信息,HOST 会加载合适的驱动程序。从而调试 USB 设备,只要枚举成功了,那么数据通信就已经成功大半了

         2.1 USB枚举通信具体过程

  • 上电状态:主机通过 Hub 电平差检测到设备,等待100ms让设备电平趋于稳定
  • 首次复位:Hub 发起复位,设备地址变为 0(复位前,Hub 检测设备高低速、Status 反馈给主机)
  • 首次查询设备描述符:通过初始地址 0,主机查询设备描述符,主要是前 8 字节的信息
  • 二次复位:在接收到设备描述符前8个字节后,再次通过初始地址 0 重启设备
  • 设置地址:主机向设备请求设置地址,设备获取新地址
  • 二次查询设备描述符:通过新地址,主机获取整个18字节的设备描述符
  • 获取配置描述符:一次获取配置描述符、接口描述符、端点描述符、字符串描述符、HID 描述符等
  • 设置配置:使设备从地址状态进入配置状态
  • 主机与设备枚举成功

         2.2 描述符 – 描述设备的身份信息

               在 USB 主机访问 USB 设备的描述符时,USB 设备依照设备描述符、配置描述符、接口描述符、端点描述符、字符串描述符顺序将所有描述符传给主机。一设备至少要包含设备描述符、配置描述符和接口描述符,如果 USB 设备没有端点描述符,则它仅仅用默认管道与主机进行数据传输

 

           ① 设备描述符:一个 USB 设备只能有一个设备描述符,之后的描述符都允许有多个不同的描述符。设备描述符给出了 USB设备的一般信息,包括对设备及在设备配置中起全程作用的信息,包括制造商标识号ID、产品序列号、所属设备类号、默认端点的最大包长度和配置描述符的个数等

           ② 配置描述符:配置描述符描述关于特定设备的配置信息。当主机请求配置描述符,它下面所有相关的接口和端点描述符也一起返回,配置描述符可以有多个,包含于设备描述符中

           ③ 接口描述符:接口描述符描述一个配置下的特定接口,也可以认为接口是“功能”,当一个配置支持多个接口,那一个接口下的所有端点描述符经常是作为一个配置描述符下的一部分返回

           ④ 端点描述符:端点是设备与主机之间进行数据传输的逻辑接口,除配置使用的端点0(控制端点,一般一个设备只有一个控制端点)为双向端口外,其它均为单向。端点描述符描述了数据的传输类型、传输方向、数据包大小和端点号(也可称为端点地址)等

 

 

       2.3 USB 怎么通信呢?

            在这里先看一个完整的通信例子,获取设备描述符。(以下介绍只在数据包传输以上)

  • USB 通信概念(结合上图分析,详见 USB 2.0 协议)
  • USB 通信中,有传输、事务、包三层构成,包是 USB 通信中最基础的单位
  • 一次传输由一次到多次的事务传输,一次事务传输由若干个包组成
  • USB 协议中,数据报文就是填写在数据包 DATA 中基于底层协议进行传输

       ② 传输:控制(control)、中断(interrupt)、批量(bulk),同步(Isochronous)

 


       ③ 事务:USB 设备驱动向 USB 控制器驱动请求的每一次传输称为一个事务

  • 类别:设置事务、输入事务、输出事务
  • 不能中断:USB的每次事务是“堵塞”,其中几个包必须连续,不能跨帧
  • 状态判断:每次传输都是成功的回复了 ACK
  • 流程控制: 下发/接收数据、控制进出方向、确认回复

       ④ 包:令牌(Token)包、数据(data)包、握手(handshake)包

  • 令牌:IN、OUT、SETUP、SOF,PRE(前导包),每次事务传输用于确认本次事务的方向、目的等,
  • 数据:DATA0、DATA1、DATA2、MDATA,进行带数据传输(可选)
  • 握手:ACK、NAK、STALL、NYSET,请求方作为应答、状态回复

       2.4 USB 通信编码格式

         NRZI 编码格式

 

二、LPC55S69 USB Keyboard Demo 使用说明

       1、认识 NXP Kinetis USB 栈的框架

 

 

 

       在 LPC55S69 SDK 中有三个例程,这里以其中 BM 版本的例程进行介绍,如上图USB 应用程序中的 Application BM

       利用此类 USB 框架的 MCU 进行开发,需要了解每一部分模块的交互和工作

       ① USB 控制器类型:FS Controller 、HS Controller 、Other Controller

       ② USB 控制器驱动:公共控制器驱动、KHCI Driver 、EHCI Driver 、其他控制器驱动(OSA :选用的例子没有使用移植 freerots)

       ③ 应用驱动:USB CH9 、类驱动

       ④ 应用程序

      

       2、keyboard 工程文件概述

       ① 利用keyboard工程为例,以 BM 版本分析,没有使用和移植 freerots

       ② 主程序文件是 keyboard.c ,其中键值定义和键盘结构体位于 keyboard.h 文件中            ③ 描述符文件usb_device_descriptor.c & usb_device_descriptor.h

       ④ 使用 USB FS Controller , USB 设备是 LPCIP3511

      

       3、USB hid keyboard描述符的结构体概述

         keyboard 的结构体一级一级用指针串起来:设备端点结构体 -> 设备接口结构体 -> 设备接口列表 -> 设备类结构体 -> 设备类配置结构体 -> 设备类配置列表(如下图)

  • usb_device_endpoint_struct_t;
  • usb_device_endpoint_list_t;
  • usb_device_interface_struct_t;
  • usb_device_interfaces_struct_t;
  • usb_device_interface_list_t;
  • usb_device_class_struct_t;
  • usb_device_class_config_struct_t;
  • usb_device_class_config_list_struct_t;

 

 

       4、设备栈的初始化流程如下图所示

 

 

 

       ① 初始化 USB 引脚 V_BUS & USB 时钟 & 清除 USB RAM,选择 USB 控制器类型和驱动类型等

       ② 调用 USB_DeviceClassInit API 初始化每一个设备栈

       ③ 获取每一个类的句柄通过 usb_device_class_config_struct_t::classHandle

       ④ 建立 USB ISR

       ⑤ 使能 USB 中断和中断优先级

       ⑥ 调用 USB_DeviceRun API 开始 USB 设备的运行

       5、USB 设备回调函数工作流程如下图所示

      

 

       当 USB 设备插上主机时,主机会检测 USB 设备并复位,USB 设备进入中断函数示例代码中,USB 的中断函数具体流程如下:

 

 

 

        6.  下面的截图就是 SDK  USB  例程的截图

 

 

  7.  以上供大家参考,谢谢!

 

★博文内容均由个人提供,与平台无关,如有违法或侵权,请与网站管理员联系。

★文明上网,请理性发言。内容一周内被举报5次,发文人进小黑屋喔~

评论