Discuz! REAL TIME TECHNOLOGY

 找回密码
 立即注册
查看: 20262|回复: 11
打印 上一主题 下一主题

基于HID的STM32F207的数据通信

[复制链接]

45

主题

0

好友

1639

积分

金牌会员

Rank: 6Rank: 6

跳转到指定楼层
楼主
发表于 2013-6-6 09:57:31 |只看该作者 |倒序浏览
现在根据KEIL带的HID的里例子,可以实现回传功能,且多字节已实现,如图:

下面是固件工程和上位机的工程

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

回复

使用道具 举报

45

主题

0

好友

1639

积分

金牌会员

Rank: 6Rank: 6

沙发
发表于 2013-6-7 19:13:25 |只看该作者
在ST固件中,自带的是joystick的HID例子,即用开发板接控制器控制鼠标,只有发送数据到PC端的过程。
而且在ST自带的HID固件中,需要用到一个重要的报告描述符。下面的pdf的383页处包含对HID的报告描述符详细解释。


在USB中,USBHOST是通过各种描述符来识别设备的,有设备描述符,配置描述符,接口描述符,端点描述符,字符串描述符,报告描述符等等。USB报告描述符(ReportDescriptor)是HID设备中的一个描述符,它是比较复杂的一个描述符。

USBHID设备是通过报告来给传送数据的,报告有输入报告和输出报告。输入报告是USB设备发送给主机的,例如USB鼠标将鼠标移动和鼠标点击等信息返回给电脑,键盘将按键数据数据返回给电脑等;输出报告是主机发送给USB设备的,例如键盘上的数字键盘锁定灯和大写字母锁定灯等。报告是一个数据包,里面包含的是所要传送的数据。输入报告是通过中断输入端点输入的,而输出报告有点区别,当没有中断输出端点时,可以通过控制输出端点0发送,当有中断输出端点时,通过中断输出端点发出。

而报告描述符,是描述一个报告以及报告里面的数据是用来干什么用的。通过它,USBHOST可以分析出报告里面的数据所表示的意思。它通过控制输入端点0返回,主机使用获取报告描述符命令来获取报告描述符,注意这个请求是发送到接口的,而不是到设备。一个报告描述符可以描述多个报告,不同的报告通过报告ID来识别,报告ID在报告最前面,即第一个字节。当报告描述符中
没有规定报告ID时,报告中就没有ID字段,开始就是数据。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

回复

使用道具 举报

45

主题

0

好友

1639

积分

金牌会员

Rank: 6Rank: 6

板凳
发表于 2013-6-13 17:17:14 |只看该作者
理论上,低速的中断端点,每10ms轮询一次,一次最多8字节,每一秒最多800个字节。即800B/s
全速端点,每1ms轮询一次,一次64字节,每一秒最多是64000个字节。即64KB/s
高速端点,每125us轮询一次,一次1024字节,每一秒最多24.576MB(这里不明白,不是应该是7MB吗。 即7MB/s)
http://baike.baidu.cn/view/1636019.htm
回复

使用道具 举报

405

主题

0

好友

6551

积分

内部组员

Rank: 8Rank: 8

活跃会员 论坛元老

地板
发表于 2013-6-14 09:56:46 |只看该作者
ahwwq 发表于 2013-6-13 17:17
理论上,低速的中断端点,每10ms轮询一次,一次最多8字节,每一秒最多800个字节。即800B/s
全速端点,每1ms ...

ok,使用高速模式,看速度能达到多少?
能到2MB/s就可以用在线性ccd上了
回复

使用道具 举报

45

主题

0

好友

1639

积分

金牌会员

Rank: 6Rank: 6

5#
发表于 2013-6-14 17:46:52 |只看该作者
Wjianw 发表于 2013-6-14 09:56
ok,使用高速模式,看速度能达到多少?
能到2MB/s就可以用在线性ccd上了

今天看了下,207板子的datasheet,发现207貌似并不支持HS模式。只是写了支持FS模式和与HS容量一样大的FS模式


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

回复

使用道具 举报

45

主题

0

好友

1639

积分

金牌会员

Rank: 6Rank: 6

6#
发表于 2013-6-14 18:00:21 |只看该作者
ahwwq 发表于 2013-6-14 17:46
今天看了下,207板子的datasheet,发现207貌似并不支持HS模式。只是写了支持FS模式和与HS容量一样大的FS ...

