STM32 USB设计原理
1.usb描述符配置
1.1设备描述符
const u8 Joystick_DeviceDescriptor[JOYSTICK_SIZ_DEVICE_DESC] =
{
}
设备描述符两个重要参数是生产商ID和产品ID,主机将根据以上两个ID为设备选择相应驱动程序。在我们的应用中,我们一般只需修改例子中的这儿两个参数即可完成设备描述符的设置。
1.2配置描述符
const u8 Joystick_ConfigDescriptor[JOYSTICK_SIZ_CONFIG_DESC] =
{
}
还有一些其他配置可以参可相关资料与例子加以理解。
2.USB通讯的执行过程。
SetEPType(ENDP1, EP_INTERRUPT);
SetEPRxAddr(ENDP1, ENDP1_RXADDR);
SetEPRxCount(ENDP1, 8);
SetEPType(ENDP1, EP_INTERRUPT);
SetEPTxAddr(ENDP1, ENDP1_TXADDR);
SetEPTxCount(ENDP1, 64);
SetEPTxStatus(ENDP1, EP_TX_NAK);
在定义完端点后,我们就可以使用端点进行数据传输了。
向主机输入数据(in):IN传输过程是
1.向缓冲区填入数据;
2.设定USB数据计数器:
3.设置USB输出有效。
XXX_send()
{
UserToPMABufferCopy(sendBuffer, ENDP1_TXADDR, 2);
SetEPTxValid(ENDP1);
}
注意一般情况下,端点的输入输出缓冲区地址没有定义,须在usb_conf.h中定义具体定义可以参考端点0的定义。
读从主机输出的数据(out):out传输过程是
1.定义out回调函数;
2.从缓冲区读出数据:
3.设置USB输入有效。
void EP1_OUT_Callback(void)
{
u8 DataLen;
DataLen = GetEPRxCount(ENDP1);
PMAToUserBufferCopy(rcvData, ENDP1_RXADDR, DataLen);
SetEPRxValid(ENDP1);
}
评论