打印

请教下各位高手,stm32枚举成usb键盘可以接收数据吗?

[复制链接]
4928|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
xtvv|  楼主 | 2012-3-20 11:46 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
如题,要求枚举成键盘,这样发往上位机的数据可以直接写在文档里,这个已经做好了。同时,又要求可以上位机对键盘发送数据(数据量不大),我觉得也可以,但是今天研究下,接收不到。请教下高手,枚举成键盘后可以接收数据吗?可以的话,数据包最大是多少?512字节的缓冲区除掉寄存器和端点用掉的,就是允许的最大数据包吗?谢谢各位
沙发
yaoohui| | 2012-4-13 09:54 | 只看该作者
我现在遇到的状况是,STM32上的按键指示灯可以正常显示,但是从板子上给电脑发按键信息就出问题了,一直发,不停的发,查了查是说没有发按键释放的原因,你知道怎么发按键释放吗?

使用特权

评论回复
板凳
香水城| | 2012-4-13 10:05 | 只看该作者
作为USB键盘,只能接收几位的数据,这几位数据是用来点亮键盘上的指示灯,如大写锁定、数字键锁定等。

使用特权

评论回复
地板
yaoohui| | 2012-4-13 11:06 | 只看该作者
SetEPType(ENDP1, EP_INTERRUPT);   
  /* Initialize Endpoint 1 */
  SetEPTxAddr(ENDP1, ENDP1_TXADDR);
  SetEPTxCount(ENDP1, 8);           
  SetEPTxStatus(ENDP1, EP_TX_NAK);  
  /* Initialize Endpoint out 1 */
  SetEPRxAddr(ENDP1, ENDP1_RXADDR);
  SetEPRxCount(ENDP1, 1);           
  SetEPRxStatus(ENDP1, EP_RX_VALID);

发送8字节,接收1字节

请问版主我用官方的JoyStickMouse例子改成键盘后为什么按下一个键以后就一直发这个键值呢?按其他键也无效了,除非复位才能停。我发了这个键值后向缓冲区发0x00,也没有作用。怎么发释放按键呢?

使用特权

评论回复
5
yaoohui| | 2012-4-13 11:20 | 只看该作者
接收到的数据在EP1_OUT_Callback里处理,我这里的功能就是大写灯和键盘灯亮灭。
void EP1_OUT_Callback(void)
{
  u8 DataLen;
  u8 DataBuffer[64];
  
//  DataLen = GetEPRxCount(ENDP1);
//  PMAToUserBufferCopy(DataBuffer, ENDP1_RXADDR, DataLen);
//  SetEPRxValid(ENDP1);
  
  DataLen = USB_SIL_Read(EP1_OUT, DataBuffer);
  
  if(DataLen==1)
  {
    if(DataBuffer[0]&0x01)
    {
      GPIO_SetBits(GPIOA, GPIO_Pin_2);
    }
    else
    {
      GPIO_ResetBits(GPIOA, GPIO_Pin_2);
    }
    if(DataBuffer[0]&0x02)
    {
      GPIO_SetBits(GPIOA, GPIO_Pin_3);
    }
    else
    {
      GPIO_ResetBits(GPIOA, GPIO_Pin_3);
    }
  }
  SetEPRxStatus(ENDP1, EP_RX_VALID);
}

使用特权

评论回复
6
vigia| | 2012-4-13 11:24 | 只看该作者
SetEPType(ENDP1, EP_INTERRUPT);   
  /* Initialize Endpoint 1 */
  SetEPTxAddr(ENDP1, ENDP1_TXADDR);
  SetEPTxCount(ENDP1, 8);           
  SetEPTxStatus(ENDP1, EP_TX_NAK);  
  /* Initialize Endpoint ...
yaoohui 发表于 2012-4-13 11:06

键按下,需要发送键值,键松开,要发个0,告诉系统按键释放了。

使用特权

评论回复
7
yaoohui| | 2012-4-13 11:38 | 只看该作者
我想知道,在什么地方发送这个0 ,我试了好多地方都不行,下面是代码:
int main(void)
{
  Set_System();
  
  USB_Interrupts_Config();
  
  Set_USBClock();
  
  USB_Init();

  while (1)
  {
    if (bDeviceState == CONFIGURED)
    {
      if ((JoyState() != 0) && (PrevXferComplete))
      {
        Keyboard_Send(JoyState());
      }
    }
  }
}

uint8_t JoyState(void)
{
  /* "right" key is pressed */
  if (!STM_PBGetState(Button_RIGHT))
  {
    return JOY_RIGHT;
  }
  /* "left" key is pressed */
  if (!STM_PBGetState(Button_LEFT))
  {
    return JOY_LEFT;
  }
  /* "up" key is pressed */
  if (!STM_PBGetState(Button_UP))   
  {
    return JOY_UP;
  }
  /* "down" key is pressed */
  if (!STM_PBGetState(Button_DOWN))
  {
    return JOY_DOWN;
  }
  /* No key is pressed */
  else
  {
    return 0;
  }
}

void Keyboard_Send(uint8_t Keys)
{
  uint8_t Buffer[8] = {0, 0, 0, 0, 0, 0, 0, 0};
  uint8_t i=2;

  switch (Keys)
  {
    case JOY_LEFT:
      Buffer[i]=0x50;
      i++;
      break;
    case JOY_RIGHT:
      Buffer[i]=0x49;
      i++;
      break;
    case JOY_UP:
      Buffer[i]=0x52;
      i++;
      break;
    case JOY_DOWN:
      Buffer[i]=0x51;
      break;
    default:
      return;
  }

  /* Reset the control token to inform upper layer that a transfer is ongoing */
  PrevXferComplete = 0;
  
  /* Copy mouse position info in ENDP1 Tx Packet Memory Area*/
  USB_SIL_Write(EP1_IN, Buffer, 8);
  
  /* Enable endpoint for transmission */
  SetEPTxValid(ENDP1);
  
//  Buffer[0]=0;
//  Buffer[1]=0;
//  Buffer[2]=0;
//  Buffer[3]=0;
//  Buffer[4]=0;
//  Buffer[5]=0;
//  Buffer[6]=0;
//  Buffer[7]=0;
//  delay_ms(50);
//  USB_SIL_Write(EP1_IN, Buffer, 8);
//  SetEPTxValid(ENDP1);
}
请赐教!

使用特权

评论回复
8
vigia| | 2012-4-13 11:50 | 只看该作者
USB通信永远由主机发起,设备不能主动发送数据。

你上面的代码等于是先通知芯片要发一组数据,然后又告诉芯片,要发另一组数据,在这期间,如果USB主机一直没有要求数据,那么你的数据在发出去之前,就被另一组数据覆盖了。

所以正确的流程是发数据,等回调函数EP1_IN_Callback,这个回调函数说明前一次的数据已经被发送了,在这种情况下,你才能发下一组数据。

在任何情况下,USB传输都要遵循这个流程。

使用特权

评论回复
9
一般首席| | 2013-4-20 11:32 | 只看该作者
楼上牛X

使用特权

评论回复
10
hawksabre| | 2013-4-20 20:21 | 只看该作者
比较牛叉   楼主   谢谢你   谢谢你的共享   顶一个

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

16

帖子

1

粉丝