刚刚问了卖开发板的工程师,确定不支持,如果想用需要加PHY
回复

使用道具 举报

405

主题

0

好友

6551

积分

内部组员

Rank: 8Rank: 8

活跃会员 论坛元老

7#
发表于 2013-6-14 20:52:08 |只看该作者
ahwwq 发表于 2013-6-14 18:00
刚刚问了卖开发板的工程师,确定不支持,如果想用需要加PHY

问他有没有带外部phy,支持HS的开发板
回复

使用道具 举报

405

主题

0

好友

6551

积分

内部组员

Rank: 8Rank: 8

活跃会员 论坛元老

8#
发表于 2013-6-14 22:12:50 |只看该作者
Wjianw 发表于 2013-6-14 20:52
问他有没有带外部phy,支持HS的开发板

http://www.waveshare.net/Left_Co ... oard.htm#Open207V-C

这款开发板带HS PHY的模块
回复

使用道具 举报

405

主题

0

好友

6551

积分

内部组员

Rank: 8Rank: 8

活跃会员 论坛元老

9#
发表于 2013-6-14 22:22:10 |只看该作者
ahwwq 发表于 2013-6-14 18:00
刚刚问了卖开发板的工程师,确定不支持,如果想用需要加PHY

http://bbs.21ic.com/icview-256364-1-1.html
stm32F207的HS USB配什么PHY比较好

=============
我们之前也是很难找到这家公司的代理商网路上也几乎没这颗的资料和售价

当初我们寻找USB3300 like 的替换芯片时 我看到RN1133 是立敏电子(richnex)生产的
从网页上资料显示立敏电子是立锜科技的子公司  由于我们公司很多电源芯片是用立锜(richtek )
所以我就打电话到立锜(richtek ) 深圳办公室打听   

没几秒钟   接线小姐就帮我转给立敏电子的业务这才知道
喔~原来根本两家公司在同一间办公室

一接上线后  我们跟他业务抱怨这个问题要他算便宜一点
他也很爽快给了一个很满意价格  (不好意思我不能透漏  因为真的是特别便宜)

他们公司目前的业务好像换了一个叫 vincent chen 陈宇
你可以试着跟他连络   "重点是你要跟他要一个好价钱"

不然这个USB ULPI PHY 规格式公规寄存器每家都一样
每一家也都通过USB IF 认证可以选的厂牌这么多

光小弟我知道的就有
SMSC   : USB3300 ,USB3301,USB3311,USB3318,USB3341,USB3346,USB3320
cypress : CY7C68003
TI            : TUSB1211
NXP        : ISP1716A ISP1507A; ISP1507B SAF1508

如果品质和价钱不能满足  我们就用SMSC USB3300 好好的
根本也不用换了不是吗?   我们又不是闲着没事找事做
========================
回复

使用道具 举报

45

主题

0

好友

1639

积分

金牌会员

Rank: 6Rank: 6

10#
发表于 2013-7-22 07:56:01 |只看该作者
固件的修改:
usbd_hid_core.c文件与cdc一致,定义了一个HIDcallback结构体以及描述符的配置,但是官方HID中并未有DataOut部分,即没有接收数据的部分。并且描述符中只定义了一个IN的端点。
USBD_Class_cb_TypeDef  USBD_HID_cb = 
{
  USBD_HID_Init,
  USBD_HID_DeInit,
  USBD_HID_Setup,
  NULL, /*EP0_TxSent*/  
  NULL, /*EP0_RxReady*/
  USBD_HID_DataIn, /*DataIn*/
  USBD_HID_DataOut,//NULL, /*DataOut*/
  NULL, /*SOF */
  NULL,
  NULL,      
  USBD_HID_GetCfgDesc,
#ifdef USB_OTG_HS_CORE  
  USBD_HID_GetCfgDesc, /* use same config as per FS */
#endif  
};


因此,需要修改的为:1、增加一个OUT端点,修改相应的描述符。2、增加DataOut函数,处理接收来自PC的数据。

