我参考圈圈的书,在STM32USB库的基础上成功移植了USB键盘。
现在,我想更进一步,移植带鼠标功能的USB键盘(方法一)。
我先修改了一下PID,把圈圈51例程的报告描述符考到STM32工程里,
报告描述符大小修改为121。
然后,usb_prop.c的下面的函数改为如下:
void Joystick_Reset(void)
{
/* Set Joystick_DEVICE as not configured */
pInformation->Current_Configuration = 0;
pInformation->Current_Interface = 0;/*the default Interface*/
/* Current Feature initialization */
pInformation->Current_Feature = Joystick_ConfigDescriptor[7];
SetBTABLE(BTABLE_ADDRESS);
/* Initialize Endpoint 0 */
SetEPType(ENDP0, EP_CONTROL);
SetEPTxStatus(ENDP0, EP_TX_STALL);
SetEPRxAddr(ENDP0, ENDP0_RXADDR);
SetEPTxAddr(ENDP0, ENDP0_TXADDR);
Clear_Status_Out(ENDP0);
SetEPRxCount(ENDP0, Device_Property.MaxPacketSize);
SetEPRxValid(ENDP0);
/* Initialize Endpoint 1 */
SetEPType(ENDP1, EP_INTERRUPT);
SetEPTxAddr(ENDP1, ENDP1_TXADDR);
SetEPTxCount(ENDP1, 9);
//SetEPRxStatus(ENDP1, EP_RX_DIS);
SetEPTxStatus(ENDP1, EP_TX_NAK);
bDeviceState = ATTACHED;
/* Set this device to response on default address */
SetDeviceAddress(0);
}
发送键盘数据的函数如下:
void Task_USB_Scan(void *pdata)
{
u8 Buffer_Scan1[9] = {1, 0, 0, 0, 0, 0, 0, 0,0};
u8 press_status_1=0;
u8 press_status_8=0;
u8 chk_num1=3;
pdata= pdata;
while(1)
{
if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_13) == 0x00)
{
if(press_status_1==0)
{
press_status_1=1;
chk_num1=3;
while((Buffer_Scan1[chk_num1]!=0)&&(chk_num1<8))
{
chk_num1++;
}
Buffer_Scan1[chk_num1]=0x59; //KeyPad ----> number--7
//KeyBoard_Send(Buffer_Scan1,8);
//CoTickDelay(2);
UserToPMABufferCopy(Buffer_Scan1, GetEPTxAddr(ENDP1), 9); //?8???
/* enable endpoint for transmission */
SetEPTxValid(ENDP1);
}
}
else
{
if(press_status_1==1)
{
Buffer_Scan1[chk_num1]=0;
UserToPMABufferCopy(Buffer_Scan1, GetEPTxAddr(ENDP1), 9); //?8???
/* enable endpoint for transmission */
SetEPTxValid(ENDP1);
}
press_status_1=0;
}
}
}
在主程序里,我怕乱,只发送键盘数据,鼠标先不管,先把键盘调好再加鼠标。
程序如下:
int main(void)
{
unsigned int i;
#ifdef DEBUG
debug();
#endif
void *pdata;
Set_System();
USB_Interrupts_Config();
Set_USBClock();
uart1_init(115200);
USB_Init();
//Uart1_SendByte(0x55);
while (1)
{
// if ((JoyState() != 0) & (bDeviceState == CONFIGURED))
// {
// Joystick_Send(JoyState());
// }
Task_USB_Scan(pdata);
}
}
程序下到板子里,设备管理器里键盘和鼠标都出来了,如下图:
可是按下板子上的按键,本来打算在记事本里打出一个1的,可是什么也没有。
请问高手,问题出在哪里?谢谢!
|