打印

求救电脑圈圈,还是没有成功啊

[复制链接]
2507|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
xueshizi|  楼主 | 2011-11-7 16:41 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
移植了圈圈及NTHQ2004的 USB键盘实验在STM32上。

按键测试的时候,发现了这样的问题:

打开一个word文档,定位光标。然后按下一个键“KEY”,结果发现文档一直持续不停的写入“G”。

应该是没有发送按键释放消息,在按键松开以后,键盘还应该发一个“对应按键位置数据清0”的消息。

请教如何发送“对应按键位置数据清0”的消息。谢谢!

圈圈回复:发一个全0的包

可是在哪里发?都快把芯片试验坏了.....

我贴一下代码,您可以详细些告诉我要在哪里增加吗?我不是很清楚USB数据发送流程。
mian函数中while(1)
{                  
    key=KEY_Scan(); //扫描一次键盘  
    if (key==1)  
    {
        Joystick_Send(1); //发送按键
    }
}

void Joystick_Send(u8 keys)
{
    u8 Buffer[8] = {0, 0, 0, 0, 0, 0, 0, 0};
    u8 i=2;     
    switch(keys)
        {
            case 1 : Buffer=c_usbKeyCode[10]; break;         //0x0a,   //key g
            default:                                 return;
        }         
    UserToPMABufferCopy(Buffer,GetEPTxAddr(ENDP1), 8);               
    SetEPTxValid(ENDP1);               
}

相关帖子

沙发
xueshizi|  楼主 | 2011-11-7 21:09 | 只看该作者
非常感谢圈圈!!按您的建议已经调试成功,但是电脑识别是时好时坏的,接下来我自己再看看。
等我调试好了再来这里写个总结报告吧...

使用特权

评论回复
板凳
xfcjava2| | 2011-11-9 21:28 | 只看该作者
请参考:
uint32_t USB_SIL_Write(uint8_t bEpAddr, uint8_t* pBufferPointer, uint32_t wBufferSize)
{
  /* Use the memory interface function to write to the selected endpoint */
  UserToPMABufferCopy(pBufferPointer, GetEPTxAddr(bEpAddr & 0x7F), wBufferSize);

  /* Update the data length in the control register */
  SetEPTxCount((bEpAddr & 0x7F), wBufferSize);
  return 0;
}

void KeyBoard_Send(u8 *buffer_out,u8  count)
{   
  USB_SIL_Write(EP1_IN, buffer_out, count);
  /* enable endpoint for transmission */   
  SetEPTxValid(ENDP1);  
}

void Joystick_Send(void)
{       
   u8 Buffer_Scan1[8] =  {0, 0, 0, 0,  0, 0, 0, 0};  
   u8 Buffer_Scan2[8] =  {0, 0, 0, 0,  0, 0, 0, 0};     

    Buffer_Scan1[2]=0x04;    //key----> number--A         
    KeyBoard_Send(Buffer_Scan1,8);                    
    KeyBoard_Send(Buffer_Scan2,8);           
}

使用特权

评论回复
地板
xfcjava2| | 2011-11-9 21:34 | 只看该作者
请参考:
void Keyboard_test1(void )
{       
     u8 Buffer_Scan1[8] =  {0, 0, 0, 0,  0, 0, 0, 0};  
     u8 Buffer_Scan2[8] =  {0, 0, 0, 0,  0, 0, 0, 0};  

      if(GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_7) == 0x00) //判断按键按下
      {                  
         Buffer_Scan1[2]=0x04;    //发送键码"A"         
        
         while(GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_7) == 0x00)//等待按键抬起
         {
            KeyBoard_Send(Buffer_Scan1,8);
            Delay(2);    //延时2ms
          }                        
         KeyBoard_Send(Buffer_Scan2,8);  //发送全0的包
         Delay(10);    //延时 10ms     
      }
}

使用特权

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

本版积分规则

0

主题

15

帖子

1

粉丝