首先需要在__ALIGN_BEGIN static uint8_tUSBD_HID_CfgDesc[USB_HID_CONFIG_DESC_SIZ]最后增加OUT端点,与自带IN端点类似。
0x07,          /* bLength: Endpoint Descriptor size */
  USB_ENDPOINT_DESCRIPTOR_TYPE, /* bDescriptorType:  */  /*    Endpoint descriptor type */
  HID_OUT_EP,     /* bEndpointAddress: */        /*    Endpoint Address (OUT)   */
  0x03,          /* bmAttributes: Interrupt endpoint */
  HID_OUT_PACKET,//0x02,      /* wMaxPacketSize: 20 Bytes max  */
  0x00,
  0x0A,          /* bInterval: Polling Interval (16 ms) */
增加之后,需要相应修改数组的大小USB_HID_CONFIG_DESC_SIZ的值为41以及描述符内端点的个数为
0x02,         /*bNumEndpoints*/

uint8_t HID_MOUSE_ReportDesc[HID_MOUSE_REPORT_DESC_SIZE],该描述符描述的是PCHID之间的通信协议,具体可看HID的协议,我已在论坛对其说明http://210.45.78.50/bbs/forum.php?mod=redirect&goto=findpost&ptid=475&pid=1505&fromuid=5,这里需要其修改为(注意修改数组大小HID_MOUSE_REPORT_DESC_SIZE
_ALIGN_BEGIN static uint8_t HID_MOUSE_ReportDesc[HID_MOUSE_REPORT_DESC_SIZE] __ALIGN_END =
{
    0x05, 0x01, /* USAGE_PAGE (ST Page) */
    0x09, 0x02, /* USAGE (Demo Kit) */
    0xa1, 0x01, /* COLLECTION (Application) */
    // The Input report
    0x09,0x01, // USAGE ID - Vendor defined
    0x15,0x00, // LOGICAL_MINIMUM (0)
    0x26,0x00, 0xFF, // LOGICAL_MAXIMUM (255)
    0x75,0x08, // REPORT_SIZE (8)
    0x95,HID_IN_PACKET,
    0x81,0x02, // INPUT (Data,Var,Abs)
    // The Output report      
    0x09,0x04, // USAGE ID - Vendor defined
    0x15,0x00, // LOGICAL_MINIMUM (0)
    0x26,0x00,0xFF, // LOGICAL_MAXIMUM (255)
    0x75,0x08, // REPORT_SIZE (8)
    0x95,HID_OUT_PACKET, // REPORT_COUNT (64)
    0x91,0x02, // OUTPUT (Data,Var,Abs)
    
0xc0 /* END_COLLECTION */
}
然后是对HID_Init函数增加对OUT端点的初始化
/* Open EP OUT */
  DCD_EP_Open(pdev,
              HID_OUT_EP,
              HID_OUT_PACKET,
              USB_OTG_EP_INT);
  /* Prepare Out endpoint to receive next packet */
  DCD_EP_PrepareRx(pdev,
                   HID_OUT_EP,
                   (uint8_t*)(USB_Rx_Buffer),
                   HID_OUT_PACKET); 
最后是增加DataOUt函数
static uint8_t  USBD_HID_DataOut (void *pdev, uint8_t epnum)
{      
  uint16_t USB_Rx_Cnt,i;
 
  /* Get the received data buffer and update the counter */
  USB_Rx_Cnt = ((USB_OTG_CORE_HANDLE*)pdev)->dev.out_ep[epnum].xfer_count;
  /* USB data will be immediately processed, this allow next USB traffic being
     NAKed till the end of the application Xfer */
  /* Prepare Out endpoint to receive next packet */
  DCD_EP_PrepareRx(pdev,
                   HID_OUT_EP,
                   (uint8_t*)(USB_Rx_Buffer),
                   HID_OUT_PACKET);
  // DCD_EP_Tx ( pdev,HID_IN_EP, USB_Rx_Buffe ,USB_Rx_Cnt);//将数据返回
  return USBD_OK;
}

然后可以根据需要修改包的大小,FS最大为64,上位机发送数据或接收数据数组定义大小需加1,如下位机为64,上位机为65,增加的1字节为报告ID
#define HID_IN_PACKET                64//4
#define HID_OUT_PACKET              64//4


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

Archiver|手机版|Real Time Group

GMT+8, 2024-11-1 12:26 , Processed in 0.043046 second(s), 20 queries .

Powered by Discuz! X2.5

© 2001-2012 Comsenz Inc.

回顶部