首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

STM32 USB-HID通信移植步骤(2)

STM32 USB-HID通信移植步骤(2)

分别是“厂商字符”、“产品字符”、“产品序列号”,这些将在USB HID设备加载的时候显示。但是这需要这些字符要求为Unicode编码,你需要将你要显示的字符先转为Unicode编码。你可以到http://computer00.21ic.org/user1/2198/archives/2007/42769.html转换。最好大家还要根据各个数组的长度修改如下定义。


#define CUSTOMHID_SIZ_REPORT_DESC
39

#define CUSTOMHID_SIZ_STRING_VENDOR
64

#define CUSTOMHID_SIZ_STRING_PRODUCT
28

#define CUSTOMHID_SIZ_STRING_SERIAL
26







三、打开hw_config.c文件,将那些没有的函数删除,只保留如下函数
a)
Set_System(void)

b)
void Set_USBClock(void)

c)
void USB_Interrupts_Config(void)

d)
void USB_Cable_Config (FunctionalState NewState)

特别要注意最后一个函数,其主要作用是控制USB的上拉电阻,让电脑检测USB设备是否连接的。


四、打开stm32f10x_it.c文件,把EXTI15_10_IRQHandler等中断内的代码删除。
打开usb_prop.c文件,修改如下:
void CustomHID_Reset(void)
{

/* Set Joystick_DEVICE as not configured */


pInformation->Current_Configuration = 0;


pInformation->Current_Interface = 0;/*the default Interface*/


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, 64);


SetEPRxStatus(ENDP1, EP_RX_DIS);


SetEPTxStatus(ENDP1, EP_TX_NAK);




/* Initialize Endpoint 1 */


// SetEPType(ENDP1, EP_INTERRUPT);


SetEPRxAddr(ENDP1, ENDP1_RXADDR);


SetEPRxCount(ENDP1, 64);


// SetEPTxStatus(ENDP1, EP_TX_DIS);


SetEPRxStatus(ENDP1, EP_RX_VALID);


/* Set this device to response on default address */


SetDeviceAddress(0);

}
五、usb_endp.c文件


void EP1_OUT_Callback(void)
{

这些写接收代码
}




六、数据发送和接收,举例说明
1、数据接收
u8 DataLen;

DataLen = GetEPRxCount(ENDP1);


PMAToUserBufferCopy(TX1_buffer, ENDP1_RXADDR, DataLen);


SetEPRxValid(ENDP1);


USART1_Send(DataLen);


count_out = 1;





2、数据发送


UserToPMABufferCopy(InBuffer, GetEPTxAddr(ENDP1), 64);
SetEPTxCount(ENDP1, 64);

SetEPTxValid(ENDP1);


如果你发送数据较为频繁,每次发送前应使用GetEPTxStatus(ENDP1)检测上次发送是否完成。如果端点状态处于EP_TX_VALID,说明发送未结束,如果端点状态处于EP_TX_NAK,说明发送结束。
继承事业,薪火相传
返回列表